1. 程式人生 > >觸控事件onTouch

觸控事件onTouch

onTouchListener的return

返回false時

layout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN://手指按下
                        Log.d("MotionEvent","ACTION_DOWN");
                        break;
                    case MotionEvent.ACTION_MOVE://手指移動(從手指按下到擡起 move多次執行)
                        Log.d("MotionEvent","ACTION_MOVE");
                        break;
                    case MotionEvent.ACTION_UP://手指擡起
                        Log.d("MotionEvent","ACTION_UP");
                        break;
                }
                return false;
            }
        });

在這裡插入圖片描述

返回true時
在這裡插入圖片描述

通過日誌發現,為false的時候,只會執行down方法,不會執行move和up
只有在true的時候,三個都會執行

return true表示消費了觸控事件,onTouch之後才執行onClick,這裡被消費了,所以,相關的點選事件不會執行

onTouch和onClick
onClick 的過程是手指按下和擡起的過程(中間,手指抖動會產生移動),可以將onClick看做是一種特殊的onTouch。如果onTouch 沒有消費掉觸控事件(沒有return true),在onTouch後, 緊接著會執行onClick事件;如果onTouch消費掉了觸控事件(return true),後面將不會再執行onClick事件
需求較為複雜時,不僅需要touch事件也需要點選,甚至是長按事件,可以在onTouch中判斷要進行哪一種事件(根據觸控的時間,距離等來判斷)

獲取位置

使用event.getX();event.getY();來獲取位置(手指按下,移動或者是擡起時的位置)。通過位置來判斷手指滑動的方向
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
在左右滑動的過程中,需要對控制元件進行位置更改的,每一次更改位置,都需要保證將要移動到的位置需要在上面的x變化中,大於或者小於兩邊的邊界值時,就取邊界值

滑動事件和VelocityTracker 速度跟蹤

關於速度,速度是有方向的。向左(上)滑動所產生的速度是負數,向右(下)滑動所產生的速度是正數

什麼時候需要速度跟蹤?
根據使用者手指操作的速度來進行某些操作時,需要進行速度跟蹤。例如,對slidMenu的操作,手指可能並沒有滑動到顯示menu的一半(往顯示menu的方向進行滑動),但是,如果我滑動的速度很快,那麼此時還是應該顯示menu介面

思路

在VIew的onTouchEvent()中,當MotionEvent.ACTION_DOWN時初始化VelocityTracker, 在MotionEvent.ACTION_MOVE進行追蹤,當滑動停止之後(MotionEvent.ACTION_UP or MotionEvent.ACTION_CANCEL)不要忘記呼叫clear()來回收記憶體

VelocityTracker velocityTracker;
    int xVelocity = 0;
    int yVelocity = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_input_filter);

        layout = findViewById(R.id.layout);
        layout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        //初始化,VelocityTracker.obtain();獲取跟蹤類的例項
                        velocityTracker = VelocityTracker.obtain();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        //將當前事件新增到速度跟蹤類 進行速度的跟蹤
                        velocityTracker.addMovement(motionEvent);
                        /**
                         * 使用computeCurrentVelocity(int)初始化速率的單位,並獲得當前的事件的速率
                         * 設定units的值為1000,意思為一秒時間內運動了多少個畫素
                         */
                        velocityTracker.computeCurrentVelocity(1000);
                        ////獲取x軸方向的速度
                        xVelocity = (int) velocityTracker.getXVelocity();
                        //獲取x軸方向的速度
                        yVelocity = (int) velocityTracker.getYVelocity();
                        Log.d("MotionEvent","x軸速度:"+xVelocity);
                        Log.d("MotionEvent","y軸速度:"+yVelocity);
                        break;
                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_CANCEL:
                        //回收
                        velocityTracker.clear();
                        velocityTracker.recycle();
                        break;
                }
                return true;
            }
        });
    }

由以下兩篇文章整理

簡書 作者:AxeChen
連結:https://www.jianshu.com/p/29371bf70dff
CSDN 作者:彼岸花you
原文:https://blog.csdn.net/u012391876/article/details/54408804