最佳答案VelocityTracker - Android平台上的快速手势检测控件 简介 VelocityTracker是一个提供添加手势检测的Android工具,它的检测结果可以帮助我们确认被用户滑动屏幕的速度、加...
VelocityTracker - Android平台上的快速手势检测控件
简介
VelocityTracker是一个提供添加手势检测的Android工具,它的检测结果可以帮助我们确认被用户滑动屏幕的速度、加速度和方向。Android平台中已经内置了许多手势控件,如GestureDetector(手势探测器)用于检测单击动作,ScrollView用于滚动屏幕,但VelocityTracker只专注于快速手势的检测,使用起来非常简单。
VelocityTracker使用
在Android平台上使用VelocityTracker检测用户是否开始了一个快速的手势动作,需要做以下的准备工作:
- 在所需类的内部创建一个VelocityTracker的实例。
- 要跟踪MotionEvent,调用addMovement()和computeCurrentVelocity()方法。
- 根据需要在waitForRecycle()中停止跟踪并回收VelocityTracker实例。
在创建完成VelocityTracker之后,我们需要在onTouchEvent中调用addMovement()方法。此方法会将MotionEvent添加到VelocityTracker实例中,可以跟踪事件的速度。我们不必担心跟踪太多的事件,因为VelocityTracker只跟踪指定的事件(调用了addMovement()的事件)。假设一些onClick之类的事件,是不会被访问的,传递一个MotionEvent给VelocityTracker也是没有问题的,它们会被忽略。
实例
下面是使用VelocityTracker检测屏幕快速滑动的示例:
``` public class MainActivity extends AppCompatActivity implements View.OnTouchListener { // 偏移量 private float lastY; private View touchView; private VelocityTracker velocityTracker; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); touchView = findViewById(R.id.touch_view); touchView.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { float curY = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //获取手指落下的初始位置 lastY = curY; break; case MotionEvent.ACTION_MOVE: //计算偏移量 float dy = curY - lastY; //设置控件的垂直偏移量 touchView.setTranslationY(touchView.getTranslationY() + dy); //初始化VelocityTracker并添加MotionEvent if (velocityTracker == null) { velocityTracker = VelocityTracker.obtain(); } velocityTracker.addMovement(event); break; case MotionEvent.ACTION_UP: if (velocityTracker != null) { //计算出当前速度,速度的单位是每秒多少像素 velocityTracker.computeCurrentVelocity(1000); //获取在水平方向上的速度 float yVelocity = velocityTracker.getYVelocity(); //判断mLastY-mCurY,否则滑动没有意义 if (Math.abs(curY - lastY) > ViewConfiguration.get(this).getScaledTouchSlop()) { //向上滑动 if (yVelocity < 0) { ObjectAnimator animator = ObjectAnimator.ofFloat(touchView, \"translationY\", touchView.getTranslationY(), 0); animator.setDuration(500); animator.start(); } else {//向下滑动 ObjectAnimator animator = ObjectAnimator.ofFloat(touchView, \"translationY\", touchView.getTranslationY(), v.getHeight() - touchView.getHeight()); animator.setDuration(500); animator.start(); } } // 重置并回收velocityTracker velocityTracker.clear(); velocityTracker.recycle(); velocityTracker = null; } break; } return true; } } ```结论
VelocityTracker是一个典型的帮助我们优化用户体验的工具,可以让我们对用户所做手势的速度进行更细致的追踪。SpringBoard是一种非常好的使用VelocityTracker工具的场景,因为它允许我们获取启动应用并返回主屏幕时的速度,并允许在高度不同的设备上自由运行。此外,VelocityTracker不仅可以帮助我们优化用户体验,还可以帮助我们为客户提供一些更高级的交互基础模块。因此,我们需要从强调速度变化的视角来看待VelocityTracker,以确保更好地完成任务。