一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

GestureDetector類及其用法

 星君達(dá) 2015-11-21
轉(zhuǎn)載:http://blog.sina.com.cn/s/blog_77c6324101017hs8.html
當(dāng)用戶觸摸屏幕的時(shí)候,會(huì)產(chǎn)生許多手勢(shì),例如down,up,scroll,filing等等。
一般情況下,我們知道View類有個(gè)View.OnTouchListener內(nèi)部接口,通過(guò)重寫他的onTouch(View v, MotionEvent event)方法,我們可以處理一些touch事件,但是這個(gè)方法太過(guò)簡(jiǎn)單,如果需要處理一些復(fù)雜的手勢(shì),用這個(gè)接口就會(huì)很麻煩(因?yàn)槲覀円约焊鶕?jù)用戶觸摸的軌跡去判斷是什么手勢(shì))。
Android sdk給我們提供了GestureDetector(Gesture:手勢(shì)Detector:識(shí)別)類,通過(guò)這個(gè)類我們可以識(shí)別很多的手勢(shì),主要是通過(guò)他的onTouchEvent(event)方法完成了不同手勢(shì)的識(shí)別。雖然他能識(shí)別手勢(shì),但是不同的手勢(shì)要怎么處理,應(yīng)該是提供給程序員實(shí)現(xiàn)的。
GestureDetector這個(gè)類對(duì)外提供了兩個(gè)接口:OnGestureListener,OnDoubleTapListener,還有一個(gè)內(nèi)部類SimpleOnGestureListener。
GestureDetector.OnDoubleTapListener接口:用來(lái)通知DoubleTap事件,類似于鼠標(biāo)的雙擊事件。
1,onDoubleTap(MotionEvent e):在雙擊的第二下,Touch down時(shí)觸發(fā) 。
2,onDoubleTapEvent(MotionEvent e):通知DoubleTap手勢(shì)中的事件,包含down、up和move事件(這里指的是在雙擊之間發(fā)生的事件,例如在同一個(gè)地方雙擊會(huì)產(chǎn)生DoubleTap手勢(shì),而在DoubleTap手勢(shì)里面還會(huì)發(fā)生down和up事件,這兩個(gè)事件由該函數(shù)通知);雙擊的第二下Touch down和up都會(huì)觸發(fā),可用e.getAction()區(qū)分。 
3,onSingleTapConfirmed(MotionEvent e):用來(lái)判定該次點(diǎn)擊是SingleTap而不是DoubleTap,如果連續(xù)點(diǎn)擊兩次就是DoubleTap手勢(shì),如果只點(diǎn)擊一次,系統(tǒng)等待一段時(shí)間后沒(méi)有收到第二次點(diǎn)擊則判定該次點(diǎn)擊為SingleTap而不是DoubleTap,然后觸發(fā)SingleTapConfirmed事件。這個(gè)方法不同于onSingleTapUp,他是在GestureDetector確信用戶在第一次觸摸屏幕后,沒(méi)有緊跟著第二次觸摸屏幕,也就是不是“雙擊”的時(shí)候觸發(fā)   
GestureDetector.OnGestureListener接口:用來(lái)通知普通的手勢(shì)事件,該接口有如下六個(gè)回調(diào)函數(shù):
     1.   onDown(MotionEvent e):down事件;
     2.   onSingleTapUp(MotionEvent e):一次點(diǎn)擊up事件;在touch down后又沒(méi)有滑動(dòng)
(onScroll),又沒(méi)有長(zhǎng)按(onLongPress),然后Touchup時(shí)觸發(fā)。
 點(diǎn)擊一下非??斓模ú换瑒?dòng))Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed 
          點(diǎn)擊一下稍微慢點(diǎn)的(不滑動(dòng))Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
     3.   onShowPress(MotionEvent e):down事件發(fā)生而move或則up還沒(méi)發(fā)生前觸發(fā)該   
事件;Touch了還沒(méi)有滑動(dòng)時(shí)觸發(fā)(與onDown,onLongPress)比較onDown只要Touch down一定立刻觸發(fā)。而Touchdown后過(guò)一會(huì)沒(méi)有滑動(dòng)先觸發(fā)onShowPress再是onLongPress。所以Touchdown后一直不滑動(dòng)
按照onDown->onShowPress->onLongPress這個(gè)順序觸發(fā)。 
     4.   onLongPress(MotionEvent e):長(zhǎng)按事件;Touch了不移動(dòng)一直Touch down時(shí)觸發(fā) 
     5.   onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑動(dòng)手
