原文地址:http://blog.csdn.net/linux_loajie/article/details/7720920
進行Android觸摸屏的程序設計與開發已有三個月的時間了,在這期間,通過無數次的嘗試和手勢設計,學到了很多知識,下面將我總結的分享給大家。
多點觸控
getX是獲取以widget左上角爲座標原點計算的X軸座標直。
getRawX 獲取的是以屏幕左上角爲座標原點計算的X軸座標直。
event.getAction() //獲取觸控動作比如ACTION_DOWN
event.getPointerCount(); //獲取觸控點的數量,比如2則可能是兩個手指同時按壓屏幕
event.getPointerId(nID); //對於每個觸控的點的細節,我們可以通過一個循環執行getPointerId方法獲取索引
event.getX(nID); //獲取第nID個觸控點的x位置
event.getY(nID); //獲取第nID個點觸控的y位置
event.getPressure(nID); //LCD可以感應出用戶的手指壓力,當然具體的級別由驅動和物理硬件決定的
event.getDownTime() //按下開始時間
event.getEventTime() // 事件結束時間
event.getEventTime()-event.getDownTime()); //總共按下時花費時間
事件偵聽器
事件偵聽器是視圖View類的接口,包含一個單獨的回調方法。這些方法將在視圖中註冊的偵聽器被用戶界面操作觸發時由Android框架調用。下面這些回調方法被包含在事件偵聽器接口中:
onClick()
包含於View.OnClickListener。當用戶觸摸這個item(在觸摸模式下),或者通過瀏覽鍵或跟蹤球聚焦在這個item上,然後按下“確認”鍵或者按下跟蹤球時被調用。
onLongClick()
包含於View.OnLongClickListener。當用戶觸摸並控制住這個item(在觸摸模式下),或者通過瀏覽鍵或跟蹤球聚焦在這個item上,然後保持按下“確認”鍵或者按下跟蹤球(一秒鐘)時被調用。
onFocusChange()
包含於View.OnFocusChangeListener。當用戶使用瀏覽鍵或跟蹤球瀏覽進入或離開這個item時被調用。
onKey()
包含於View.OnKeyListener。當用戶聚焦在這個item上並按下或釋放設備上的一個按鍵時被調用。
onTouch()
包含於View.OnTouchListener。當用戶執行的動作被當做一個觸摸事件時被調用,包括按下,釋放,或者屏幕上任何的移動手勢(在這個item的邊界內)。
onCreateContextMenu()
包含於View.OnCreateContextMenuListener。當正在創建一個上下文菜單的時候被調用(作爲持續的“長點擊”動作的結果)。
事件處理器Event Handlers
如果你從視圖創建一個自定義組件,那麼你將能夠定義一些回調方法被用作缺省的事件處理器。在創建自定義組件Building Custom Components的文檔中,你將學習到一些用作事件處理的通用回調函數,包括:
onKeyDown(int, KeyEvent) – 當一個新的按鍵事件發生時被調用。
onKeyUp(int, KeyEvent) – 當一個向上鍵事件發生時被調用。
onTrackballEvent(MotionEvent) – 當一個跟蹤球運動事件發生時被調用。
onTouchEvent(MotionEvent) – 當一個觸摸屏移動事件發生時調用。
onFocusChanged(boolean, int, Rect) – 當視圖獲得或者丟失焦點時被調用。
你應該知道還有一些其它方法,並不屬於視圖類的一部分,但可以直接影響你處理事件的方式。所以,當在一個佈局裏管理更復雜的事件時,考慮一下這些方法:
Activity.dispatchTouchEvent(MotionEvent) – 這允許你的活動可以在分發給窗口之前捕獲所有的觸摸事件。
ViewGroup.onInterceptTouchEvent(MotionEvent) – 這允許一個視圖組ViewGroup 在分發給子視圖時觀察這些事件。ViewParent.requestDisallowInterceptTouchEvent(boolean) – 在一個父視圖之上調用這個方法來表示它不應該通過onInterceptTouchEvent(MotionEvent)來捕獲觸摸事件。
viewGroup的dispatchTouchEvent方法會在其onInterceptTouchEvent方法之前被觸發。
首先觸發ACTIVITY的dispatchTouchEvent
然後觸發ACTIVITY的onUserInteraction
然後觸發LAYOUT的dispatchTouchEvent
然後觸發LAYOUT的onInterceptTouchEvent
總結:
1. 點擊屏幕上的某項的執行流程 有兩種情況,一種是時間很短,一種時間稍長
時間很短:onDown——–》onSingleTapUp——–》onSingleTapConfirmed
時間稍長:onDown——–》onShowPress——》onSingleTapUp——–》onSingleTapConfirmed
2. 長按事件
onDown——–》onShowPress——》onLongPress
3.拋:手指觸動屏幕後,稍微滑動後立即鬆開
onDown—–》onscroll—-》onscroll—-》onscroll—-》………—–>onFling
4.拖動
onDown——》onscroll—-》onscroll——》onFiling
注意:有的時候會觸發onFiling,但是有的時候不會觸發有可能是人的動作不標準所致。
boolean onDoubleTap(MotionEvent e)
//雙擊的第二下Touch down時觸發
boolean onDoubleTapEvent(MotionEvent e)
//雙擊的第二下Touch down和up都會觸發,可用e.getAction()區分。
boolean onDown(MotionEvent e)
//Touch down時觸發
boolean onFling(MotionEvent e1 MotionEvent e2 float velocityX float velocityY)
//Touch了滑動一點距離後,up時觸發。
void onLongPress(MotionEvent e)
//Touch了不移動一直Touch down時觸發
boolean onscroll(MotionEvent e1 MotionEvent e2 float distanceX float distanceY)
//Touch了滑動時觸發。
void onShowPress(MotionEvent e)
//Touch了還沒有滑動時觸發
(與onDown,onLongPress比較onDown只要Touch down一定立刻觸發。而Touchdown後過一會沒有滑動先觸發onShowPress再是onLongPress。所以Touchdown後一直不滑動,onDown->onShowPress->onLongPress這個順序觸發。)
boolean onSingleTapConfirmed(MotionEvent e)
boolean onSingleTapUp(MotionEvent e)
//上面這兩個函數都是在touch down後又沒有滑動(onscroll),又沒有長按(onLongPress),然後Touchup時觸發。
//點擊一下非常快的(不滑動)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
//點擊一下稍微慢點的(不滑動)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed