Android VelocityTracker的簡(jiǎn)單研究

原文:https://blog.csdn.net/uyy203/article/details/78926439

下面是Google對(duì)該類(lèi)的描述:

/** 
 * Helper for tracking the velocity of touch events, for implementing 
 * flinging and other such gestures.  Use {@link #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 {@link #addMovement(MotionEvent)}, 
 * and when you want to determine the velocity call 
 * {@link #computeCurrentVelocity(int)} and then {@link #getXVelocity()} 
 * and {@link #getXVelocity()}. 
 */  

簡(jiǎn)單翻譯下:
幫助你追蹤一個(gè)touch事件(flinging事件和其他手勢(shì)事件)的速率。當(dāng)你要跟蹤一個(gè)touch事件的時(shí)候,使用obtain()方法得到這個(gè)類(lèi)的實(shí)例甜攀,然后 用addMovement(MotionEvent)函數(shù)將你接受到的motion event加入到VelocityTracker類(lèi)實(shí)例中诅蝶。當(dāng)你使用到速率時(shí)偎蘸,使用computeCurrentVelocity(int)初始化速率的單位,并獲得當(dāng)前的事件的速率,然后使用getXVelocity() 或getXVelocity()獲得橫向和豎向的速率。

從上面的介紹中摆昧,我們就可以很簡(jiǎn)單的明白,如何去使用VelocityTracker類(lèi)去追蹤一個(gè)移動(dòng)事件的速率蜒程。

用法詳解:

1绅你、  //首先獲得VelocityTracker的實(shí)例  
            /** 
             * obtain()的方法介紹 
             * Retrieve a new VelocityTracker object to watch the velocity of a motion.  
             * Be sure to call recycle() when done. You should generally only maintain  
             * an active object while tracking a movement, so that the VelocityTracker  
             * can be re-used elsewhere. 
             * 翻譯: 
             * 得到一個(gè)速率追蹤者對(duì)象去檢測(cè)一個(gè)事件的速率。確認(rèn)在完成的時(shí)候調(diào)用recycle()方法昭躺。 
             * 一般情況下忌锯,你只要維持一個(gè)活動(dòng)的速率追蹤者對(duì)象去追蹤一個(gè)事件,那么窍仰,這個(gè)速率追蹤者 
             * 可以在別的地方重復(fù)使用汉规。 
             */  
            VelocityTracker mVelocityTracker = null;  
            if (mVelocityTracker == null) {  
                mVelocityTracker = VelocityTracker.obtain();  
            }  

        2礼殊、  //假設(shè)有一個(gè)事件event,將事件加入到VelocityTracker類(lèi)實(shí)例中   
        /** 
         * addMovement (MotionEvent event)方法介紹 
         * Add a user's movement to the tracker. You should call this for the initial  
         * ACTION_DOWN, the following ACTION_MOVE events that you receive, 
         *  and the final ACTION_UP. You can, however, call this for whichever events  
         *  you desire. 
         *  翻譯:向速率追蹤者中加入一個(gè)用戶(hù)的移動(dòng)事件驹吮,你應(yīng)該最先在ACTION_DOWN調(diào)用這個(gè)方法, 
         *  然后在你接受的ACTION_MOVE晶伦,最后是ACTION_UP碟狞。你可以為任何一個(gè)你愿意的事件調(diào)用該方法 
         */  
            mVelocityTracker.addMovement(event);  

        3、//判斷當(dāng)事件MotionEvent.ACTION_UP的時(shí)候婚陪,調(diào)用下面的方法  
        /** 
         * public void computeCurrentVelocity (int units, float maxVelocity)方法介紹: 
         * Compute the current velocity based on the points that have been 
         * collected. Only call this when you actually want to retrieve velocity 
         * information, as it is relatively expensive. You can then retrieve the 
         * velocity with {@link #getXVelocity()} and {@link #getYVelocity()}. 
         *  
         * @param units 
         *            The units you would like the velocity in. A value of 1 
         *            provides pixels per millisecond, 1000 provides pixels per 
         *            second, etc. 
         * @param maxVelocity 
         *            The maximum velocity that can be computed by this method. This 
         *            value must be declared in the same unit as the units 
         *            parameter. This value must be positive. 
         * 翻譯:基于你所收集到的點(diǎn)計(jì)算當(dāng)前的速率族沃。       當(dāng)你確定要獲得速率信息的時(shí)候,在調(diào)用該方法, 
         * 因?yàn)槭褂盟枰暮艽蟮男阅艽嘌汀H缓蟪?眨憧梢酝ㄟ^(guò)getXVelocity()和getYVelocity()獲得橫向和豎向的速率。 
         *  
         * 參數(shù):units  你想要指定的得到的速度單位盖溺,如果值為1漓糙,代表1毫秒運(yùn)動(dòng)了多少像素。如果值為1000烘嘱,代表 
         * 1秒內(nèi)運(yùn)動(dòng)了多少像素昆禽。 
         *  
         * 參數(shù):maxVelocity  該方法所能得到的最大速度,這個(gè)速度必須和你指定的units使用同樣的單位蝇庭,而且 
         * 必須是整數(shù)醉鳖。(也就是,你指定一個(gè)速度的最大值哮内,如果計(jì)算超過(guò)這個(gè)最大值盗棵,就使用這個(gè)最大值,否則北发,使用計(jì)算的的結(jié)果) 
         *  
         * public void computeCurrentVelocity (int units)方法介紹 
         * 這個(gè)方法與上面的方法沒(méi)什么差別漾根,就是在maxVelocity上,他會(huì)自動(dòng)使用Float.MAX_VALUE常量 
         */  
        mVelocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);     


        4鲫竞、//然后調(diào)用getXVelocity ()辐怕、getXVelocity (int id)、getYVelocity ()从绘、getYVelocity (int id)得到速率  
        /** 
         * 調(diào)用這幾個(gè)方法之前寄疏,必須確定你之前調(diào)用了computeCurrentVelocity方法。 
         * 參數(shù) id   代表返回指定觸點(diǎn)的速率 
         */  
        Log.i("test", mVelocityTracker.getXVelocity() + "");  
        Log.i("test", mVelocityTracker.getYVelocity() + "");  

