Android觸摸屏開發知識彙總

原文地址: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章