精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

Android手勢檢測之GestureDetector全面分析

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

前言

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

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

今天就來學習下;

一、GestureDetector介紹

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

接口:OnGestureListener,OnDoubleTapListener

內部類: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;
}
}

這里總共重寫了六個函數

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

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

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

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

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

參數解釋:

e1:第1個ACTION_DOWN MotionEvent

e2:最后一個ACTION_MOVE MotionEvent

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

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

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

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

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

拖動

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

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

二、實現GestureDetector

1、實現OnGestureListener接口中的方法(可以使用匿名內部類或實現了接口的類實例);

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、創建GestureDetector類的實例,構造函數如下:

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、 實現View.OnTouchListener接口,重寫onTouch()方法

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

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

5、調用控件的View.setOnTouchListener()將接口的具體實現的引用傳遞進去或者如果是監聽雙擊的話調用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上的事件被分發到view上時觸發該方法的回調
     * 如果這個方法返回false時,該事件就會被傳遞給Activity中的onTouchEvent方法來處理
     * 如果該方法返回true時,表示該事件已經被onTouch函數處理玩,不會上傳到activity中處理
     * 該方法屬于View.OnTouchListening接口
     */
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return mGestureDetector.onTouchEvent(event);
    }
    /*
     * 手勢監聽類
     */
    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實現了View.OnTouchListener。監聽的方法用的是繼承SimpleOnGestureListener類,重寫了所有方法。






審核編輯:劉清

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

    關注

    12

    文章

    3923

    瀏覽量

    127136
  • 觸摸屏
    +關注

    關注

    42

    文章

    2290

    瀏覽量

    115996

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

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

收藏 人收藏

    評論

    相關推薦

    Android系統開發藍牙開發案例分析

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

    Android 手勢識別

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

    干貨!Android藍牙驅動開發經驗

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

    Androidwifi分析(上)

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

    谷歌為Android 2.0操作系統研發出"手勢

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

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

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

    動態手勢檢測與分類

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

    基于Android安全總結與分析

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

    Android內核鉤子檢測技術

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

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

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

    AndroidQ或將加入向后滑動手勢

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

    谷歌分享關于下一代Android系統AndroidQ的更多細節

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

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

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

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

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

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

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