Carson帶你學Android :那些你一定要學會的手勢識別應用GestureDetector(含實例講解)

前言

  • 手勢識別在Android開發(fā)的應用非常常見
  • 今天carson將詳細給大家講解Android手勢識別類:GestureDetector類的使用痢艺。(含實例講解)

目錄


簡介

下面撤嫩,我將結合實例望几,詳細介紹GestureDetector的使用接口 & 使用類牢酵。


接口1:OnGestureListener

1. 作用

檢測用戶在屏幕的以下操作:按下瞬間、按壓默蚌、長按母剥、輕擊、快速滑屏茵烈、拖動

2. 使用步驟

// 步驟1:創(chuàng)建手勢檢測器實例 & 傳入OnGestureListener接口(需要復寫對應方法)
// 構造函數(shù)有3個百匆,常用的是第二個
// 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
// 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
// 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
    GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {

        // 1. 用戶輕觸觸摸屏
        public boolean onDown(MotionEvent e) {
            Log.i("MyGesture", "onDown");
            return false;
        }

        // 2. 用戶輕觸觸摸屏,尚未松開或拖動
        // 與onDown()的區(qū)別:無松開 / 拖動
        // 即:當用戶點擊的時呜投,onDown()就會執(zhí)行加匈,在按下的瞬間沒有松開 / 拖動時onShowPress就會執(zhí)行
        public void onShowPress(MotionEvent e) {
            Log.i("MyGesture", "onShowPress");
        }

        // 3. 用戶長按觸摸屏
        public void onLongPress(MotionEvent e) {
            Log.i("MyGesture", "onLongPress");
        }

        // 4. 用戶輕擊屏幕后抬起
        public boolean onSingleTapUp(MotionEvent e) {
            Log.i("MyGesture", "onSingleTapUp");
            return true;
        }

        // 5. 用戶按下觸摸屏 & 拖動
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                float distanceX, float distanceY) {
            Log.i("MyGesture", "onScroll:");
            return true;
        }

        // 6. 用戶按下觸摸屏、快速移動后松開
        // 參數(shù):
        // e1:第1個ACTION_DOWN MotionEvent
        // e2:最后一個ACTION_MOVE MotionEvent
        // velocityX:X軸上的移動速度仑荐,像素/秒
        // velocityY:Y軸上的移動速度雕拼,像素/秒
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                               float velocityY) {
            Log.i("MyGesture", "onFling");
            return true;
        }

    });

// 步驟2-1:讓某個View檢測手勢 - 重寫View的onTouch函數(shù),將View的觸屏事件交給GestureDetector處理粘招,從而對用戶手勢作出響應
    View.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            mGestureDetector.onTouchEvent(event);
            return true; // 注:返回true才能完整接收觸摸事件
        }
    });

// 步驟2-2:讓某個Activity檢測手勢:重寫Activity的dispatchTouchEvent函數(shù)啥寇,將觸屏事件交給GestureDetector處理,從而對用戶手勢作出響應
  @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        mGestureDetector.onTouchEvent(ev); // 讓GestureDetector響應觸碰事件
        super.dispatchTouchEvent(ev); // 讓Activity響應觸碰事件
        return false;
    }

3. 實例說明

現(xiàn)在對一個TextView進行手勢檢測
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    >

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="600dp"
        android:text="carson_ho Test"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    TextView mTextView;
    GestureDetector mGestureDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 步驟1:創(chuàng)建手勢檢測器實例 & 傳入OnGestureListener接口(需要復寫對應方法)
        mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {

            // 1. 用戶輕觸觸摸屏
            public boolean onDown(MotionEvent e) {
                Log.i("MyGesture", "onDown");
                return false;
            }

            // 2. 用戶輕觸觸摸屏洒扎,尚未松開或拖動
            // 與onDown()的區(qū)別:無松開 / 拖動
            // 即:當用戶點擊的時辑甜,onDown()就會執(zhí)行,在按下的瞬間沒有松開 / 拖動時onShowPress就會執(zhí)行
            public void onShowPress(MotionEvent e) {
                Log.i("MyGesture", "onShowPress");
            }

            // 3. 用戶長按觸摸屏
            public void onLongPress(MotionEvent e) {
                Log.i("MyGesture", "onLongPress");
            }

            // 4. 用戶輕擊屏幕后抬起
            public boolean onSingleTapUp(MotionEvent e) {
                Log.i("MyGesture", "onSingleTapUp");
                return true;
            }

            // 5. 用戶按下觸摸屏 & 拖動
            public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                    float distanceX, float distanceY) {
                Log.i("MyGesture", "onScroll:");
                return true;
            }

            // 6. 用戶按下觸摸屏逊笆、快速移動后松開
            // 參數(shù):
            // e1:第1個ACTION_DOWN MotionEvent
            // e2:最后一個ACTION_MOVE MotionEvent
            // velocityX:X軸上的移動速度栈戳,像素/秒
            // velocityY:Y軸上的移動速度,像素/秒
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                                   float velocityY) {
                Log.i("MyGesture", "onFling");
                return true;
            }

        });

        // 步驟2:讓TextView檢測手勢:重寫View的onTouch函數(shù)难裆,將觸屏事件交給GestureDetector處理子檀,從而對用戶手勢作出響應
        mTextView = (TextView) findViewById(R.id.textView);
        mTextView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mGestureDetector.onTouchEvent(event);
                return false;
            }
        });
    }
}

4. 示意圖

我在屏幕作出一系列手勢進行測試


接口2:OnDoubleTapListener

1. 作用

檢測用戶單擊、雙擊屏幕

2. 使用步驟

// 步驟1:創(chuàng)建手勢檢測器實例
    // 注:使用OnDoubleTapListener接口時乃戈,需要使用GestureDetector褂痰,而GestureDetector的創(chuàng)建則必須傳入OnGestureListener接口
    // 所以在使用OnDoubleTapListener接口時,也必須實現(xiàn)OnGestureListener接口
    // 構造函數(shù)有3個症虑,常用的是第二個
    // 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
    // 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
    // 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
        GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {

            // 1. 用戶輕觸觸摸屏
            public boolean onDown(MotionEvent e) {
                Log.i("MyGesture", "onDown");
                return false;
            }

            // 2. 用戶輕觸觸摸屏缩歪,尚未松開或拖動
            // 與onDown()的區(qū)別:無松開 / 拖動
            // 即:當用戶點擊的時,onDown()就會執(zhí)行谍憔,在按下的瞬間沒有松開 / 拖動時onShowPress就會執(zhí)行
            public void onShowPress(MotionEvent e) {
                Log.i("MyGesture", "onShowPress");
            }

            // 3. 用戶長按觸摸屏
            public void onLongPress(MotionEvent e) {
                Log.i("MyGesture", "onLongPress");
            }

            // 4. 用戶輕擊屏幕后抬起
            public boolean onSingleTapUp(MotionEvent e) {
                Log.i("MyGesture", "onSingleTapUp");
                return true;
            }

            // 5. 用戶按下觸摸屏 & 拖動
            public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                    float distanceX, float distanceY) {
                Log.i("MyGesture", "onScroll:");
                return true;
            }

            // 6. 用戶按下觸摸屏匪蝙、快速移動后松開
            // 參數(shù):
            // e1:第1個ACTION_DOWN MotionEvent
            // e2:最后一個ACTION_MOVE MotionEvent
            // velocityX:X軸上的移動速度,像素/秒
            // velocityY:Y軸上的移動速度习贫,像素/秒
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                                   float velocityY) {
                Log.i("MyGesture", "onFling");
                return true;
            }

        });

// 步驟2:創(chuàng)建 & 設置OnDoubleTapListener接口實現(xiàn)類
    mGestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {

        // 1. 單擊事件
        // 關于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的區(qū)別
        // onSingleTapConfirmed:再次點擊(即雙擊)逛球,則不會執(zhí)行
        // onSingleTapUp:手抬起就會執(zhí)行
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.i("MyGesture", "onSingleTapConfirmed");
            return false;
        }

        // 2. 雙擊事件
        public boolean onDoubleTap(MotionEvent e) {
            Log.i("MyGesture", "onDoubleTap");
            return false;
        }
        // 3. 雙擊間隔中發(fā)生的動作
        // 指觸發(fā)onDoubleTap后,在雙擊之間發(fā)生的其它動作苫昌,包含down颤绕、up和move事件;
        public boolean onDoubleTapEvent(MotionEvent e) {
            Log.i("MyGesture", "onDoubleTapEvent");
            return false;
        }
    });

// 步驟3-1:讓某個View檢測手勢 - 重寫View的onTouch函數(shù),將View的觸屏事件交給GestureDetector處理奥务,從而對用戶手勢作出響應
    View.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            mGestureDetector.onTouchEvent(event);
            return true; // 注:返回true才能完整接收觸摸事件
        }
    });

