VelocityTracker 測量手速的使用

android中測量手速的地方為數(shù)不少疾就,那么怎么獲得呢?api中提供了VelocityTracker類來追蹤我們在屏幕上的滑動速度强窖。我這里定義了一個自定義view泪姨,在自定義view中的onTouchEvent中游沿,獲得了一個 VelocityTracker的實例。在測量速度時肮砾,官方建議只使用一個實例

 if(velocityTracker==null){
      velocityTracker=VelocityTracker.obtain();
 }

當我們獲得了追蹤手速的實例后诀黍,就可以將觸摸事件添加到實例velocityTracker中,系統(tǒng)會為我們計算仗处。但是在添加之后眯勾,計算之前,我們需要設置一個時間段疆柔,用來告訴系統(tǒng)咒精,我們需要獲取的是多長時間段內(nèi)的速度。

velocityTracker.addMovement(event);
velocityTracker.computeCurrentVelocity(1000);

在設置時間段時旷档,使用的單位為ms毫秒模叙。接下來就可以分別獲取x坐標軸上,y坐標軸上的速度了

float xVelocity = velocityTracker.getXVelocity();
float yVelocity = velocityTracker.getYVelocity();

官方建議我們在不使用手速追蹤velocityTracker 的時候鞋屈,重置回收該類范咨,因此有了下面的代碼:

public void release(){
    if(velocityTracker!=null){
        velocityTracker.clear();
        velocityTracker.recycle();
        velocityTracker=null;
    }
}

下面放送這個自定義view的全部代碼:

public class VeloctiyView extends View{
    VelocityTracker velocityTracker;

    public VeloctiyView(Context context) {
        super(context);
        init(context);
    }

    private void init(Context context) {
//        setClickable(true);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(velocityTracker==null){
            velocityTracker=VelocityTracker.obtain();
        }
        velocityTracker.addMovement(event);
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.e("Vel","ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                Log.e("Vel","action_up");
                release();
                break;
            case MotionEvent.ACTION_MOVE:
                Log.e("Vel","ACTION_MOVE");

                velocityTracker.computeCurrentVelocity(1000);
                float xVelocity = velocityTracker.getXVelocity();
                float yVelocity = velocityTracker.getYVelocity();
                Log.e("Vel",String.format("velx--->%f,vely--->%f",xVelocity,yVelocity));
                break;
            case MotionEvent.ACTION_CANCEL:
                release();
                break;
        }
        // 如果這里使用了super.onTouchEvent(event),那么就只會觸發(fā)action_down厂庇。因為事件不會往下面?zhèn)鬟f渠啊,解決辦法,返回true权旷,或者調(diào)用setClickable(true),
        //實際上二者的效果是一樣的替蛉。
        return true;
    }

    public void release(){
        if(velocityTracker!=null){
            velocityTracker.clear();
            velocityTracker.recycle();
            velocityTracker=null;
        }
    }
}

在activity中通過代碼的形式創(chuàng)建自定義view,并加載到視圖中

VeloctiyView veloctiyView=new VeloctiyView(this);
veloctiyView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
veloctiyView.setBackgroundColor(Color.BLUE);
setContentView(veloctiyView);

打印效果如下:

05-09 00:07:04.988 7580-7580/com.xiaguangcheng.bindsconnectionpooldemo E/Vel: ACTION_DOWN
05-09 00:07:05.214 7580-7580/com.xiaguangcheng.bindsconnectionpooldemo E/Vel: ACTION_MOVE
05-09 00:07:05.215 7580-7580/com.xiaguangcheng.bindsconnectionpooldemo E/Vel: velx--->1938.670532,vely--->855.740784
05-09 00:07:05.230 7580-7580/com.xiaguangcheng.bindsconnectionpooldemo E/Vel: ACTION_MOVE
05-09 00:07:05.230 7580-7580/com.xiaguangcheng.bindsconnectionpooldemo E/Vel: velx--->3354.457764,vely--->2245.788818
05-09 00:07:05.247 7580-7580/com.xiaguangcheng.bindsconnectionpooldemo E/Vel: ACTION_MOVE
05-09 00:07:05.247 7580-7580/com.xiaguangcheng.bindsconnectionpooldemo E/Vel: velx--->2818.437500,vely--->2003.496094
05-09 00:07:05.266 7580-7580/com.xiaguangcheng.bindsconnectionpooldemo E/Vel: ACTION_MOVE
05-09 00:07:05.266 7580-7580/com.xiaguangcheng.bindsconnectionpooldemo E/Vel: velx--->2408.752930,vely--->1751.607788
05-09 00:07:05.281 7580-7580/com.xiaguangcheng.bindsconnectionpooldemo E/Vel: ACTION_MOVE

我們也可以使用GestureDetector來獲得速度拄氯,同樣是將觸摸事件交給GestureDetector類來處理躲查,我們只需要在回調(diào)中獲得就可以了

 @Override
    public boolean onTouchEvent(MotionEvent event) {
        gestureDetector.onTouchEvent(event);
        return true;
    }

    GestureDetector gestureDetector=new GestureDetector(getContext(), new GestureDetector.OnGestureListener() {
        @Override
        public boolean onDown(MotionEvent e) {
            return false;
        }

        @Override
        public void onShowPress(MotionEvent e) {

        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return false;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            return false;
        }

        @Override
        public void onLongPress(MotionEvent e) {

        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            Log.e("VELO","velx--->"+velocityX+";velY--->"+velocityY);

            return false;
        }
    });

打印效果如下:

05-09 01:22:02.864 11115-11115/com.xiaguangcheng.bindsconnectionpooldemo E/VELO: velx--->9634.49;velY--->-5575.902
05-09 01:22:07.231 11115-11115/com.xiaguangcheng.bindsconnectionpooldemo E/VELO: velx--->-13790.847;velY--->14729.759
05-09 01:22:10.449 11115-11115/com.xiaguangcheng.bindsconnectionpooldemo E/VELO: velx--->359.31744;velY--->-235.8771
05-09 01:22:14.373 11115-11115/com.xiaguangcheng.bindsconnectionpooldemo E/VELO: velx--->-7355.338;velY--->-3538.2659
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市译柏,隨后出現(xiàn)的幾起案子镣煮,更是在濱河造成了極大的恐慌,老刑警劉巖鄙麦,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件典唇,死亡現(xiàn)場離奇詭異镊折,居然都是意外死亡,警方通過查閱死者的電腦和手機介衔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門恨胚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夜牡,你說我怎么就攤上這事与纽÷虑” “怎么了塘装?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長影所。 經(jīng)常有香客問我蹦肴,道長,這世上最難降的妖魔是什么猴娩? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任阴幌,我火速辦了婚禮,結果婚禮上卷中,老公的妹妹穿的比我還像新娘矛双。我一直安慰自己,他們只是感情好蟆豫,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布议忽。 她就那樣靜靜地躺著,像睡著了一般十减。 火紅的嫁衣襯著肌膚如雪栈幸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天帮辟,我揣著相機與錄音速址,去河邊找鬼。 笑死由驹,一個胖子當著我的面吹牛芍锚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔓榄,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼并炮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了润樱?” 一聲冷哼從身側響起渣触,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壹若,沒想到半個月后嗅钻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皂冰,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年养篓,在試婚紗的時候發(fā)現(xiàn)自己被綠了秃流。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡柳弄,死狀恐怖舶胀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碧注,我是刑警寧澤嚣伐,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站萍丐,受9級特大地震影響轩端,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逝变,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一基茵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壳影,春花似錦拱层、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悠汽,卻和暖如春箱吕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柿冲。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工茬高, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人假抄。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓怎栽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宿饱。 傳聞我的和親對象是個殘疾皇子熏瞄,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

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