onInterceptTouchEvent()用于处理事件并改变事件的传递方向。处理事件这个不用说了,你在函数内部编写代码处理就可以了。而决定传递方向的是返回值,返回为false时事件会传递给子控件的onInterceptTouchEvent();返回值为true时事件会传递给当前控件的onTouchEvent(),而不在传递给子控件,这就是所谓的Intercept(截断)。
onTouchEvent() 用于处理事件,返回值决定当前控件是否消费(consume)了这个事件。可能你要问是否消费了又区别吗,反正我已经针对事件编写了处理代码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。
本文源地址:http://www.cnblogs.com/rocky_yi/archive/2011/01/21/1941522.html# ,转载请注明出处!
< com.touchstudy.LayoutView1 xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent" >
< com.touchstudy.LayoutView2
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent"
android:gravity ="center" >
< com.touchstudy.MyTextView
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:id ="@+id/tv"
android:text ="AB"
android:textSize ="40sp"
android:textStyle ="bold"
android:background ="#FFFFFF"
android:textColor ="#0000FF" />
</ com.touchstudy.LayoutView2 >
</ com.touchstudy.LayoutView1 >
在没有重写onInterceptTouchEvent()和onTouchEvent()的情况下(他们的返回值都是false), 对上面这个布局,MotionEvent事件的传递顺序如下:
当某个控件的onInterceptTouchEvent()返回值为true时,就会发生截断,事件被传到当前控件的onTouchEvent()。如我们将LayoutView2的onInterceptTouchEvent()返回值为true,则传递流程变成:
如果我们同时将LayoutView2的onInterceptTouchEvent()和onTouchEvent()设置成true,那么LayoutView2将消费被传递的事件,同时后续事件(如跟着ACTION_DOWN的ACTION_MOVE或者ACTION_UP)会直接传给LayoutView2的onTouchEvent(),不传给其他任何控件的任何函数。同时传递给子空间一个ACTION_CANCEL事件。传递流程变成(图中没有画出ACTION_CANCEL事件):
附SDK给出的说明:
示例对应的Java代码(来自http://blog.csdn.net/ddna/archive/2010/04/11/5473293.aspx)
代码
public class InterceptTouchStudyActivity extends Activity {
static final String TAG = " ITSActivity " ;
TextView tv;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.layers_touch_pass_test);
}
}
// LayoutView1.java:
public class LayoutView1 extends LinearLayout {
private final String TAG = " LayoutView1 " ;
public LayoutView1(Context context, AttributeSet attrs) {
super (context, attrs);
Log.d(TAG,TAG);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
Log.d(TAG, " onInterceptTouchEvent action:ACTION_DOWN " );
// return true;
break ;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, " onInterceptTouchEvent action:ACTION_MOVE " );
break ;
case MotionEvent.ACTION_UP:
Log.d(TAG, " onInterceptTouchEvent action:ACTION_UP " );
break ;
case MotionEvent.ACTION_CANCEL:
Log.d(TAG, " onInterceptTouchEvent action:ACTION_CANCEL " );
break ;
}
return false ;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
Log.d(TAG, " onTouchEvent action:ACTION_DOWN " );
break ;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, " onTouchEvent action:ACTION_MOVE " );
break ;
case MotionEvent.ACTION_UP:
Log.d(TAG, " onTouchEvent action:ACTION_UP " );
break ;
case MotionEvent.ACTION_CANCEL:
Log.d(TAG, " onTouchEvent action:ACTION_CANCEL " );
break ;
}
return true ;
}
@Override
protected void onLayout( boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
super .onLayout(changed, l, t, r, b);
}
@Override
protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super .onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
// LayoutView2.java:
public class LayoutView2 extends LinearLayout {
private final String TAG = " LayoutView2 " ;
public LayoutView2(Context context, AttributeSet attrs) {
super (context, attrs);
Log.d(TAG,TAG);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
Log.d(TAG, " onInterceptTouchEvent action:ACTION_DOWN " );
break ;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, " onInterceptTouchEvent action:ACTION_MOVE " );
break ;
case MotionEvent.ACTION_UP:
Log.d(TAG, " onInterceptTouchEvent action:ACTION_UP " );
break ;
case MotionEvent.ACTION_CANCEL:
Log.d(TAG, " onInterceptTouchEvent action:ACTION_CANCEL " );
break ;
}
return false ;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
Log.d(TAG, " onTouchEvent action:ACTION_DOWN " );
break ;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, " onTouchEvent action:ACTION_MOVE " );
break ;
case MotionEvent.ACTION_UP:
Log.d(TAG, " onTouchEvent action:ACTION_UP " );
break ;
case MotionEvent.ACTION_CANCEL:
Log.d(TAG, " onTouchEvent action:ACTION_CANCEL " );
break ;
}
return true ;
}
}
// MyTextView.java:
public class MyTextView extends TextView {
private final String TAG = " MyTextView " ;
public MyTextView(Context context, AttributeSet attrs) {
super (context, attrs);
Log.d(TAG,TAG);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
Log.d(TAG, " onTouchEvent action:ACTION_DOWN " );
break ;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, " onTouchEvent action:ACTION_MOVE " );
break ;
case MotionEvent.ACTION_UP:
Log.d(TAG, " onTouchEvent action:ACTION_UP " );
break ;
case MotionEvent.ACTION_CANCEL:
Log.d(TAG, " onTouchEvent action:ACTION_CANCEL " );
break ;
}
return false ;
}
public void onClick(View v) {
Log.d(TAG, " onClick " );
}
public boolean onLongClick(View v) {
Log.d(TAG, " onLongClick " );
return false ;
}
}