java - 在具有相同密度的不同 Android 设备上不同的 throw (滑动)速度

标签 java android android-animation android-view android-gesture

我正在编写自己的图像查看器,使用户能够向左/向右滑动以查看下一张\上一张图像。我想根据 throw 速度对图像变化进行动画处理。

为了检测 throw 手势及其速度,我遵循了 basic gesture detection并按照公认的答案建议:

public class SelectFilterActivity extends Activity implements OnClickListener
{

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    private GestureDetector gestureDetector;
    View.OnTouchListener gestureListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /* ... */

        // Gesture detection
        gestureDetector = new GestureDetector(this, new MyGestureDetector());
        gestureListener = new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                return gestureDetector.onTouchEvent(event);
            }
        };

    }

    class MyGestureDetector extends SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
                // right to left swipe
                if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Toast.makeText(SelectFilterActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
                }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Toast.makeText(SelectFilterActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                // nothing
            }
            return false;
        }

    }

问题是对于具有相同密度的不同 Android 设备,我得到了不同的速度值(velocityX 和 velocityY)。基本上这意味着在一个设备上滑动感觉很慢且不敏感,而其他设备感觉太敏感了。

我认为这可能与设备上的“默认”最大速度有关,可以使用 -

ViewConfiguration.get(mContext).getScaledMaximumFlingVelocity()

相同密度的不同设备上的结果与预期的不一样:

    Samsung S I 480x800 density 1.5 Android 2.1
    getScaledMinimumFlingVelocity(): 75
    getScaledMaximumFlingVelocity(): 3600
    ViewConfiguration.MAXIMUM_FLING_VELOCITY = 4000

    HTC Desire 480x800 density 1.5 Android 2.3.3
    getScaledMinimumFlingVelocity(): 75
    getScaledMaximumFlingVelocity(): 6000
    ViewConfiguration.MAXIMUM_FLING_VELOCITY = 4000

    Samsung S III mini 480x800 density 1.5 Android 4.1
    getScaledMinimumFlingVelocity(): 75
    getScaledMaximumFlingVelocity(): 12000
    ViewConfiguration.MAXIMUM_FLING_VELOCITY = 8000

您还可以看到 ViewConfiguration MAXIMUM_FLING_VELOCITY 在 Android 4.0 及以上版本中有 2 个不同的值。

为什么具有相同密度和几乎相同 api 级别的不同设备没有相同的最大速度? 当用户做出滑动手势时,如何在不同设备上获得相同的体验? 我可以使用最大速度数据在所有 Android 设备上提供统一的体验吗?

最佳答案

我遇到了类似的问题。您可以将速度标准化为介于 0 和 1 之间的值,而不是直接使用 ViewConfiguration 中的最大和最小抛掷速度。

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    float maxFlingVelocity    = ViewConfiguration.get(mContext).getScaledMaximumFlingVelocity();
    float velocityPercentX    = velocityX / maxFlingVelocity;          // the percent is a value in the range of (0, 1]
    float normalizedVelocityX = velocityPercentX * PIXELS_PER_SECOND;  // where PIXELS_PER_SECOND is a device-independent measurement

换句话说,velocityPercentX 以百分比的形式为您提供 fling 的“功率”,而 normalizedVelocityX 是应用程序逻辑方面的速度(例如图像宽度(以与设备无关的像素为单位)。

关于java - 在具有相同密度的不同 Android 设备上不同的 throw (滑动)速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18812479/

相关文章:

java - 在启动时将位置发送到 Google 表单(如何在启动时运行 MainActivity)

android - 如何以正确的方式向日历添加日期

java - 幻灯片动画循环 Android

android - 我如何编写一个旋转的圆形动画,比如这个(附图)?安卓

android - 如何在 findNavController().navigate() 中发送带方向的导航器附加功能

java - 尝试加载 JRuby 脚本时出错

java - 单例模式在多线程环境中有什么问题吗?

java - 显示 Twitter 流时阻止 twitter4j 打印输出

java - 如何禁用另一个 Activity 中的按钮?

java - 尝试从 URL 读取文本时抛出异常