勢(shì)事件;Touch了滑動(dòng)一點(diǎn)距離后,在ACTION_UP時(shí)才會(huì)觸發(fā)       
參數(shù):e1 第1個(gè)ACTION_DOWN MotionEvent 并且只有一個(gè);e2 最后一個(gè)ACTION_MOVE MotionEvent ;velocityX X軸上的移動(dòng)速度,像素/秒 ;velocityY Y軸上的移動(dòng)速度,像素/秒.觸發(fā)條件:X軸的坐標(biāo)位移大于FLING_MIN_DISTANCE,且移動(dòng)速度大于FLING_MIN_VELOCITY個(gè)像素/秒
6.   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)后立即松開
onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
        拖動(dòng)
onDown------》onScroll----》onScroll------》onFiling
 
SimpleOnGestureListener類是GestureDetector提供給我們的一個(gè)更方便的響應(yīng)不同手勢(shì)的類,這個(gè)類實(shí)現(xiàn)了上述兩個(gè)接口(但是所有的方法體都是空的),該類是static class,也就是說(shuō)它實(shí)際上是一個(gè)外部類。程序員可以在外部繼承這個(gè)類,重寫里面的手勢(shì)處理方法。
 
方法步驟
第一種示例:
1,通過(guò)GestureDetector的構(gòu)造方法可以將SimpleOnGestureListener對(duì)象傳遞進(jìn)去,這樣GestureDetector能處理不同的手勢(shì)了。
public GestureDetector
(Context context, GestureDetector.OnGestureListener listener)
 
2,在OnTouchListener的onTouch方法中
private OnTouchListener gestureTouchListener = new OnTouchListener() {
               public boolean onTouch(View v, MotionEvent event) {
             return gDetector.onTouchEvent(event);
        }
    };
第二種示例:
使用方法
private GestureDetector mGestureDetector;
mGestureListener = new BookOnGestureListener();
構(gòu)造出來(lái)mGestureDetector = new GestureDetector(mGestureListener);
class BookOnGestureListener implements OnGestureListener {
同時(shí)要public boolean onTouchEvent(MotionEvent event) {
                        mGestureListener.onTouchEvent(event);
             }
 
第三種示例代碼
代碼:
01.private GestureDetector mGestureDetector;
02.@Override
03.public void onCreate(Bundle savedInstanceState) {
04.    super.onCreate(savedInstanceState);
05.    mGestureDetector = new GestureDetector(this, new LearnGestureListener());
06.}
07.@Override
08.public boolean onTouchEvent(MotionEvent event) {
09.    if (mGestureDetector.onTouchEvent(event))
10.        return true;
11.    else
12.        return false;
13.}
14.class LearnGestureListener extends GestureDetector.SimpleOnGestureListener{
15.    @Override
16.    public boolean onSingleTapUp(MotionEvent ev) {
17.        Log.d("onSingleTapUp",ev.toString());
18.        return true;
19.    }
20.    @Override
21.    public void onShowPress(MotionEvent ev) {
22.        Log.d("onShowPress",ev.toString());
23.    }
24.    @Override
25.    public void onLongPress(MotionEvent ev) {
26.        Log.d("onLongPress",ev.toString());
27.    }
28.    @Override
29.    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
30.        Log.d("onScroll",e1.toString());
31.        return true;
32.    }
33.    @Override
34.    public boolean onDown(MotionEvent ev) {
35.        Log.d("onDownd",ev.toString());
36.        return true;
37.    }
38.    @Override
39.    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
40.        Log.d("d",e1.toString());
41.        Log.d("e2",e2.toString());
42.        return true;
43.    }
44.}
 
