Android VelocityTracker


public final class

VelocityTracker

extends   Object
java.lang.Object
   ↳ android.view.VelocityTracker

Class Overview


Helper for tracking the velocity of touch events, for implementing flinging and other such gestures. Use obtain() to retrieve a new instance of the class when you are going to begin tracking. Put the motion events you receive into it with addMovement(MotionEvent). When you want to determine the velocity call computeCurrentVelocity(int) and then call getXVelocity(int) and getYVelocity(int) to retrieve the velocity for each pointer id.

VelocityTracker从字面意思理解那就是速度追踪器了,在滑动效果的开发中通常都是要使用该类计算出当前手势的初始速度(不知道我这么理解是否正确,对应的方法是velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity))并通过getXVelocity或getYVelocity方法得到对应的速度值initialVelocity,并将获得的速度值传递给Scroller类的fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY) 方法进行控件滚动时各种位置坐标数值的计算,API中对fling 方法的解释是基于一个fling手势开始滑动动作,滑动的距离将由所获得的初始速度initialVelocity来决定。


测试例子:

public class MainActivity extends Activity {

	 private TextView mInfo;  
	  
	    private VelocityTracker mVelocityTracker;  
	    private int mMaxVelocity;  
	  
	    private int mPointerId;  
	  
	    @Override  
	    protected void onCreate(Bundle savedInstanceState) {  
	        super.onCreate(savedInstanceState);  
	  
	        mInfo = new TextView(this);  
	        mInfo.setLines(4);  
	        mInfo.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));  
	        mInfo.setTextColor(Color.BLACK);  
	  
	        setContentView(mInfo);  
	  
	        mMaxVelocity = ViewConfiguration.get(this).getScaledMaximumFlingVelocity();
	    }  
	  
	    @Override  
	    public boolean onTouchEvent(MotionEvent event) {  
	        final int action = event.getAction();  
	        acquireVelocityTracker(event);  
	        final VelocityTracker verTracker = mVelocityTracker;  
	        switch (action) {  
	            case MotionEvent.ACTION_DOWN:  
	                //求第一个触点的id, 此时可能有多个触点,但至少一个  
	                mPointerId = event.getPointerId(0);  
	                break;  
	  
	            case MotionEvent.ACTION_MOVE:  
	                //求伪瞬时速度  
	                verTracker.computeCurrentVelocity(1000, mMaxVelocity);  
	                final float velocityX = verTracker.getXVelocity(mPointerId);  
	                final float velocityY = verTracker.getYVelocity(mPointerId);  
	                recodeInfo(velocityX, velocityY);  
	                break;  
	  
	            case MotionEvent.ACTION_UP:  
	                releaseVelocityTracker();  
	                break;  
	  
	            case MotionEvent.ACTION_CANCEL:  
	                releaseVelocityTracker();  
	                break;  
	  
	            default:  
	                break;  
	        }  
	        return super.onTouchEvent(event);  
	    }  
	  
	    /**  
	     *  
	     * @param event 向VelocityTracker添加MotionEvent  
	     *  
	     * @see android.view.VelocityTracker#obtain()  
	     * @see android.view.VelocityTracker#addMovement(MotionEvent)  
	     */  
	    private void acquireVelocityTracker(final MotionEvent event) {  
	        if(null == mVelocityTracker) {  
	            mVelocityTracker = VelocityTracker.obtain();  
	        }  
	        mVelocityTracker.addMovement(event);  
	    }  
	  
	    /**  
	     * 释放VelocityTracker  
	     *  
	     * @see android.view.VelocityTracker#clear()  
	     * @see android.view.VelocityTracker#recycle()  
	     */  
	    private void releaseVelocityTracker() {  
	        if(null != mVelocityTracker) {  
	            mVelocityTracker.clear();  
	            mVelocityTracker.recycle();  
	            mVelocityTracker = null;  
	        }  
	    }  
	  
	    private static final String sFormatStr = "velocityX=%f\nvelocityY=%f";  
	  
	    /**  
	     * 记录当前速度  
	     *  
	     * @param velocityX x轴速度  
	     * @param velocityY y轴速度  
	     */  
	    private void recodeInfo(final float velocityX, final float velocityY) {  
	        final String info = String.format(sFormatStr, velocityX, velocityY);  
	        mInfo.setText(info);  
	    }  

}



VelocityTrackerAndroid 平台上的一个工具类,用于跟踪触摸事件的速度信息。它可以用来计算触摸事件的速度、加速度和方向等参数,以便于实现一些基于手势的操作,比如滑动、拖拽等。 要使用 VelocityTracker,首先需要创建一个实例,可以通过调用其构造函数来实现: ```java VelocityTracker velocityTracker = VelocityTracker.obtain(); ``` 然后,在触摸事件的处理方法中,可以使用 VelocityTracker 来追踪触摸事件的速度。以下是一个示例代码片段,展示了如何使用 VelocityTracker 追踪触摸事件的速度: ```java @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getActionMasked(); switch (action) { case MotionEvent.ACTION_DOWN: // 当手指按下时,重置 VelocityTracker velocityTracker.clear(); break; case MotionEvent.ACTION_MOVE: // 添加触摸事件到 VelocityTracker velocityTracker.addMovement(event); // 计算速度 velocityTracker.computeCurrentVelocity(1000); // 获取水平和垂直方向上的速度 float xVelocity = velocityTracker.getXVelocity(); float yVelocity = velocityTracker.getYVelocity(); // 在这里可以根据速度进行相应的操作 break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: // 当手指抬起或取消触摸时,回收 VelocityTracker velocityTracker.recycle(); break; } return true; } ``` 在上述代码中,我们可以看到,在手指移动的过程中,我们通过调用 `velocityTracker.addMovement(event)` 将触摸事件添加到 VelocityTracker 中,然后通过调用 `velocityTracker.computeCurrentVelocity(1000)` 计算当前的速度。最后,可以通过调用 `velocityTracker.getXVelocity()` 和 `velocityTracker.getYVelocity()` 获取水平和垂直方向上的速度。 需要注意的是,在触摸事件的处理方法中,我们需要在手指按下时清空 VelocityTracker,在手指抬起或取消触摸时回收 VelocityTracker,以确保准确地追踪速度信息。 这就是 VelocityTracker 的基本使用方法,希望能对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值