Android 手勢&觸摸事件 MotionEvent

來源:互聯網
上載者:User

標籤:

 

1.http://blog.csdn.net/omg_2012/article/details/7881443

這篇相當好啊

2.http://blog.csdn.net/android_tutor/article/details/7193090

3.http://blog.csdn.net/heng615975867/article/details/8791937

4.http://www.dewen.org/q/2438/



ACTION_MASK在Android中是應用於多點觸摸操作,字面上的意思大概是動作掩碼的意思吧。
在onTouchEvent(MotionEvent event)中,使用switch (event.getAction())能夠處理ACTION_DOWN和ACTION_UP事件;使用switch (event.getAction() & MotionEvent.ACTION_MASK)就能夠處理處理多點觸摸的ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。
追問
能給我再詳解下switch (event.getAction() & MotionEvent.ACTION_MASK)和
MotionEvent的一些事件
回答
ACTION_DOWN和ACTION_UP就是單點觸控螢幕幕,按下去和放開的操作;
ACTION_POINTER_DOWN和ACTION_POINTER_UP就是多點觸控螢幕幕,當有一僅僅手指按下去的時候,還有一僅僅手指按下和放開的動作捕捉;
ACTION_MOVE就是手指在螢幕上移動的操作;
經常使用的都是這幾個吧。