1,在當(dāng)前類中創(chuàng)建一個(gè)GestureDetector實(shí)例。
private GestureDetector mGestureDetector;
2,創(chuàng)建一個(gè)Listener來(lái)實(shí)時(shí)監(jiān)聽(tīng)當(dāng)前面板操作手勢(shì)。
class LearnGestureListener extends GestureDetector.SimpleOnGestureListener                                                              
3,在初始化時(shí),將Listener實(shí)例關(guān)聯(lián)當(dāng)前的GestureDetector實(shí)例。
mGestureDetector = new GestureDetector(this, new LearnGestureListener());
4,利用onTouchEvent方法作為入口檢測(cè),通過(guò)傳遞MotionEvent參數(shù)來(lái)監(jiān)聽(tīng)操作手勢(shì)。
1.mGestureDetector.onTouchEvent(event)
 
第四種示例代碼
 
private GestureDetector mGestureDetector;
@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  mGestureDetector = new GestureDetector(this, new MyGestureListener());
}
@Override
public boolean onTouchEvent(MotionEvent event) {
 return mGestureDetector.onTouchEvent(event);
 
}
class MyGestureListener extends GestureDetector.SimpleOnGestureListener{
  @Override
  public boolean onSingleTapUp(MotionEvent ev) {
    Log.d("onSingleTapUp",ev.toString());
    return true;
  }
  @Override
  public void onShowPress(MotionEvent ev) {
    Log.d("onShowPress",ev.toString());
  }
  @Override
  public void onLongPress(MotionEvent ev) {
    Log.d("onLongPress",ev.toString());
  }
}
基本的內(nèi)容就是創(chuàng)建一個(gè)GestureDetector的對(duì)象,傳入listener對(duì)象,在自己接收到的onTouchEvent中將event傳給GestureDetector進(jìn)行分析,listener會(huì)回調(diào)給我們相應(yīng)的動(dòng)作。其中GestureDetector.SimpleOnGestureListener(Framework幫我們簡(jiǎn)化了)是實(shí)現(xiàn)了上面提到的OnGestureListener和OnDoubleTapListener兩個(gè)接口的類,我們只需要繼承它并重寫其中我們關(guān)心的回調(diào)即可。
最后,再提一下雙擊和三擊的識(shí)別過(guò)程:在第一次單擊down時(shí),給Hanlder發(fā)送了一個(gè)延時(shí)300ms的消息,如果300ms里,發(fā)生了第二次單擊的down事件,那么,就認(rèn)為是雙擊事件了,并移除之前發(fā)送的延時(shí)消息。如果300ms后仍沒(méi)有第二次的down消息,那么就判定為SingleTapConfirmed事件(當(dāng)然,此時(shí)用戶的手指應(yīng)已完成第一次點(diǎn)擊的up過(guò)程)。三擊的判定和雙擊的判定類似,只是多了一次發(fā)送延時(shí)消息的過(guò)程。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    久久本道综合色狠狠五月| 少妇在线一区二区三区| 国产精品国三级国产专不卡| 欧美日韩国产黑人一区| 日韩免费国产91在线| 人体偷拍一区二区三区| 亚洲香艳网久久五月婷婷| 国内精品美女福利av在线| 国产精品制服丝袜美腿丝袜| 国产精品久久香蕉国产线| 丰满人妻熟妇乱又乱精品古代| 五月激情五月天综合网| 日韩精品日韩激情日韩综合| 国产又粗又爽又猛又黄的| 国产高清一区二区不卡| 亚洲中文字幕乱码亚洲| 欧美日韩亚洲国产综合网| 欧美加勒比一区二区三区 | 二区久久久国产av色| 日韩一区二区三区四区乱码视频| 亚洲午夜福利不卡片在线| 黄色国产一区二区三区| 国产精品内射视频免费| 日韩1区二区三区麻豆| 99久久免费中文字幕| 99免费人成看国产片| 国产精品国三级国产专不卡| 中文日韩精品视频在线| 激情五月天免费在线观看| 东京热一二三区在线免| 国产又粗又猛又大爽又黄| 欧美成人欧美一级乱黄| 精品欧美日韩一区二区三区| 日本久久中文字幕免费| 亚洲欧美视频欧美视频| 欧美激情中文字幕综合八区| 黄色片一区二区三区高清| 五月婷婷六月丁香亚洲| 欧美六区视频在线观看| 高清一区二区三区大伊香蕉| 高潮少妇高潮久久精品99|