作者@恺风Wei

利用MotionEvent,我们可以获知手指在屏幕滑过的速度,因为可以或者位置,间隔时间。Android提供了VelocityTracker类,必须自己计算,可以直接获取。Velocity实际也是从MotionEvent中获取信息。

下面是一个例子,小例子很简单,一个LinearLayout,上面有一个TextView,用于显示速度信息。

Pro Android学习笔记(一四三):触摸屏(2):VelocityTracker_Android

例子代码如下:

public class TestVelocityActivity extends Activity{ 
    private TextView textView = null; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) {  
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.test_velocity_activity); 
         textView = (TextView)findViewById(R.id.vt_text); 
     } 

     private VelocityTracker vt = null;      
     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
         switch(event.getAction()){ 
         case MotionEvent.ACTION_DOWN: 
            //【1.1】通过静态消息VelocityTracker.obtain()获取对象
             if(vt == null){ 
                 vt = VelocityTracker.obtain(); 
             }else{ 
                 //【1.2】对于重用的vt,清空,回复初始状态 
                vt.clear(); 
             } 
             //【2】加入MotionEvent信息,这是获取的第一个event信息,速度为0。
            vt.addMovement(event); 
             break; 
             
         case MotionEvent.ACTION_MOVE:             //【2】加入MotionEvent的信息,获得第二个event信息,就可以有效计算速度
            vt.addMovement(event);             //【3】设置计算速度的单位 pixel/unit,unit为1,单位为pixels/ms,我们设置为1000,速度单位为pixels/s
             vt.computeCurrentVelocity(1000);  //1秒1 pixel 
            //【4】获取X方向和Y方向的速度,在调用getX|YVelocity()之前必须先执行computeCurrentVelocity()。
             textView.setText( "X速率为" + vt.getXVelocity()+ ",Y速度为" + vt.getYVelocity());
             break; 
             
        case MotionEvent.ACTION_UP: 
         case MotionEvent.ACTION_CANCEL: 
             /* 【5】回收,其他人可以用,我们将用在下一个动作。此外,我们不在ACTION_UP的时候计算,因为此时速度为0。
              * 如果我们在游戏中计算抛投物体的速度,通常是ACTION_MOVE的最后速度,不要在ACTION_UP中计算。 
              * VelocityTracker是比较费资源的,因此当我们不需要的使用就应该recycle(),运行其他人使用,虽然 
              * Android允许多个VelocityTracker,但这会消耗大量内存,因此不同应recycle(),并重复使用 */  
                vt.recycle();            
             break; 
             
         default: 
             break; 
         } 
         return super.onTouchEvent(event); 
     } 

 }

 

相关小例子代码:Pro Android学习:touch screen小例子