編輯:關於Android編程
public boolean dispatchTouchEvent(MotionEvent event) //事件分發 public boolean onTouchEvent(MotionEvent event) //事件處理
public boolean dispatchTouchEvent(MotionEvent event) //事件分發 public boolean onTouchEvent(MotionEvent event) //事件處理 public boolean onInterceptTouchEvent(MotionEvent event) //事件攔截3,事件響應:
按下(ACTION_DOWN)
移動(ACTION_MOVE)
抬起(ACTION_UP)
取消(ACTION_CANCEL)
當在“移動事件”中喚醒“取消事件”,就會存在沒有“抬起事件”。【特例】OnClickListener //點擊事件 OnLongClickListener //長按事件 OnTouchListener //觸摸監聽器
二、案例分析
1,EDButton
View類的子類,實現View類的事件分發機制模擬。
/**
* 功能描述:Button繼承類,重寫事件分發與事件處理【理清事件分發機制】
* 時間:2016/8/5
* 作者:vision
*/
public class EDButton extends Button {
private static final String TAG = "EDButton";
public EDButton(Context context) {
super(context);
}
public EDButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.print("EBButton -- dispatchTouchEvent -- ACTION_DOWN");
Log.i(TAG, "EBButton -- dispatchTouchEvent -- ACTION_DOWN");
break;
case MotionEvent.ACTION_UP:
System.out.print("EBButton -- dispatchTouchEvent -- ACTION_UP");
Log.i(TAG, "EBButton -- dispatchTouchEvent -- ACTION_UP");
break;
case MotionEvent.ACTION_MOVE:
System.out.print("EBButton -- dispatchTouchEvent -- ACTION_MOVE");
Log.i(TAG, "EBButton -- dispatchTouchEvent -- ACTION_MOVE");
break;
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.print("EBButton -- onTouchEvent -- ACTION_DOWN");
Log.i(TAG, "EBButton -- onTouchEvent -- ACTION_DOWN");
break;
case MotionEvent.ACTION_UP:
System.out.print("EBButton -- onTouchEvent -- ACTION_UP");
Log.i(TAG, "EBButton -- onTouchEvent -- ACTION_UP");
break;
case MotionEvent.ACTION_MOVE:
System.out.print("EBButton -- onTouchEvent -- ACTION_MOVE");
Log.i(TAG, "EBButton -- onTouchEvent -- ACTION_MOVE");
break;
}
return super.onTouchEvent(event);
}
}
2,EDViewGroup
/**
* 功能描述:測試ViewGroup的事件分發
* 時間:2016/8/8
* 作者:vision
*/
public class EDViewGroup extends LinearLayout {
private static final String TAG = "EDViewGroup";
public EDViewGroup(Context context) {
super(context);
}
public EDViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.print("EDViewGroup -- dispatchTouchEvent -- ACTION_DOWN");
Log.i(TAG, "EDViewGroup -- dispatchTouchEvent -- ACTION_DOWN");
break;
case MotionEvent.ACTION_UP:
System.out.print("EDViewGroup -- dispatchTouchEvent -- ACTION_UP");
Log.i(TAG, "EDViewGroup -- dispatchTouchEvent -- ACTION_UP");
break;
case MotionEvent.ACTION_MOVE:
System.out.print("EDViewGroup -- dispatchTouchEvent -- ACTION_MOVE");
Log.i(TAG, "EDViewGroup -- dispatchTouchEvent -- ACTION_MOVE");
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.print("EDViewGroup -- onTouchEvent -- ACTION_DOWN");
Log.i(TAG, "EDViewGroup -- onTouchEvent -- ACTION_DOWN");
break;
case MotionEvent.ACTION_UP:
System.out.print("EDViewGroup -- onTouchEvent -- ACTION_UP");
Log.i(TAG, "EDViewGroup -- onTouchEvent -- ACTION_UP");
break;
case MotionEvent.ACTION_MOVE:
System.out.print("EDViewGroup -- onTouchEvent -- ACTION_MOVE");
Log.i(TAG, "EDViewGroup -- onTouchEvent -- ACTION_MOVE");
break;
}
return super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.print("EDViewGroup -- onInterceptTouchEvent -- ACTION_DOWN");
Log.i(TAG, "EDViewGroup -- onInterceptTouchEvent -- ACTION_DOWN");
break;
case MotionEvent.ACTION_UP:
System.out.print("EDViewGroup -- onInterceptTouchEvent -- ACTION_UP");
Log.i(TAG, "EDViewGroup -- onInterceptTouchEvent -- ACTION_UP");
break;
case MotionEvent.ACTION_MOVE:
System.out.print("EDViewGroup -- onInterceptTouchEvent -- ACTION_MOVE");
Log.i(TAG, "EDViewGroup -- onInterceptTouchEvent -- ACTION_MOVE");
break;
}
// return super.onInterceptTouchEvent(ev);
return true;
}
}
單獨事件分發測試界面展示:
3,結果展示:







Android中事件傳遞按照從上到下進行層級傳遞,事件處理從Activity開始到ViewGroup再到View。
View事件傳遞方法包括dispatchTouchEvent、onTouchEvent,表示事件分發,事件處理;
ViewGroup事件傳遞方法包括dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent,
表示事件分發,事件處理,事件攔截。
onTouch事件要先於onClick事件執行,onTouch在事件分發方法dispatchTouchEvent中調用,
而 onClick在事件處理方法onTouchEvent中被調用,onTouchEvent要後於dispatchTouchEvent方法的調用。
事件處理分發,實例實現相對較容易,主要在於邏輯的理解與實現。後續需要從源碼的角度深層次理解相互調用關系。
Android drawPath實現QQ拖拽泡泡
這兩天學習了使用Path繪制貝塞爾曲線相關,然後自己動手做了一個類似QQ未讀消息可拖拽的小氣泡,效果圖如下:接下來一步一步的實現整個過程。基本原理其實就是使用Path繪制
Android Studio基礎設置和常用操作
熟練掌握開發工具的使用,可以提高我們的開發效率,減少很多工作量!首先介紹一些常用設置:一、代碼默認字體12,偏小,一般設置14: 二、窗口白色比較刺眼,系統有個
Widevine *DRM and Keybox
DRM In this document Overview Android DRM FrameworkWidevine DR
Android計算器編寫代碼
其實這個安卓計算機,所有的後台思想與《C#計算器編寫代碼》是一模一樣的。Win窗體程序移植到安卓,從C#到Java其實很簡單的,因為兩者的基本語法都很相像,唯一的難點是安