【翻译】触摸手势-跟踪移动(Tracking Movement)

2017-06-19  本文已影响73人  reezy

https://developer.android.com/training/gestures/movement.html

跟踪移动(Tracking Movement)

当触摸点位置,压力或尺寸发生变化时,会触发一个新的 MotionEvent.ACTION_MOVE 事件。

因为基于手指的触摸并不总是最精确的交互形式,因此检测触摸事件通常更多地基于移动而不是简单的接触。 为了帮助应用程序区分基于移动的手势(例如swipe)和非移动手势(例如single tap),Android包括“touch slop”的概念。 “touch slop”是指用户的触摸可以在手势被解释为基于运动的手势之前漫游的距离(以像素为单位)。 有关此主题的更多讨论,请参阅管理ViewGroup中的触摸事件。

根据您的应用需求,有几种不同的方式来跟踪手势中的移动。 例如:

跟踪速度(Track Velocity)

你可以有一个基于运动的手势,它只是基于指针行进的 距离 和/或 方向。
但速度通常是跟踪手势特征或甚至决定手势是否发生的决定性因素。 为了使速度计算更容易,Android在支持库中提供VelocityTracker类和VelocityTrackerCompat类。
VelocityTracker可以帮助您跟踪触摸事件的速度。
这对于速度是手势的标准的一部分的手势(例如fling)是有用的。

以下是一个简单的示例,说明VelocityTracker API中方法的用途:

public class MainActivity extends Activity {
    private static final String DEBUG_TAG = "Velocity";
        ...
    private VelocityTracker mVelocityTracker = null;
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int index = event.getActionIndex();
        int action = event.getActionMasked();
        int pointerId = event.getPointerId(index);

        switch(action) {
            case MotionEvent.ACTION_DOWN:
                if(mVelocityTracker == null) {
                    // Retrieve a new VelocityTracker object to watch the velocity of a motion.
                    mVelocityTracker = VelocityTracker.obtain();
                }
                else {
                    // Reset the velocity tracker back to its initial state.
                    mVelocityTracker.clear();
                }
                // Add a user's movement to the tracker.
                mVelocityTracker.addMovement(event);
                break;
            case MotionEvent.ACTION_MOVE:
                mVelocityTracker.addMovement(event);
                // When you want to determine the velocity, call
                // computeCurrentVelocity(). Then call getXVelocity()
                // and getYVelocity() to retrieve the velocity for each pointer ID.
                mVelocityTracker.computeCurrentVelocity(1000);
                // Log velocity of pixels per second
                // Best practice to use VelocityTrackerCompat where possible.
                Log.d("", "X velocity: " + VelocityTrackerCompat.getXVelocity(mVelocityTracker,  pointerId));
                Log.d("", "Y velocity: " + VelocityTrackerCompat.getYVelocity(mVelocityTracker, pointerId));
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                // Return a VelocityTracker object back to be re-used by others.
                mVelocityTracker.recycle();
                break;
        }
        return true;
    }
}

注意:在ACTION_UP之后,X和Y速度将为0,您应该在ACTION_MOVE事件之后计算速度。

上一篇下一篇

猜你喜欢

热点阅读