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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

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

Android手勢檢測之GestureDetector全面分析

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

前言

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

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

今天就來學(xué)習(xí)下;

一、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ā),當(dāng)然,如果除了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類的實例,構(gòu)造函數(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()方法中攔截事件處理,將控制權(quán)交給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());
    }
    /*
     * 當(dāng)該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)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3936

    瀏覽量

    127416
  • 觸摸屏
    +關(guān)注

    關(guān)注

    42

    文章

    2306

    瀏覽量

    116208

原文標(biāo)題:Android手勢檢測-GestureDetector全面分析

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    Android 手勢識別

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

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

    Bluetooth協(xié)議棧分析43.1 藍牙協(xié)議棧43.2 Android與藍牙協(xié)議棧的關(guān)系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 ?547次閱讀

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

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

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

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

    基于Android安全總結(jié)與分析

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

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

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

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

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

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

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

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

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

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

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

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

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

    車載手勢識別技術(shù)的原理及其應(yīng)用

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