原文:http://www.cnblogs.com/yeshenyuege/articles/2415000.html android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。
1 <?xml version="1.0" encoding="utf-8"?> 2 <test.lzqdiy.MyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 android:gravity="center" > 7 <test.lzqdiy.MyTextView 8 android:layout_width="200px" 9 android:layout_height="200px" 10 android:id="@+id/tv" 11 android:text="lzqdiy" 12 android:textSize="40sp" 13 android:textStyle="bold" 14 android:background="#FFFFFF" 15 android:textColor="#0000FF"/> 16 </test.lzqdiy.MyLinearLayout>
1 package test.lzqdiy; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 6 public class TestTouchEventApp extends Activity { 7 /** Called when the activity is first created. */ 8 @Override 9 public void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.main); 12 } 13 } 14 package test.lzqdiy; 15 16 import android.content.Context; 17 import android.util.AttributeSet; 18 import android.util.Log; 19 import android.view.MotionEvent; 20 import android.widget.LinearLayout; 21 22 public class MyLinearLayout extends LinearLayout { 23 private final String TAG = "MyLinearLayout"; 24 25 public MyLinearLayout(Context context, AttributeSet attrs) { 26 27 super(context, attrs); 28 29 Log.d(TAG, TAG); 30 31 } 32 33 @Override 34 public boolean dispatchTouchEvent(MotionEvent ev) { 35 int action = ev.getAction(); 36 37 switch (action) { 38 39 case MotionEvent.ACTION_DOWN: 40 41 Log.d(TAG, "dispatchTouchEvent action:ACTION_DOWN"); 42 43 break; 44 45 case MotionEvent.ACTION_MOVE: 46 47 Log.d(TAG, "dispatchTouchEvent action:ACTION_MOVE"); 48 49 break; 50 51 case MotionEvent.ACTION_UP: 52 53 Log.d(TAG, "dispatchTouchEvent action:ACTION_UP"); 54 55 break; 56 57 case MotionEvent.ACTION_CANCEL: 58 59 Log.d(TAG, "dispatchTouchEvent action:ACTION_CANCEL"); 60 61 break; 62 63 } 64 return super.dispatchTouchEvent(ev); 65 } 66 67 @Override 68 public boolean onInterceptTouchEvent(MotionEvent ev) { 69 70 int action = ev.getAction(); 71 72 switch (action) { 73 74 case MotionEvent.ACTION_DOWN: 75 76 Log.d(TAG, "onInterceptTouchEvent action:ACTION_DOWN"); 77 78 break; 79 80 case MotionEvent.ACTION_MOVE: 81 82 Log.d(TAG, "onInterceptTouchEvent action:ACTION_MOVE"); 83 84 break; 85 86 case MotionEvent.ACTION_UP: 87 88 Log.d(TAG, "onInterceptTouchEvent action:ACTION_UP"); 89 90 break; 91 92 case MotionEvent.ACTION_CANCEL: 93 94 Log.d(TAG, "onInterceptTouchEvent action:ACTION_CANCEL"); 95 96 break; 97 98 } 99 100 return false; 101 102 } 103 104 @Override 105 public boolean onTouchEvent(MotionEvent ev) { 106 107 int action = ev.getAction(); 108 109 switch (action) { 110 111 case MotionEvent.ACTION_DOWN: 112 113 Log.d(TAG, "---onTouchEvent action:ACTION_DOWN"); 114 115 break; 116 117 case MotionEvent.ACTION_MOVE: 118 119 Log.d(TAG, "---onTouchEvent action:ACTION_MOVE"); 120 121 break; 122 123 case MotionEvent.ACTION_UP: 124 125 Log.d(TAG, "---onTouchEvent action:ACTION_UP"); 126 127 break; 128 129 case MotionEvent.ACTION_CANCEL: 130 131 Log.d(TAG, "---onTouchEvent action:ACTION_CANCEL"); 132 133 break; 134 135 } 136 137 return true; 138 } 139 140 }
1 package test.lzqdiy; 2 3 import android.content.Context; 4 import android.util.AttributeSet; 5 import android.util.Log; 6 import android.view.MotionEvent; 7 import android.widget.TextView; 8 9 public class MyTextView extends TextView { 10 11 private final String TAG = "MyTextView"; 12 13 public MyTextView(Context context, AttributeSet attrs) { 14 15 super(context, attrs); 16 17 } 18 19 @Override 20 public boolean dispatchTouchEvent(MotionEvent ev) { 21 int action = ev.getAction(); 22 23 switch (action) { 24 25 case MotionEvent.ACTION_DOWN: 26 27 Log.d(TAG, "dispatchTouchEvent action:ACTION_DOWN"); 28 29 break; 30 31 case MotionEvent.ACTION_MOVE: 32 33 Log.d(TAG, "dispatchTouchEvent action:ACTION_MOVE"); 34 35 break; 36 37 case MotionEvent.ACTION_UP: 38 39 Log.d(TAG, "dispatchTouchEvent action:ACTION_UP"); 40 41 break; 42 43 case MotionEvent.ACTION_CANCEL: 44 45 Log.d(TAG, "onTouchEvent action:ACTION_CANCEL"); 46 47 break; 48 49 } 50 return super.dispatchTouchEvent(ev); 51 } 52 53 @Override 54 public boolean onTouchEvent(MotionEvent ev) { 55 56 int action = ev.getAction(); 57 58 switch (action) { 59 60 case MotionEvent.ACTION_DOWN: 61 62 Log.d(TAG, "---onTouchEvent action:ACTION_DOWN"); 63 64 break; 65 66 case MotionEvent.ACTION_MOVE: 67 68 Log.d(TAG, "---onTouchEvent action:ACTION_MOVE"); 69 70 break; 71 72 case MotionEvent.ACTION_UP: 73 74 Log.d(TAG, "---onTouchEvent action:ACTION_UP"); 75 76 break; 77 78 case MotionEvent.ACTION_CANCEL: 79 80 Log.d(TAG, "---onTouchEvent action:ACTION_CANCEL"); 81 82 break; 83 84 } 85 86 return true; 87 88 } 89 90 }
第1种情况 L.onInterceptTouchEvent=false&& L.onTouchEvent=true &&T.onTouchEvent=true 输出下面的Log: D/MyLinearLayout(11865): dispatchTouchEvent action:ACTION_DOWN D/MyLinearLayout(11865): onInterceptTouchEvent action:ACTION_DOWN D/MyTextView(11865): dispatchTouchEvent action:ACTION_DOWN D/MyTextView(11865): ---onTouchEvent action:ACTION_DOWN D/MyLinearLayout(11865): dispatchTouchEvent action:ACTION_MOVE D/MyLinearLayout(11865): onInterceptTouchEvent action:ACTION_MOVE D/MyTextView(11865): dispatchTouchEvent action:ACTION_MOVE D/MyTextView(11865): ---onTouchEvent action:ACTION_MOVE ...........省略其他的ACTION_MOVE事件Log D/MyLinearLayout(11865): dispatchTouchEvent action:ACTION_UP D/MyLinearLayout(11865): onInterceptTouchEvent action:ACTION_UP D/MyTextView(11865): dispatchTouchEvent action:ACTION_UP D/MyTextView(11865): ---onTouchEvent action:ACTION_UP 结论:TouchEvent完全由TextView处理。 第2种情况 L.onInterceptTouchEvent=false&& L.onTouchEvent=true &&T.onTouchEvent=false 输出下面的Log: D/MyLinearLayout(13101): dispatchTouchEvent action:ACTION_DOWN D/MyLinearLayout(13101): onInterceptTouchEvent action:ACTION_DOWN D/MyTextView(13101): dispatchTouchEvent action:ACTION_DOWN D/MyTextView(13101): ---onTouchEvent action:ACTION_DOWN D/MyLinearLayout(13101): ---onTouchEvent action:ACTION_DOWN D/MyLinearLayout(13101): dispatchTouchEvent action:ACTION_MOVE D/MyLinearLayout(13101): ---onTouchEvent action:ACTION_MOVE ...........省略其他的ACTION_MOVE事件Log D/MyLinearLayout(13101): dispatchTouchEvent action:ACTION_UP D/MyLinearLayout(13101): ---onTouchEvent action:ACTION_UP 结论:TextView只处理了ACTION_DOWN事件,LinearLayout处理了所有的TouchEvent。 第3种情况 L.onInterceptTouchEvent=true&& L.onTouchEvent=true 输出下面的Log: D/MyLinearLayout(13334): dispatchTouchEvent action:ACTION_DOWN D/MyLinearLayout(13334): onInterceptTouchEvent action:ACTION_DOWN D/MyLinearLayout(13334): ---onTouchEvent action:ACTION_DOWN D/MyLinearLayout(13334): dispatchTouchEvent action:ACTION_MOVE D/MyLinearLayout(13334): ---onTouchEvent action:ACTION_MOVE ...........省略其他的ACTION_MOVE事件Log D/MyLinearLayout(13334): dispatchTouchEvent action:ACTION_UP D/MyLinearLayout(13334): ---onTouchEvent action:ACTION_UP 结论:LinearLayout处理了所有的TouchEvent。 第4种情况 L.onInterceptTouchEvent=true&& L.onTouchEvent=false 输出下面的Log: D/MyLinearLayout(13452): dispatchTouchEvent action:ACTION_DOWN D/MyLinearLayout(13452): onInterceptTouchEvent action:ACTION_DOWN D/MyLinearLayout(13452): ---onTouchEvent action:ACTION_DOWN 结论:LinearLayout只处理了ACTION_DOWN事件,那么其他的TouchEvent被谁处理了呢?答案是LinearLayout最外层的Activity处理了TouchEvent。
|