0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

Android手勢檢測之GestureDetector全面分析

哆啦安全 ? 來源:Android開發(fā)編程 ? 2023-04-19 14:43 ? 次閱讀

前言

當用戶觸摸屏幕的時候,會產(chǎn)生許多手勢,例如down,up,scroll,filing等等;

Android sdk給我們提供了GestureDetector類,通過這個類我們可以識別很多的手勢;

今天就來學習下;

一、GestureDetector介紹

GestureDetector這個類對外提供了兩個接口和一個外部類

接口:OnGestureListener,OnDoubleTapListener

內(nèi)部類:SimpleOnGestureListener

89c9d15a-de7b-11ed-bfe3-dac502259ad0.png

GestureDetector類介紹

private class Gesturelistener implements GestureDetector.OnGestureListener{
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
// TODO Auto-generated method stub
return false;
}
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// TODO Auto-generated method stub
return false;
}
}

這里總共重寫了六個函數(shù)

1、OnDown(MotionEvent e):用戶按下屏幕就會觸發(fā);

2、onShowPress(MotionEvent e):如果是按下的時間超過瞬間,而且在按下的時候沒有松開或者是拖動的,那么onShowPress就會執(zhí)行

3、onLongPress(MotionEvent e):長按觸摸屏,超過一定時長,就會觸發(fā)這個事件,觸發(fā)順序:onDown->onShowPress->onLongPress

4、onSingleTapUp(MotionEvent e):一次單獨的輕擊抬起操作,也就是輕擊一下屏幕,立刻抬起來,才會有這個觸發(fā),當然,如果除了Down以外還有其它操作,那就不再算是Single操作了,所以也就不會觸發(fā)這個事件;觸發(fā)順序:Touchup:onDown->onSingleTapUp->onSingleTapConfirmed ;

onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) :滑屏,用戶按下觸摸屏、快速移動后松開,由1個MotionEvent ACTION_DOWN, 多個ACTION_MOVE, 1個ACTION_UP觸發(fā);

參數(shù)解釋:

e1:第1個ACTION_DOWN MotionEvent

e2:最后一個ACTION_MOVE MotionEvent

velocityX:X軸上的移動速度,像素/秒

velocityY:Y軸上的移動速度,像素/秒

5、onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY):在屏幕上拖動事件;無論是用手拖動view,或者是以拋的動作滾動,都會多次觸發(fā),這個方法在ACTION_MOVE動作發(fā)生時就會觸發(fā);

滑屏:手指觸動屏幕后,稍微滑動后立即松開

onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling

拖動

onDown------》onScroll----》onScroll------》onFiling

無論是滑屏,還是拖動,影響的只是中間OnScroll觸發(fā)的數(shù)量多少而已,最終都會觸發(fā)onFling事件;

二、實現(xiàn)GestureDetector

1、實現(xiàn)OnGestureListener接口中的方法(可以使用匿名內(nèi)部類或?qū)崿F(xiàn)了接口的類實例);

class MyGestureListener implements 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;
    }
}

2、創(chuàng)建GestureDetector類的實例,構造函數(shù)如下:

public GestureDetector(OnGestureListener listener, Handler handler) {
    this(null, listener, handler);
}
public GestureDetector(OnGestureListener listener) {
    this(null, listener, null);
}
public GestureDetector(Context context, OnGestureListener listener) {
    this(context, listener, null);
}
public GestureDetector(Context context, OnGestureListener listener, Handler handler) {
}
public GestureDetector(Context context, OnGestureListener listener, Handler handler,
        boolean unused) {
    this(context, listener, handler);
}
mGestureDetector = new GestureDetector(mContext,new MyGestureListener());

3、 實現(xiàn)View.OnTouchListener接口,重寫onTouch()方法

4、在onTouch()方法中攔截事件處理,將控制權交給GestureDector;

@Override
public boolean onTouch(View v, MotionEvent event) {
    return mGestureDetector.onTouchEvent(event);
}

5、調(diào)用控件的View.setOnTouchListener()將接口的具體實現(xiàn)的引用傳遞進去或者如果是監(jiān)聽雙擊的話調(diào)用GestureDetector .setOnDoubleTapListener()

