事件的基礎:按下,移動,擡起。android
首先執行的是按下,其次可能執行的是移動,最後執行的擡起。ide
android事件傳遞機制:post
android事件傳遞按上到下進行層級傳遞,事件處理從 activity 到 viewGroup 再到 view.this
view和viewGroup對事件的響應方法(即傳遞方法):spa
dispatchTouchEvent(): 對事件的分發。 return true, 不繼續分發。 事件
return false,繼續往下一層級分發it
onTouchEvent(): 對事件的處理。 return true 表示消費處理當前事件,event
return false 則不處理,交給子控件進行繼續分發ast
onInterceptTouchEvent():對事件的攔截 (注意點:viewGroup纔有)
return true 攔截當前事件,不繼續往下分發,交給自身的onTouchEvent進行處理。基礎
return false 則不攔截,繼續往下傳。
1.onTouch事件要先於onClick事件執行
2.onTouch在事件分發方法dispatchTouchEvent中調用,
3.而onClick在事件處理方法onTouchEvent中被調用
4.onTouchEvent()要後於dispatchTouchEvent方法的調用
小案例:雙擊退出
/*
* 雙擊退出的原理:
* 經過一個變量來判斷,
* handler.postDelayed():延遲多久時間後恢復變量的原來狀態
*/
boolean is2CallBack=false;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
if(!is2CallBack){
is2CallBack=true;
Toast.makeText(MainActivity.this, "再次點擊退出",Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
public void run() {
is2CallBack=false;
}
}, 3*1000);
}
else{
android.os.Process.killProcess(android.os.Process.myPid());
}
}
return true;
}
注意點:
// 在tabactiivty及其子類沒法響應中onkeydown(),onkeyup()。因此要換成dispatchKeyEvent()