前言
當(dāng)用戶觸摸屏幕的時(shí)候,會(huì)產(chǎn)生許多手勢(shì),例如down,up,scroll,filing等等;
Android sdk給我們提供了GestureDetector類,通過(guò)這個(gè)類我們可以識(shí)別很多的手勢(shì);
今天就來(lái)學(xué)習(xí)下;
一、GestureDetector介紹
GestureDetector這個(gè)類對(duì)外提供了兩個(gè)接口和一個(gè)外部類
接口:OnGestureListener,OnDoubleTapListener
內(nèi)部類:SimpleOnGestureListener

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; } }
這里總共重寫(xiě)了六個(gè)函數(shù)
1、OnDown(MotionEvent e):用戶按下屏幕就會(huì)觸發(fā);
2、onShowPress(MotionEvent e):如果是按下的時(shí)間超過(guò)瞬間,而且在按下的時(shí)候沒(méi)有松開(kāi)或者是拖動(dòng)的,那么onShowPress就會(huì)執(zhí)行
3、onLongPress(MotionEvent e):長(zhǎng)按觸摸屏,超過(guò)一定時(shí)長(zhǎng),就會(huì)觸發(fā)這個(gè)事件,觸發(fā)順序:onDown->onShowPress->onLongPress
4、onSingleTapUp(MotionEvent e):一次單獨(dú)的輕擊抬起操作,也就是輕擊一下屏幕,立刻抬起來(lái),才會(huì)有這個(gè)觸發(fā),當(dāng)然,如果除了Down以外還有其它操作,那就不再算是Single操作了,所以也就不會(huì)觸發(fā)這個(gè)事件;觸發(fā)順序:Touchup:onDown->onSingleTapUp->onSingleTapConfirmed ;
onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) :滑屏,用戶按下觸摸屏、快速移動(dòng)后松開(kāi),由1個(gè)MotionEvent ACTION_DOWN, 多個(gè)ACTION_MOVE, 1個(gè)ACTION_UP觸發(fā);
參數(shù)解釋:
e1:第1個(gè)ACTION_DOWN MotionEvent
e2:最后一個(gè)ACTION_MOVE MotionEvent
velocityX:X軸上的移動(dòng)速度,像素/秒
velocityY:Y軸上的移動(dòng)速度,像素/秒
5、onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY):在屏幕上拖動(dòng)事件;無(wú)論是用手拖動(dòng)view,或者是以拋的動(dòng)作滾動(dòng),都會(huì)多次觸發(fā),這個(gè)方法在ACTION_MOVE動(dòng)作發(fā)生時(shí)就會(huì)觸發(fā);
滑屏:手指觸動(dòng)屏幕后,稍微滑動(dòng)后立即松開(kāi)
onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
拖動(dòng)
onDown------》onScroll----》onScroll------》onFiling
無(wú)論是滑屏,還是拖動(dòng),影響的只是中間OnScroll觸發(fā)的數(shù)量多少而已,最終都會(huì)觸發(fā)onFling事件;
二、實(shí)現(xiàn)GestureDetector
1、實(shí)現(xiàn)OnGestureListener接口中的方法(可以使用匿名內(nèi)部類或?qū)崿F(xiàn)了接口的類實(shí)例);
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í)例,構(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、 實(shí)現(xiàn)View.OnTouchListener接口,重寫(xiě)onTouch()方法
4、在onTouch()方法中攔截事件處理,將控制權(quán)交給GestureDector;
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
5、調(diào)用控件的View.setOnTouchListener()將接口的具體實(shí)現(xiàn)的引用傳遞進(jìn)去或者如果是監(jiān)聽(tīng)雙擊的話調(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上時(shí)觸發(fā)該方法的回調(diào)
* 如果這個(gè)方法返回false時(shí),該事件就會(huì)被傳遞給Activity中的onTouchEvent方法來(lái)處理
* 如果該方法返回true時(shí),表示該事件已經(jīng)被onTouch函數(shù)處理玩,不會(huì)上傳到activity中處理
* 該方法屬于View.OnTouchListening接口
*/
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
/*
* 手勢(shì)監(jiān)聽(tīng)類
*/
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實(shí)現(xiàn)了View.OnTouchListener。監(jiān)聽(tīng)的方法用的是繼承SimpleOnGestureListener類,重寫(xiě)了所有方法。
審核編輯:劉清
-
Android
+關(guān)注
關(guān)注
12文章
4026瀏覽量
134057 -
觸摸屏
+關(guān)注
關(guān)注
42文章
2462瀏覽量
122054
原文標(biāo)題:Android手勢(shì)檢測(cè)-GestureDetector全面分析
文章出處:【微信號(hào):哆啦安全,微信公眾號(hào):哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Android系統(tǒng)開(kāi)發(fā)之藍(lán)牙開(kāi)發(fā)案例分析
Android 手勢(shì)識(shí)別
干貨!Android之藍(lán)牙驅(qū)動(dòng)開(kāi)發(fā)經(jīng)驗(yàn)
谷歌為Android 2.0操作系統(tǒng)研發(fā)出"手勢(shì)搜
用戶手勢(shì)檢測(cè)-GestureDetector使用詳解
動(dòng)態(tài)手勢(shì)檢測(cè)與分類
基于Android安全總結(jié)與分析
Android內(nèi)核鉤子檢測(cè)技術(shù)
Android手勢(shì)檢測(cè)之GestureDetector全面分析
評(píng)論