super.setOnTouchListener(this);

mGestureDetector.setOnDoubleTapListener(new MyGestureListener());

package com.test.test;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
/*
 * 
 */
public class MyView extends View implements View.OnTouchListener{
    private Context mContext;
    private GestureDetector mGestureDetector;
    private static final String TAG = "MyView";
    public MyView(Context context) {
        super(context);
        initData(context);
    }
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initData(context);
    }
    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initData(context);
    }
    private void initData(Context context) {
        this.mContext = context;
        super.setOnTouchListener(this);
        super.setClickable(true);
        super.setLongClickable(true);
        super.setFocusable(true);
        mGestureDetector = new GestureDetector(mContext,new MyGestureListener());
        mGestureDetector.setOnDoubleTapListener(new MyGestureListener());
    }
    /*
     * 當該view上的事件被分發(fā)到view上時觸發(fā)該方法的回調(diào)
     * 如果這個方法返回false時,該事件就會被傳遞給Activity中的onTouchEvent方法來處理
     * 如果該方法返回true時,表示該事件已經(jīng)被onTouch函數(shù)處理玩,不會上傳到activity中處理
     * 該方法屬于View.OnTouchListening接口
     */
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return mGestureDetector.onTouchEvent(event);
    }
    /*
     * 手勢監(jiān)聽類
     */
    class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
        public MyGestureListener() {
            super();
        }
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            Log.e(TAG, "onDoubleTap");
            return true;
        }
        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            Log.e(TAG, "onDoubleTapEvent");
            return true;
        }
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.e(TAG, "onSingleTapConfirmed");
            return true;
        }
        @Override
        public boolean onContextClick(MotionEvent e) {
            Log.e(TAG, "onContextClick");
            return true;
        }
        @Override
        public boolean onDown(MotionEvent e) {
            Log.e(TAG, "onDown");
            return true;
        }
        @Override
        public void onShowPress(MotionEvent e) {
            Log.e(TAG, "onShowPress");
        }
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            Log.e(TAG, "onSingleTapUp");
            return true;
        }
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            Log.e(TAG, "onScroll");
            return true;
        }
        @Override
        public void onLongPress(MotionEvent e) {
            Log.e(TAG, "onLongPress");
        }
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            Log.e(TAG, "onFling");
            return true;
        }
    }
}

自定義控件繼承了View實現(xiàn)了View.OnTouchListener。監(jiān)聽的方法用的是繼承SimpleOnGestureListener類,重寫了所有方法。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3908

    瀏覽量

    126910
  • 觸摸屏
    +關注

    關注

    42

    文章

    2276

    瀏覽量

    115604

原文標題:Android手勢檢測-GestureDetector全面分析

