天天看點

View中TouchSlop,VelocityTracker,GestureDetector

TouchSlop

TouchSlop是系統所能識别出的被認為是滑動的最小距離,當手指在螢幕上的滑動距離小于這個值時,就認為不是滑動操作。該值是一個常量,和裝置有關。不用裝置上值可能是不同的。擷取方式為

int scaledTouchSlop = ViewConfiguration.get(getApplicationContext()).getScaledTouchSlop();
           

VelocityTracker

用于追蹤手指在滑動過程中的速度,包括水準和豎直方向的速度。

使用方法如下,在View的onTouchEvent方法中追蹤目前事件的速度

VelocityTracker velocityTracker = VelocityTracker.obtain();
        velocityTracker.addMovement(event);
        velocityTracker.computeCurrentVelocity(1000);
        int xVelocity = (int) velocityTracker.getXVelocity();
        int yVelocity = (int) velocityTracker.getYVelocity();
        Log.e(TAG, "onTouchEvent: xVelocity "+xVelocity+"   yVelocity"+yVelocity);
           

釋放及關閉

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

GestureDetector

手勢檢測,用于輔助檢測使用者的單機、長按、滑動、輕按兩下等行為。

GestureDetector.OnGestureListener

@Override
    public boolean onDown(MotionEvent e) {
        //手指按下螢幕的瞬間觸發 MotionEvent.ACTION_DOWN
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        //手指按下螢幕,沒有拖動和松開的狀态下  MotionEvent.ACTION_DOWN
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        //手指按下螢幕後松開,即觸發MotionEvent.ACTION_UP
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        //手指按下螢幕并拖動,觸發一個MotionEvent.ACTION_DOWN 和多個MotionEvent.ACTION_MOVE
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        //手指長按螢幕,并沒有松開的狀态
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        //手指按下螢幕,快速滑動後松開,觸發一個MotionEvent.ACTION_DOWN 和多個MotionEvent.ACTION_MOVE,
        //一個MotionEvent.ACTION_UP,即快速滑動行為
        return false;
    }
           

GestureDetector.OnDoubleTapListener

@Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        //嚴格的單機行為
        Log.e(TAG, "onSingleTapConfirmed: ");
        return false;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        //輕按兩下,由兩次連續的單機組成
        Log.e(TAG, "onDoubleTap: ");
        return false;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        //表示發生了輕按兩下行為
        Log.e(TAG, "onDoubleTapEvent: ");
        return false;
    }