// 步驟3-2:讓某個Activity檢測手勢:重寫Activity的dispatchTouchEvent函數(shù)物独,將觸屏事件交給GestureDetector處理,從而對用戶手勢作出響應
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        mGestureDetector.onTouchEvent(ev); // 讓GestureDetector響應觸碰事件
        super.dispatchTouchEvent(ev); // 讓Activity響應觸碰事件
        return false;
    }

3. 實例說明

現(xiàn)在對一個TextView進行手勢檢測
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    >

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="600dp"
        android:text="carson_ho Test"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    TextView mTextView;
    GestureDetector mGestureDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 步驟1:創(chuàng)建手勢檢測器實例 & 傳入OnGestureListener接口(需要復寫對應方法)
        mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {

            // 1. 用戶輕觸觸摸屏
            public boolean onDown(MotionEvent e) {
                Log.i("MyGesture1", "onDown");
                return false;
            }

            // 2. 用戶輕觸觸摸屏氯葬,尚未松開或拖動
            // 與onDown()的區(qū)別:無松開 / 拖動
            // 即:當用戶點擊的時挡篓,onDown()就會執(zhí)行,在按下的瞬間沒有松開 / 拖動時onShowPress就會執(zhí)行
            public void onShowPress(MotionEvent e) {
                Log.i("MyGesture", "onShowPress");
            }

            // 3. 用戶長按觸摸屏
            public void onLongPress(MotionEvent e) {
                Log.i("MyGesture", "onLongPress");
            }

            // 4. 用戶輕擊屏幕后抬起
            public boolean onSingleTapUp(MotionEvent e) {
                Log.i("MyGesture", "onSingleTapUp");
                return true;
            }

            // 5. 用戶按下觸摸屏 & 拖動
            public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                    float distanceX, float distanceY) {
                Log.i("MyGesture", "onScroll:");
                return true;
            }

            // 6. 用戶按下觸摸屏溢谤、快速移動后松開
            // 參數(shù):
            // e1:第1個ACTION_DOWN MotionEvent
            // e2:最后一個ACTION_MOVE MotionEvent
            // velocityX:X軸上的移動速度瞻凤,像素/秒
            // velocityY:Y軸上的移動速度,像素/秒
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                                   float velocityY) {
                Log.i("MyGesture", "onFling");
                return true;
            }

        });

        // 步驟2:創(chuàng)建 & 設置OnDoubleTapListener接口實現(xiàn)類
        mGestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {

            // 1. 單擊事件
            // 關于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的區(qū)別
            // onSingleTapConfirmed:再次點擊(即雙擊)世杀,則不會執(zhí)行
            // onSingleTapUp:手抬起就會執(zhí)行
            public boolean onSingleTapConfirmed(MotionEvent e) {
                Log.i("MyGesture", "onSingleTapConfirmed");
                return false;
            }

            // 2. 雙擊事件
            public boolean onDoubleTap(MotionEvent e) {
                Log.i("MyGesture", "onDoubleTap");
                return false;
            }
            // 3. 雙擊間隔中發(fā)生的動作
            // 指觸發(fā)onDoubleTap后阀参,在雙擊之間發(fā)生的其它動作,包含down瞻坝、up和move事件蛛壳;
            public boolean onDoubleTapEvent(MotionEvent e) {
                Log.i("MyGesture", "onDoubleTapEvent");
                return false;
            }
        });

        // 步驟3:重寫View的onTouch函數(shù),將觸屏事件交給GestureDetector處理所刀,從而對用戶手勢作出響應
        mTextView = (TextView) findViewById(R.id.textView);

        mTextView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mGestureDetector.onTouchEvent(event);
                return true;
            }
        });
    }
}

4. 測試效果

日志效果如下



使用類:SimpleOnGestureListener

1. 作用

集成了兩個接口的手勢檢測功能

2. 與上述兩個接口的區(qū)別

  • OnGestureListener和OnDoubleTapListener接口里的函數(shù)都是強制必須重寫的
  • 而SimpleOnGestureListener類的函數(shù)則可根據(jù)需要選擇性復寫衙荐,因為SimpleOnGestureListener類本身已經(jīng)實現(xiàn)了這兩個接口的所有函數(shù),只是里面全是空的而已

3. 使用步驟

