1. 程式人生 > >詳解Android View的事件體系 之View基礎(二)

詳解Android View的事件體系 之View基礎(二)

前言

掌握View的事件體系是Android 向高階邁向的必經之路,本片部落格講解Android View的相關基礎知識第二部分,後面我們會為大家講解View事件體系、View事件分發等知識內容。View相關知識第一部分https://blog.csdn.net/huangliniqng/article/details/83933241

1.View基礎

1.1 手勢檢測GestureDetector

首先我們看一下官方API對GestureDetector的介紹:

GestureDetector 可以檢測到使用者的點選、雙擊、長按等事件,該類為我們提供了三個介面和一個內部類。

名稱 作用
GestureDetector.OnContextClickListener 上下文單擊
GestureDetector.OnDoubleTapListener 雙擊
GestureDetector.OnGestureListener 檢測到手勢
GestureDetector.SimpleOnGestureListener 事件子集

 

1.1.1 GestureDetector.OnGestureListener

         首先我們和上篇部落格中提到的一樣,新建一個繼承自View的類,同時讓這個類實現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) {
    Log.d(TAG,"長按了");
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    return false;
}

通過   gestureDetector = new GestureDetector(this); 初始化gestureDetector,在View的OnTouchEvent事件中,交給gestureDetector來處理即,gestureDetector.onTouchEvent(event);這裡我們只看onLongPress方法,顧名思義就是長按時觸發的事件,我們在方法中列印Log,當我們的手指在View上長按之後列印日誌如下:

1.1.2 GestureDetector.OnDoubleTapListener

接著我們讓View實現GestureDetector.OnDoubleTapListener介面,我們可以看到該介面實現了下列方法:

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

@Override
public boolean onDoubleTap(MotionEvent e) {
    Log.d(Tag,"雙擊Tap");
    return false;
}

@Override
public boolean onDoubleTapEvent(MotionEvent e) {  
    Log.d(Tag,"雙擊TapEvent");
    return false;
}

既然是雙擊實現,那麼我們在這裡只關心onDoubleTapEvent和onDoubleTap方法,我們在上述兩個方法中列印日誌,我們在View上雙擊,列印日誌如下:

由此可知onDoubleTapEvent 是雙擊方法結束時呼叫,onDoubleTap是雙擊發生時第一次和第二次間隔時間所觸發的,如果只是單擊onDoubleTap不會觸發。

其實除了雙擊事件或者說包括雙擊事件,都是可以直接通過onTouchEvent()方法判斷出來的,開發時開發者可根據自己需求自己選擇。

1.2 VelocityTracker

       翻譯過來就是追蹤速度,可以判斷滑動的速度以及單擊的速度,首先我們獲取VelocityTracker物件velocityTracker = VelocityTracker.obtain();在View的onTouchEvent方法中新增:velocityTracker.addMovement(event);

首先要計算速度,計算速度傳入計算的時間差值,那麼求得的速度就是每畫素/時間差,比如我們計算在1S內的速度,程式碼如下:

velocityTracker.computeCurrentVelocity(1000);
int x = (int) velocityTracker.getXVelocity();
int y = (int) velocityTracker.getYVelocity();

x和y分別為一秒內在x軸滑過的畫素和一秒內在y軸滑過的畫素。

有view座標系可以知道,如果在x軸從右向左滑動,那麼計算出來的速度為負值。不適用的時候使用clear方法和recycle方法進行記憶體回收。

 

github:https://github.com/huanglinqing123

歡迎關注技術公眾號,微訊號搜尋ColorfulCode 程式碼男人

分享技術文章,投稿分享,不限技術種類,不限技術深度,讓更多人因為分享而受益。