码迷,mamicode.com
首页 > 其他好文 > 详细

VelocityTracker简单用法

时间:2016-05-07 09:00:37      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

VelocityTracker顾名思义即速度跟踪,在android中主要应用于touch event(比如Gestures中的Fling, Scrolling等), VelocityTracker通过跟踪一连串事件实时计算出,下面简单介绍一下用法。

可参考:这篇文章的介绍

//获取一个VelocityTracker对象, 用完后记得回收  
//回收后代表你不需要使用了,系统将此对象在此分配到其他请求者  
static public VelocityTracker obtain();  
public void recycle();   
//计算当前速度, 其中units是单位表示, 1代表px/毫秒, 1000代表px/秒, ..  
//maxVelocity此次计算速度你想要的最大值  
public void computeCurrentVelocity(int units, float maxVelocity);  
//经过一次computeCurrentVelocity后你就可以用一下几个方法获取此次计算的值  
//id是touch event触摸点的ID, 来为多点触控标识,有这个标识在计算时可以忽略  
//其他触点干扰,当然干扰肯定是有的  
public float getXVelocity();  
public float getYVelocity();  
public float getXVelocity(int id);  
public float getYVelocity(int id); 
package com.github.c.horizonalscrollitem;
import android.app.Activity;  
import android.graphics.Color;  
import android.os.Bundle;  
import android.view.MotionEvent;  
import android.view.VelocityTracker;  
import android.view.ViewConfiguration;  
import android.view.ViewGroup.LayoutParams;  
import android.widget.TextView;  

public class VelocityTrackerTest 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.WHITE);  

        setContentView(mInfo);  
//      0.获得此次最大速率
        mMaxVelocity = ViewConfiguration.get(this).getMaximumFlingVelocity();  
    }  

    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        final int action = event.getAction();  
        acquireVelocityTracker(event);  //1.向VelocityTracker添加MotionEvent
        final VelocityTracker verTracker = mVelocityTracker;  
        switch (action) {  
            case MotionEvent.ACTION_DOWN:  
                //2.求第一个触点的id, 此时可能有多个触点,但至少一个
                mPointerId = event.getPointerId(0);  
                break;  

            case MotionEvent.ACTION_MOVE:  
                //3.求伪瞬时速度
                verTracker.computeCurrentVelocity(1000, mMaxVelocity);  
                final float velocityX = verTracker.getXVelocity(mPointerId);  
                final float velocityY = verTracker.getYVelocity(mPointerId);  
                recodeInfo(velocityX, velocityY);  
                break;  

            case MotionEvent.ACTION_UP:
//                4.ACTION_UP释放VelocityTracker,交给其他控件使用
                releaseVelocityTracker();  
                break;
//                5.ACTION_CANCEL释放VelocityTracker ,交给其他控件使用
            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);  
    }  
}  

VelocityTracker简单用法

标签:

原文地址:http://blog.csdn.net/android_study_ok/article/details/51331022

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!