文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Android系統(tǒng)開發(fā)藍牙開發(fā)案例分析

    主題:Android系統(tǒng)開發(fā)藍牙設備訪問技術要點分析及經(jīng)典案例課程內(nèi)容:本專題圍繞Android中藍牙技術及設備訪問要點進行介紹,為您解決藍牙開發(fā)過程中經(jīng)常遇到的問題,最后以“智能醫(yī)
    發(fā)表于 07-24 16:32

    Android 手勢識別

    本帖最后由 kiter_rp 于 2014-9-11 14:23 編輯 總體來分析手勢有關涉及到手勢匹配相關的源碼類之間的關系,如下圖: 上圖中的相關類簡介:GestureLibrary:
    發(fā)表于 09-11 14:22

    干貨!Android藍牙驅(qū)動開發(fā)經(jīng)驗

    Bluetooth協(xié)議棧分析43.1 藍牙協(xié)議棧43.2 Android與藍牙協(xié)議棧的關系5四 BluetoothHCI層分析54.1 HCI層與基帶的通信方式64.2 包的
    發(fā)表于 02-29 15:53

    Androidwifi分析(上)

    Androidwifi分析(上)
    發(fā)表于 11-02 10:53

    谷歌為Android 2.0操作系統(tǒng)研發(fā)出"手勢

    谷歌為Android 2.0操作系統(tǒng)研發(fā)出"手勢搜索" 3月5日消息,據(jù)國外媒體報道,谷歌公司已經(jīng)為Android 2.0操作系統(tǒng)研發(fā)出新的搜索工具:“手勢搜索(Gesture Se
    發(fā)表于 03-05 09:04 ?529次閱讀

    用戶手勢檢測-GestureDetector使用詳解

    安卓APP開發(fā)中的部分功能實現(xiàn)代碼:用戶手勢檢測-GestureDetector使用詳解
    發(fā)表于 03-03 16:16 ?2次下載

    動態(tài)手勢檢測與分類

    提出一種對視頻流中的連續(xù)手勢進行檢測和分類的方法.檢測的目的是找到這些手勢的開始幀和結束幀.提出的融合音頻和視覺信息的檢測方法確保了
    發(fā)表于 01-03 15:23 ?0次下載

    基于Android安全總結與分析

    ,Android智能手機的日益流行也吸引了黑客,導致Android惡意軟件應用的大量增加,從Android體系結構、設計原則、安全機制、主要威脅、惡意軟件分類與檢測、靜態(tài)
    發(fā)表于 01-18 16:58 ?3次下載

    Android內(nèi)核鉤子檢測技術

    針對Android平臺上內(nèi)核級鉤子檢測的研究,提出了一種結合基于特征模式的靜態(tài)檢測技術和基于行為分析的動態(tài)檢測技術的
    發(fā)表于 01-26 18:01 ?1次下載
    <b class='flag-5'>Android</b>內(nèi)核鉤子<b class='flag-5'>檢測</b>技術

    目前較為主流的手勢檢測方案簡要分析

    ELMOS推出的汽車級多用途傳感器IC-E909.06,同樣可以實現(xiàn)手勢檢測。E909.06基于目標檢測光學技術,能夠?qū)ξ矬w移動進行非機械檢測;基于HALIOS(High Ambien
    的頭像 發(fā)表于 05-24 15:42 ?1.5w次閱讀

    AndroidQ或?qū)⒓尤胂蚝蠡瑒?b class='flag-5'>手勢

    谷歌在Android 9 Pie上首次引入手勢控制時,許多的用戶覺得這些手勢控制還不成熟。用戶只能單一的方向上切換應用,而且任務之間的過濾動畫銜接的不流暢。幸運的是,在Android
    的頭像 發(fā)表于 04-24 11:27 ?2319次閱讀

    谷歌分享關于下一代Android系統(tǒng)AndroidQ的更多細節(jié)

    怎么樣,這樣的操作邏輯是不是有了種似曾相識的感覺?此外,屏幕下方的小白條也充當多任務切換手勢,左右滑動可切換在后臺運行的所有程序。全面手勢的加入,會使得現(xiàn)在的全面屏手機得到更多的顯示
    的頭像 發(fā)表于 05-13 16:13 ?3001次閱讀

    Android還是沒找到比iOS更好用的手勢操作

    近期,Google 推送了 Android Q Beta 3 測試版系統(tǒng)更新,在這個版本中,用戶可以用上和 iOS 一模一樣的手勢交互。
    的頭像 發(fā)表于 05-20 14:45 ?2472次閱讀

    消息稱Android 12有望重新引入雙擊背面手勢

    雙擊背面手勢已經(jīng)在很多手機系統(tǒng)中搭載了,包括蘋果最新的 iOS 14、小米的 MIUI 12 等。 谷歌也曾在 Android 11 預覽版中加入了雙擊背面手勢功能,該功能代號為 “Columbus
    的頭像 發(fā)表于 01-25 09:13 ?1275次閱讀

    車載手勢識別技術的原理及其應用

    車載手勢識別技術是一種利用計算機視覺和人工智能技術來識別和理解駕駛員手勢的技術。該技術通過使用傳感器、攝像頭等設備捕捉駕駛員的手勢動作,然后通過算法對捕捉到的手勢動作進行識別和
    的頭像 發(fā)表于 06-27 18:09 ?1181次閱讀