1. 程式人生 > >Android View事件體系總結一

Android View事件體系總結一

什麼是View?

View是Android中所有控制元件的基類,是一種介面層的控制元件的一種抽象,它代表了一個控制元件。

View的位置引數

View的位置主要由它的四個頂點決定,分別對應View的四個屬性:top,left,right,bottom。其中top是左上角縱座標,left是左上角橫座標,right是右下角橫座標,bottom是右下角縱座標。值得注意的是,這些座標都是相對於View的父容器來說的。

View的寬 Width=right-left;

View的高 Height=bottom-top;

top,left,right,bottom的值,View中皆有相對的方法

Left = getLeft();

Top = getTop();

Right = getRight();

Bottom = getBottom();

Android 3.0之後,View增加了額外的引數:x,y,translationX,translationY,其中x和y是View左上角的座標,而translationX,translationY是View左上角相對於父容器的偏移量,這幾個引數也都是相對於父容器的。並且translationX,translationY的預設值為0(預設情況下無偏移)。

其中:

x = left + translationX;

y = right + translationY;

值得注意的是,View在平移過程中,top和left表示的是原始左上角的位置資訊,其值並不會發生改變,此時改變的僅有x,y,translationX,translationY這四個引數。

MotionEvent

View的點選事件,事件型別主要有如下幾種:

ACTION_DOWN : 手指剛接觸螢幕

ACTION_MOVE:手指在螢幕上移動

ACTION_UP : 手指從螢幕上鬆開的瞬間

通常情況下,手指在螢幕上的各種操作,主要考慮以下幾種情況:

點選螢幕操作:事件序列為 DOWM -> UP

手指在螢幕上滑動後鬆開:事件序列為 DOWN->MOVE ->....->MOVE->UP

在上述手指在螢幕上操作期間,如果我們想要獲取手指在螢幕上的位置資訊,系統通常提供了兩組方法:getX()/getY()和getRawX()和getRawY()。

區別很簡單:

getX()/getY()返回的是相對於當前View左上角的x/y座標。

getRawX/getRawY()返回的是相對於手機螢幕左上角的x/y座標。

TouchSlop

系統所能識別出被認為是滑動的最小距離。

換句話說,當手指在螢幕上滑動時,在手指按下(DOWN)與手指擡起(UP)兩個事件之間移動的距離小於這個常量,那麼系統就不認為你是在進行滑動操作,多數是認為點選操作。這個值一個常量,通常與裝置有關。

獲取常量方法:

        int scaledDoubleTapSlop = ViewConfiguration.get(getContext()).getScaledDoubleTapSlop();

當我們處理滑動是,可以利用這個常量來做一些過濾,比如當兩次滑動事件的滑動距離小於這個值,我們就認為未達到滑動距離的臨界值,因此我們就不認為它是滑動,這樣會有更好的使用者體驗。

VelocityTracker

速度追蹤,用於追蹤手指在螢幕上滑動過程中的速度,包括水平和豎直方向的速度。

        VelocityTracker velocityTracker = VelocityTracker.obtain();
        velocityTracker.computeCurrentVelocity(1000);
        float xVelocity = velocityTracker.getXVelocity();
        float yVelocity = velocityTracker.getYVelocity();

需要注意兩點:

其一:獲取速度前必須先計算,即必須先呼叫computeCurrentVelocity(int units)方法

其二:這裡獲取的速度是指單位時間內手指劃過的畫素數。比如設定1000ms,劃過的畫素為400畫素,那麼在一秒內平均速度就為400畫素。

最後,當不需要使用VelocityTracker物件時,需要呼叫clear方法來重置並回收記憶體;

 velocityTracker.clear();
 velocityTracker.recycle();

GestureDetector

手勢檢測,用於輔助檢測使用者的單擊,滑動,長按,雙擊等行為。

GestureDetector gestureDetector = new GestureDetector(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) {
                return false;
            }
        });

onDwon : 手指輕輕觸控式螢幕幕的一瞬間,由一個ACTION_DWON觸發。

onShowPress : 手指輕觸螢幕,尚未鬆開或滑動,由一個ACTION_DWON觸發。

注意:與onDwon的區別,它強調的是沒有鬆開或拖動的狀態。

onSingleTapUp : 手指從螢幕上鬆開,伴隨這一個ACTION_UP事件,這是單擊行為。

onScroll :手指按下螢幕並拖動,由一個ACTION_DWON,多個ACTION_MOVE觸發,屬於拖動行為。

onLongPress:手指長按螢幕不放。

onFling:手指按下螢幕,快速滑動後鬆開,由一個ACTION_DOWN,多個ACTION_MOVE,一個ACTION_UP觸發。

onDoubleTap:雙擊行為。由兩個單機行為組成,它不可能與onSingleTapConfirm共存。

onSingleTapConfirm :嚴格的單機行為。

注意:與onSingleTapUp的區別,如果觸發了onSingleTapConfirm,那麼後面不可能再緊跟這另一個單機行為。

onDoubleEvent:表示發生了雙擊行為。