public void onPageScrollStateChanged(int state) { 
滾動狀態改變時調用。用於發現使用者何時開始拖動、頁面何時自己主動沉降到當前頁(使用者不拖動時)、或者何時全然停止/空暇。 
* arg0:新的滾動狀態。SCROLL_STATE_DRAGGING、SCROLL_STATE_SETTLING、SCROLL_STATE_IDLE



===================================================================================================

2014-2-27號補充:

http://developer.android.com/reference/android/view/MotionEvent.html
http://developer.android.com/training/gestures/multi.html(官方文檔:關於多點觸控的)這裡有一個系列的文檔,和手勢有關的還有其他的~很棒
http://my.eoe.cn/31127/threadhttp://www.eoeandroid.com/thread-259702-1-1.html

GestureDetector(OnGestureListener, OnDoubleTapListener, SimpleOnGestureListener)http://blog.csdn.net/xiezhenxiang/article/details/6659506


http://www.cnblogs.com/akira90/archive/2013/03/10/2952886.html


http://blog.csdn.net/xipiaoyouzi/article/details/7974898

小範例
http://www.2cto.com/kf/201209/156450.html

http://www.cnblogs.com/devinzhang/archive/2012/02/27/2369942.html

http://blog.csdn.net/cloudzfy1/article/details/6582707

http://www.icodelogic.com/?p=601


http://www.blogjava.net/TiGERTiAN/archive/2011/02/22/344869.html

http://www.linuxidc.com/Linux/2012-06/62567.htm


===================================================================================================


在剛開始學Android的時候,就認為Google的文檔不咋樣,在研究手勢時,更加的感覺Google的文檔寫得實在是太差了。非常多常量,屬性和方法,竟然連個描寫敘述都沒有。
沒有描寫敘述也就罷了,可是OnGestureListener裏手勢這麼多,它也沒有一個介紹說明,在沒有進行不斷才嘗試之前,誰能搞懂onLongPress和onShowPress,
onScroll和onFling的關係與區別嗎?Google真的須要在文檔方面做一次大手術了。只是好在經過鄙人不斷重複的嘗試。從個人的角度為這幾個手勢動作做出了定義。

按下(onDown): 剛剛手指接觸到觸控螢幕的那一刹那,就是觸的那一下。
拋擲(onFling): 手指在觸控螢幕上迅速移動,並鬆開的動作。
長按(onLongPress): 手指按在持續一段時間,而且沒有鬆開。
滾動(onScroll): 手指在觸控螢幕上滑動。
按住(onShowPress): 手指按在觸控螢幕上,它的時間範圍在按下起效,在長按之前。
抬起(onSingleTapUp):手指離開觸控螢幕的那一刹那。
  除了這些定義之外,鄙人也總結了一點算是經驗的經驗吧,在這裡和大家分享一下。

不論什麼手勢動作都會先運行一次按下(onDown)動作。
長按(onLongPress)動作前一定會運行一次按住(onShowPress)動作。
按住(onShowPress)動作和按下(onDown)動作之後都會運行一次抬起(onSingleTapUp)動作。
長按(onLongPress)、滾動(onScroll)和拋擲(onFling)動作之後都不會運行抬起(onSingleTapUp)動作。

Android識別觸控螢幕手勢使得使用者體驗大大提高。在View類中有個View.OnTouchListener內部介面,通過重寫他的onTouch(View v, MotionEvent event)方法,我們能夠處理一些簡單的touch事件,可是這種方法並不能識別手勢,假設須要處理一些複雜的手勢,用這個介面就會非常麻煩(由於我們要自己依據使用者觸摸的軌跡去推斷是什麼手勢)。好在Android為我們提供了GestureDetector類,通過它,我們能夠輕鬆的進行手勢識別。以下我做一個簡要地介紹。
一.GestureDetector簡單介紹
1.組成
GestureDetector類用來識別觸控螢幕的各種手勢,它包括了兩個介面和一個內部類:
介面:
OnGestureListener:用來監聽手勢事件(6種)。
OnDoubleTapListener:用來監聽雙擊事件。
內部類:
SimpleOnGestureListener:用來監聽全部的手勢。實際上它實現了上述兩個介面,只是方法體是空的,須要我們自己寫。我們能夠繼承這個類,重寫裡面的方法進行手勢處理。
2.構造
GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
3.方法
(1)onTouchEvent(MotionEvent ev) 分析捕捉到的觸摸事件觸發對應的回呼函數
(2)setIsLongpressEnabled(boolean isLongpressEnabled) 設定“長按”是否可用
(3)setOnDoubleTapListener(GestureDetector.OnDoubleTapListener onDoubleTapListener) 設定雙擊監聽器
4.使用
流程:
首先,系統捕捉螢幕的觸摸事件(onTouchListener),這時還未涉及詳細手勢,僅僅是簡單地捕捉到觸摸。
接著,在onTouch()方法中調用GestureDetector的onTouchEvent()方法,將捕捉到的MotionEvent交給GestureDetector來處理
最後,還須要實現抽象方法。
實現:
(1)在Activity中建立GestureDetector執行個體gestureDetector。
(2)可依據須要選擇:
重寫OnGestureListener並通過建構函式傳入gestureDetector
重寫OnDoubleTapListener並通過GestureDetector.setOnDoubleTapListener方法傳入gestureDetector
重寫SimpleOnGestureListener並通過建構函式傳入gestureDetector
(3)重寫Activity的onTouchEvent方法,將全部的觸摸事件交給gestureDetector來處理
@Override
public boolean onTouchEvent(MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
二.onGestureListener
1.onGestureListener識別6種手勢,各自是:
(1) onDown(MotionEvent e):down事件;
(2) onSingleTapUp(MotionEvent e):一次點擊up事件;
(3) onShowPress(MotionEvent e):down事件發生而move或則up還沒發生前觸發該事件;
(4) onLongPress(MotionEvent e):長按事件;
(5) onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑動手勢事件;
(6) onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在螢幕上拖動事件。
這裡我須要囉嗦在網上搜到的關於onFling和onScroll的一點差別。
onFling()是甩,這個甩的動作是在一個MotionEvent.ACTION_UP(手指抬起)發生時運行,而onScroll(),僅僅要手指移動就會運行。他不會運行MotionEvent.ACTION_UP。onFling通經常使用來實現翻頁效果,而onScroll通經常使用來實現放大縮小和移動。
2.重寫
OnGestureListener onGestureListener=new OnGestureListener(){
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
return false;
}
@Override
public boolean onLongPress(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {

}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
}
能夠依據須要,在函數裡加入詳細的處理方法.之後通過建構函式傳入GestureDetector就可以。
GestureDetector gestureDetector=new GestureDetector(this,onGestureListener);
二.OnDoubleTapListener
1.OnDoubleTapListener是用來檢測滑鼠雙擊事件的。須要實現的抽象方法有:
(1) onDoubleTap(MotionEvent e):雙擊事件。
(2) onDoubleTapEvent(MotionEvent e):雙擊間隔中還發生其它的動作。通知DoubleTap手勢中的事件,包括down、up和move事件
(這裡指的是在雙擊之間發生的事件,比如在同一個地方雙擊會產生DoubleTap手勢,而在DoubleTap手勢裡面還會發生down和up事件,這兩個事件由該函數通知);
(3) onSingleTapConfirmed(MotionEvent e):單擊事件。用來判定該次點擊是SingleTap而不是DoubleTap,假設連續點擊兩次就是DoubleTap手勢,
假設僅僅點擊一次,系統等待一段時間後沒有收到第二次點擊則判定該次點擊為SingleTap而不是DoubleTap,然後觸發SingleTapConfirmed事件。
關於onSingleTapConfirmed和onSingleTapUp的一點差別: OnGestureListener有這種一個方法onSingleTapUp,和onSingleTapConfirmedeasy混淆。
二者的差別是:onSingleTapUp,僅僅要手抬起就會運行,而對於onSingleTapConfirmed來說,假設雙擊的話,則onSingleTapConfirmed不會運行。
2.重寫
OnDoubleTapListener onDoubleTapListener new OnDoubleTapListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
return false;
}
)
能夠依據須要,在函數裡加入詳細的處理方法.,之後通過setOnDoubleTapListener傳入GestureDetector就可以。
gestureDetector.setOnDoubleTapListener(onDoubleTapListener) ;
三.SimpleOnGestureListener
SimpleOnGestureListener是GestureDetector類的一個內部類,該類是static class,也就是說它實際上是一個外部類。能夠在外部繼承這個類,重寫裡面的手勢處理方法。
1.SimpleOnGestureListener實際上實現了OnGestureListener 和OnDoubleTapListener,所以它能夠完畢以上提到的全部手勢識別(9種),如上介紹。
2.重寫
public class simpleOnGestureListener extends SimpleOnGestureListener {

@Override
public boolean onDoubleTap(MotionEvent e) {
return super.onDoubleTap(e);
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return super.onDoubleTapEvent(e);
}
@Override
public boolean onDown(MotionEvent e) {
return super.onDown(e);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float x,
float y) {
return super.onFling(e1, e2, x, y);
}
@Override
public void onLongPress(MotionEvent e) {
super.onLongPress(e);
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float x,
float y) {
return super.onScroll(e1, e2, x, y);
}
@Override
public void onShowPress(MotionEvent e) {
super.onShowPress(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return super.onSingleTapConfirmed(e);
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return super.onSingleTapUp(e);
}
}
能夠依據須要,在函數裡加入詳細的處理方法,之後通過建構函式傳入GestureDetector就可以。
GestureDetector gestureDetector=new GestureDetector(this,simpleOnGestureListener );
四.還有一種思路
要實現捕捉螢幕手勢,除了在Activity中建立gestureDetector外,另一種思路:構建一個Overlay,這個Overlay實現OnGestureListener介面,使其維護自己的GestureDetector。
在主視圖上加入這個Overlay,並傳入對應的listener,就可以實現捕捉手勢的功能。




這2個東西我一直弄不明確,一直蒙蒙的,今天有空,就又看了下,似乎有些懂了,寫了測試代碼測試了下,可是還是不太明確。參考了這篇文檔:http://blog.csdn.net/android_tutor/article/details/7193090。
首先,這篇文章只針對於因為觸摸(Touch)而觸發的事件。

Android的事件:onClick, onScroll, onFling等等,都是由很多個Touch組成的。當中Touch的第一個狀態肯定是ACTION_DOWN, 表示按下了螢幕。之後,touch將會有興許事件,可能是:

    ACTION_MOVE //表示為移動手勢

    ACTION_UP //表示為離開螢幕

    ACTION_CANCEL //表示取消手勢,不會由使用者產生,而是由程式產生的

一個Action_DOWN, n個ACTION_MOVE, 1個ACTION_UP,就構成了Android中眾多的事件。

在Android中,有一類控制項是中還能夠包括其它的子控制項,這類控制項是繼承於ViewGroup類,比如:ListView, Gallery, GridView。

另一類控制項是不能再包括子控制項,比如:TextView。

本文的主要討論對象就是ViewGroup類的控制項嵌套時事件觸發情況。

對於ViewGroup類的控制項,有一個非常重要的方法,就是onInterceptTouchEvent(),用於處理事件並改變事件的傳遞方向,它的返回值是一個布爾值,決定了Touch事件是否要向它包括的子View繼續傳遞,這種方法是從父View向子View傳遞。

而方法onTouchEvent(),用於接收事件並處理,它的返回值也是一個布爾值,決定了事件及興許事件是否繼續向上傳遞,這種方法是從子View向父View傳遞。

touch事件在 onInterceptTouchEvent()和onTouchEvent以及各個childView間的傳遞機制全然取決於onInterceptTouchEvent()和onTouchEvent()的返回值。返回值為true表示事件被正確接收和處理了,返回值為false表示事件沒有被處理,將繼續傳遞下去。

ACTION_DOWN事件會傳到某個ViewGroup類的onInterceptTouchEvent,假設返回false,則DOWN事件繼續向子ViewGroup類的onInterceptTouchEvent傳遞,假設子View不是ViewGroup類的控制項,則傳遞給它的onTouchEvent。

假設onInterceptTouchEvent返回了true,則DOWN事件傳遞給它的onTouchEvent,不再繼續傳遞,而且之後的興許事件也都傳遞給它的onTouchEvent。

假設某View的onTouchEvent返回了false,則DOWN事件繼續向其父ViewGroup類的onTouchEvent傳遞;假設返回了true,則興許事件會直接傳遞給其onTouchEvent繼續處理。(興許事件僅僅會傳遞給對於必要事件ACTION_DOWN返回了true的onTouchEvent)

總結一下就是:onInterceptTouchEvent能夠接受到全部的Touch事件,而onTouchEvent則不一定。


http://hao3100590.iteye.com/blog/1267294

http://blog.csdn.net/liutao5757124/article/details/6097125

http://wenku.baidu.com/view/bcd001c608a1284ac850430c.html

http://www.2cto.com/kf/201109/104205.html

MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的行程順序
http://www.cnblogs.com/kingcent/archive/2011/03/08/1977064.html

http://glason.diandian.com/post/2011-12-19/12743121

http://www.cnblogs.com/kingcent/archive/2011/03/08/1977064.html

http://wenku.baidu.com/view/bcd001c608a1284ac850430c.html

http://blog.csdn.net/ddna/article/details/5473293

http://blog.csdn.net/ddna/article/details/5451722

http://blog.csdn.net/G_rrrr/article/details/4861189

官方文檔翻譯:
http://blog.csdn.net/iefreer/article/details/4586351



Android 手勢&觸摸事件 MotionEvent

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.