Android 基本事件
一、Android基本事件
1.onTouchEvent 觸摸事件(GestureDetector手勢操作類)
2.onKeyDown 鍵盤按下
3.onKeyLongPress 長按事件(鍵盤按下事件長)
4.onKeyUp 鍵盤鬆開
5.onKeyMultiple 鍵盤重複點擊
6.onBackPressed 返回事件
NOTE:鍵盤事件可以通過KeyEvent類擷取靜態成員變數(例如:KeyEvent.KEYCODE_BACK返回鍵監聽,判斷keyCode和KeyEvent.KEYCODE_BACK的值是否相等);螢幕事件通過event.getAction()擷取動作與MotionEvent.ACTION_DOWN和MotionEvent.ACTION_UP比較判斷是按下還是鬆開,在按下時擷取X和Y座標,鬆開時擷取X和Y座標,通過比較可以判斷是那個方向滑動,如果是複雜的手勢那就要通過GestureDetector類來操作了(個人建議使用這個類)。
二、onTouchEvent和onTouch的區別?(其他同理)
1.onTouch的使用:
public class TActivity extends Activity implements OnTouchListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.main);TextView tv = (TextView) findViewById(R.id.tv);tv.setOnTouchListener(this);}//onTouch的使用@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubswitch (event.getAction()) {case MotionEvent.ACTION_DOWN://按下break;case MotionEvent.ACTION_UP://釋放break;}return false;}}
2.onTouchEvent的使用:
public class TActivity extends Activity{@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubreturn super.onTouchEvent(event);}}
3.Android相關源碼:
public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { onUserInteraction(); } if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev);}總結:可以看到onTouchListener的介面的優先順序是要高於onTouchEvent的,假若onTouchListener中的onTouch方法返回true,那onTouchEvent是接收不到訊息的。 因為Button的performClick是利用onTouchEvent實現,假若onTouchEvent沒有被調用到,那麼Button的Click事件也無法響應。
三、GestureDetector手勢操作類解析
GestureDetector這個類對外提供了兩個介面:OnGestureListener,OnDoubleTapListener,還有一個內部類SimpleOnGestureListener。
1.實現介面:OnGestureListener
a.onDown() Touch down時觸發
b.onShowPress() Touch了還沒有滑動時觸發(與onDown,onLongPress)比較onDown只要Touch down一定立刻觸發。而Touchdown後過一會沒有滑動先觸發onShowPress再是onLongPress。所以Touchdown後一直不 滑動,onDown->onShowPress->onLongPress這個順序觸發。
c.onSingleTapUp() 上面這兩個函數都是在touch down後又沒有滑動(onScroll),又沒有長按(onLongPress),然後Touchup時觸發。
點擊一下非常快的(不滑動)Touchup:onDown->onSingleTapUp->onSingleTapConfirmed
點擊一下稍微慢點的(不滑動)Touchup:onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
d.onScroll() 在螢幕上拖動事件。無論是用手拖動view,或者是以拋的動作滾動,都會多次觸發,這個方法在ACTION_MOVE動作發生時就會觸發拋:手指觸動螢幕後,稍微滑動後立即鬆開onDown->onScroll->onScroll->onScroll->………->onFling拖動onDown->onScroll->onScroll->onFiling
e.onLongPress() Touch了不移動一直Touch down時觸發
f.onFling() 滑動手勢事件;Touch了滑動一點距離後,在ACTION_UP時才會觸發參數:e1 第1個ACTION_DOWN MotionEvent 並且只有一個;e2 最後一個ACTION_MOVE MotionEvent ;velocityX X軸上的移動速度,像素/秒 ;velocityY Y軸上的移動速度,像素/秒.觸發條件:X軸的座標位移大於FLING_MIN_DISTANCE,且移動速度大於FLING_MIN_VELOCITY個像素/秒
2.實現介面:OnDoubleTapListener
a.onSingleTapConfirmed() 用來判定該次點擊是SingleTap而不是DoubleTap,如果連續點擊兩次就是DoubleTap手勢,如果只點擊一次,系統等待一段時間後沒有收到第二次點擊則判定該次點擊為SingleTap而不是DoubleTap,然後觸發SingleTapConfirmed事件。這個方法不同於onSingleTapUp,他是在GestureDetector確信使用者在第一次觸控螢幕幕後,沒有緊跟著第二次觸控螢幕幕,也就是不是“雙擊”的時候觸發。
點擊一下非常快的(不滑動)Touchup:onDown->onSingleTapUp->onSingleTapConfirmed
點擊一下稍微慢點的(不滑動)Touchup:onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
b.onDoubleTap() 雙擊的第二下Touch down時觸發
c.onDoubleTapEvent() 通知DoubleTap手勢中的事件,包含down、up和move事件(這裡指的是在雙擊之間發生的事件,例如在同一個地方雙擊會產生DoubleTap手勢,而在DoubleTap手勢裡面還會發生down和up事件,這兩個事件由該函數通知);雙擊的第二下Touch down和up都會觸發,可用e.getAction()區分。
3.SimpleOnGestureListener類是GestureDetector提供給我們的一個更方便的響應不同手勢的類,這個類實現了上述兩個介面,我們可以通過繼承來重寫任意的方法。
NOTE:每個方法都有MotionEvent類的執行個體作為參數,我們可以通過這個執行個體和類操作。
這些都是基礎,載入一下供初學者學習,讓自己記憶更深刻,歡迎大家閱讀學習。