// 步驟1:創(chuàng)建手勢檢測器實例
    // 構造函數(shù)有3個浮创,此處用的是第三個
    // 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
    // 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
    // 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
    GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {

        // OnGestureListener接口的函數(shù)
        // 1. 用戶輕觸觸摸屏
        public boolean onDown(MotionEvent e) {
            Log.i("MyGesture1", "onDown");
            return false;
        }

        // 2. 用戶輕觸觸摸屏忧吟,尚未松開或拖動
        // 與onDown()的區(qū)別:無松開 / 拖動
        // 即:當用戶點擊的時,onDown()就會執(zhí)行斩披,在按下的瞬間沒有松開 / 拖動時onShowPress就會執(zhí)行
        public void onShowPress(MotionEvent e) {
            Log.i("MyGesture", "onShowPress");
        }

        // 3. 用戶長按觸摸屏
        public void onLongPress(MotionEvent e) {
            Log.i("MyGesture", "onLongPress");
        }

        // 4. 用戶輕擊屏幕后抬起
        public boolean onSingleTapUp(MotionEvent e) {
            Log.i("MyGesture", "onSingleTapUp");
            return true;
        }

        // 5. 用戶按下觸摸屏 & 拖動
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                float distanceX, float distanceY) {
            Log.i("MyGesture", "onScroll:");
            return true;
        }

        // 6. 用戶按下觸摸屏溜族、快速移動后松開
        // 參數(shù):
        // e1:第1個ACTION_DOWN MotionEvent
        // e2:最后一個ACTION_MOVE MotionEvent
        // velocityX:X軸上的移動速度,像素/秒
        // velocityY:Y軸上的移動速度垦沉,像素/秒
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                               float velocityY) {
            Log.i("MyGesture", "onFling");
            return true;
        }

        // OnDoubleTapListener的函數(shù)
        // 1. 單擊事件
        // 關于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的區(qū)別
        // onSingleTapConfirmed:再次點擊(即雙擊)煌抒,則不會執(zhí)行
        // onSingleTapUp:手抬起就會執(zhí)行
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.i("MyGesture", "onSingleTapConfirmed");
            return false;
        }

        // 2. 雙擊事件
        public boolean onDoubleTap(MotionEvent e) {
            Log.i("MyGesture", "onDoubleTap");
            return false;
        }
        // 3. 雙擊間隔中發(fā)生的動作
        // 指觸發(fā)onDoubleTap后,在雙擊之間發(fā)生的其它動作厕倍,包含down寡壮、up和move事件;
        public boolean onDoubleTapEvent(MotionEvent e) {
            Log.i("MyGesture", "onDoubleTapEvent");
            return false;
        }
    });

// 步驟2-1:讓某個View檢測手勢 - 重寫View的onTouch函數(shù)讹弯,將View的觸屏事件交給GestureDetector處理况既,從而對用戶手勢作出響應
    View.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            mGestureDetector.onTouchEvent(event);
            return true; // 注:返回true才能完整接收觸摸事件
        }
    });

// 步驟2-2:讓某個Activity檢測手勢:重寫Activity的dispatchTouchEvent函數(shù),將觸屏事件交給GestureDetector處理组民,從而對用戶手勢作出響應
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        mGestureDetector.onTouchEvent(ev); // 讓GestureDetector響應觸碰事件
        super.dispatchTouchEvent(ev); // 讓Activity響應觸碰事件
        return false;
    }

4. 實例說明

現(xiàn)在對一個TextView進行手勢檢測
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    >

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="600dp"
        android:text="carson_ho Test"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    TextView mTextView;
    GestureDetector mGestureDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 步驟1:創(chuàng)建手勢檢測器實例 & 傳入OnGestureListener接口(需要復寫對應方法)
        mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {

            // OnGestureListener接口的函數(shù)
            // 1. 用戶輕觸觸摸屏
            public boolean onDown(MotionEvent e) {
                Log.i("MyGesture1", "onDown");
                return false;
            }

            // 2. 用戶輕觸觸摸屏棒仍,尚未松開或拖動
            // 與onDown()的區(qū)別:無松開 / 拖動
            // 即:當用戶點擊的時,onDown()就會執(zhí)行邪乍,在按下的瞬間沒有松開 / 拖動時onShowPress就會執(zhí)行
            public void onShowPress(MotionEvent e) {
                Log.i("MyGesture", "onShowPress");
            }

            // 3. 用戶長按觸摸屏
            public void onLongPress(MotionEvent e) {
                Log.i("MyGesture", "onLongPress");
            }

            // 4. 用戶輕擊屏幕后抬起
            public boolean onSingleTapUp(MotionEvent e) {
                Log.i("MyGesture", "onSingleTapUp");
                return true;
            }

            // 5. 用戶按下觸摸屏 & 拖動
            public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                    float distanceX, float distanceY) {
                Log.i("MyGesture", "onScroll:");
                return true;
            }

            // 6. 用戶按下觸摸屏降狠、快速移動后松開
            // 參數(shù):
            // e1:第1個ACTION_DOWN MotionEvent
            // e2:最后一個ACTION_MOVE MotionEvent
            // velocityX:X軸上的移動速度,像素/秒
            // velocityY:Y軸上的移動速度庇楞,像素/秒
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                                   float velocityY) {
                Log.i("MyGesture", "onFling");
                return true;
            }

            // OnDoubleTapListener的函數(shù)
            // 1. 單擊事件
            // 關于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的區(qū)別
            // onSingleTapConfirmed:再次點擊(即雙擊)榜配,則不會執(zhí)行
            // onSingleTapUp:手抬起就會執(zhí)行
            public boolean onSingleTapConfirmed(MotionEvent e) {
                Log.i("MyGesture", "onSingleTapConfirmed");
                return false;
            }

            // 2. 雙擊事件
            public boolean onDoubleTap(MotionEvent e) {
                Log.i("MyGesture", "onDoubleTap");
                return false;
            }
            // 3. 雙擊間隔中發(fā)生的動作
            // 指觸發(fā)onDoubleTap后,在雙擊之間發(fā)生的其它動作吕晌,包含down蛋褥、up和move事件;
            public boolean onDoubleTapEvent(MotionEvent e) {
                Log.i("MyGesture", "onDoubleTapEvent");
                return false;
            }
        });

        // 步驟2:重寫View的onTouch函數(shù)睛驳,將觸屏事件交給GestureDetector處理烙心,從而對用戶手勢作出響應
        mTextView = (TextView) findViewById(R.id.textView);
        mTextView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mGestureDetector.onTouchEvent(event);
                return true;
            }
        });
    }
}

5. 測試效果

日志效果如下


至此,關于Android手勢識別類GestureDetector類使用講解完畢乏沸。


總結

  • 本文主要對Android手勢識別類:GestureDetector類的使用進行全面講解
  • 接下來我將繼續(xù)介紹 Android開發(fā)中的相關知識淫茵,感興趣的同學可以繼續(xù)關注本人博客Carson_Ho的開發(fā)筆記

相關系列文章閱讀
Carson帶你學Android:學習方法
Carson帶你學Android:四大組件
Carson帶你學Android:自定義View
Carson帶你學Android:異步-多線程
Carson帶你學Android:性能優(yōu)化
Carson帶你學Android:動畫


歡迎關注Carson_Ho的簡書

不定期分享關于安卓開發(fā)的干貨,追求短蹬跃、平匙瘪、快,但卻不缺深度蝶缀。


請點贊丹喻!因為你的鼓勵是我寫作的最大動力!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翁都,一起剝皮案震驚了整個濱河市碍论,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柄慰,老刑警劉巖鳍悠,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異先煎,居然都是意外死亡贼涩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門薯蝎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遥倦,“玉大人,你說我怎么就攤上這事占锯√桓纾” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵消略,是天一觀的道長堡称。 經(jīng)常有香客問我,道長艺演,這世上最難降的妖魔是什么却紧? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任桐臊,我火速辦了婚禮,結果婚禮上晓殊,老公的妹妹穿的比我還像新娘断凶。我一直安慰自己,他們只是感情好巫俺,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布认烁。 她就那樣靜靜地躺著,像睡著了一般介汹。 火紅的嫁衣襯著肌膚如雪却嗡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天嘹承,我揣著相機與錄音窗价,去河邊找鬼。 笑死叹卷,一個胖子當著我的面吹牛舌镶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豪娜,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼餐胀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘤载?” 一聲冷哼從身側響起否灾,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸣奔,沒想到半個月后墨技,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡挎狸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年扣汪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锨匆。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡崭别,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恐锣,到底是詐尸還是另有隱情茅主,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布土榴,位于F島的核電站诀姚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏玷禽。R本人自食惡果不足惜赫段,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一呀打、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糯笙,春花似錦聚磺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜒蕾。三九已至稠炬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咪啡,已是汗流浹背首启。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撤摸,地道東北人毅桃。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像准夷,于是被迫代替她去往敵國和親钥飞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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