在附上一個(gè)使用實(shí)例:

public class GestureTestActivity extends Activity {  
    private GestureDetector gestureDetector;  
    private VelocityTracker mVelocityTracker = null;  

    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        gestureDetector = new GestureDetector(this, new GestureListener());  
        gestureDetector.setIsLongpressEnabled(false);  
    }  

    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        int action = event.getAction();  
        if (mVelocityTracker == null) {  
            mVelocityTracker = VelocityTracker.obtain();  
        }  
        mVelocityTracker.addMovement(event);  
        switch (action) {  
        case MotionEvent.ACTION_DOWN:  
            Log.i("test", "ACTION_DOWN");  
            break;  

        case MotionEvent.ACTION_MOVE:// 移動(dòng)的時(shí)候  
            Log.i("test", "ACTION_MOVE");  
            break;  

        case MotionEvent.ACTION_UP:  
            mVelocityTracker.computeCurrentVelocity(1000);  
            Log.i("test", "ACTION_UP");  
            Log.i("11111", mVelocityTracker.getXVelocity(0) + "");  
            Log.i("11111", mVelocityTracker.getYVelocity(0) + "");  
            break;  
        }  
        return gestureDetector.onTouchEvent(event);  
    }  

    // 繼承于SimpleOnGestureListener僵井,實(shí)現(xiàn)所有事件監(jiān)聽(tīng)方法  
    private class GestureListener extends SimpleOnGestureListener {  
        @Override  
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {  
            Log.i("test", "onFling  -----------------------");  
            Log.i("2222", velocityX + "");  
            Log.i("2222", velocityY + "");  
            return super.onFling(e1, e2, velocityX, velocityY);  
        }  
    }  

    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        //釋放  
        mVelocityTracker.recycle();  
        mVelocityTracker=null;  
    }  
}  
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陕截,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子批什,更是在濱河造成了極大的恐慌农曲,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驻债,死亡現(xiàn)場(chǎng)離奇詭異乳规,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)合呐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)暮的,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人淌实,你說(shuō)我怎么就攤上這事冻辩〔螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵恨闪,是天一觀的道長(zhǎng)倘感。 經(jīng)常有香客問(wèn)我,道長(zhǎng)咙咽,這世上最難降的妖魔是什么侠仇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮犁珠,結(jié)果婚禮上逻炊,老公的妹妹穿的比我還像新娘。我一直安慰自己犁享,他們只是感情好余素,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著炊昆,像睡著了一般桨吊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凤巨,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天视乐,我揣著相機(jī)與錄音,去河邊找鬼敢茁。 笑死佑淀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彰檬。 我是一名探鬼主播伸刃,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逢倍!你這毒婦竟也來(lái)了捧颅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤较雕,失蹤者是張志新(化名)和其女友劉穎碉哑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體亮蒋,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扣典,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宛蚓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片激捏。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凄吏,靈堂內(nèi)的尸體忽然破棺而出远舅,到底是詐尸還是另有隱情,我是刑警寧澤痕钢,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布图柏,位于F島的核電站,受9級(jí)特大地震影響任连,放射性物質(zhì)發(fā)生泄漏蚤吹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一随抠、第九天 我趴在偏房一處隱蔽的房頂上張望裁着。 院中可真熱鬧,春花似錦拱她、人聲如沸二驰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)桶雀。三九已至,卻和暖如春唬复,著一層夾襖步出監(jiān)牢的瞬間矗积,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工敞咧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棘捣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓休建,卻偏偏與公主長(zhǎng)得像柱锹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丰包,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容