public boolean onInterceptTouchEvent (MotionEvent ev);
这个接口用来实现拦截所有手势事件。通过设置断点可以验证会先走到onInterceptTouchEvent。
public boolean onTouchEvent (MotionEvent event);
onTouchEvent同样也是在view中定义的一个方法。处理传递到view 的手势事件。手势事件类型
包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL等事件。
可以通过设置onInterceptTouchEvent 和onTouchEvent的返回值来查看实现机制。
layout文件如下
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.test_interceptevent.MainActivity" >
<com.example.test_interceptevent.MyLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:orientation="vertical" >
<com.example.test_interceptevent.MyInnerLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<com.example.test_interceptevent.MyButton
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" >
</com.example.test_interceptevent.MyButton>
<com.example.test_interceptevent.MyButton
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button">
</com.example.test_interceptevent.MyButton>
</com.example.test_interceptevent.MyInnerLayout>
</com.example.test_interceptevent.MyLayout>
</RelativeLayout>
MyLayout.java
package com.example.test_interceptevent;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.LinearLayout;
public class MyLayout extends LinearLayout {
public MyLayout(Context context, AttributeSet attrs) {
this(context, attrs,0);
// TODO Auto-generated constructor stub
}
public MyLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
@Override
public boolean onInterceptTouchEvent(MotionEvent me)
{
super.onInterceptTouchEvent(me);
Log.d("[MyLayout Tag:]", "onInterceptTouchEvent");
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
boolean bret = false;
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
Log.d("[MyLayout Tag:]", "onTouchEvent ACTION_DOWN");
bret = false;
break;
case MotionEvent.ACTION_UP:
Log.d("[MyLayout Tag:]", "onTouchEvent ACTION_UP");
bret = true;
break;
case MotionEvent.ACTION_CANCEL:
Log.d("[MyLayout Tag:]", "onTouchEvent ACTION_CANCEL");
bret = true;
break;
case MotionEvent.ACTION_MOVE:
Log.d("[MyLayout Tag:]", "onTouchEvent ACTION_MOVE");
bret = true;
break;
}
return bret;
}
}
MyInnerLayout.java
package com.example.test_interceptevent;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.LinearLayout;
public class MyInnerLayout extends LinearLayout {
public MyInnerLayout(Context context, AttributeSet attrs) {
this(context, attrs,0);
// TODO Auto-generated constructor stub
}
public MyInnerLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
@Override
public boolean onInterceptTouchEvent(MotionEvent me)
{
super.onInterceptTouchEvent(me);
Log.d("[MyInnerLayout Tag:]", "onInterceptTouchEvent");
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
boolean bret = false;
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
Log.d("[MyInnerLayout Tag:]", "onTouchEvent ACTION_DOWN");
bret = true;
break;
case MotionEvent.ACTION_UP:
Log.d("[MyInnerLayout Tag:]", "onTouchEvent ACTION_UP");
bret = true;
break;
case MotionEvent.ACTION_CANCEL:
Log.d("[MyInnerLayout Tag:]", "onTouchEvent ACTION_CANCEL");
bret = true;
break;
case MotionEvent.ACTION_MOVE:
Log.d("[MyInnerLayout Tag:]", "onTouchEvent ACTION_MOVE");
bret = true;
break;
}
return bret;
}
}
MyButton.java
package com.example.test_interceptevent;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Button;
public class MyButton extends Button {
public MyButton(Context context, AttributeSet attrs) {
this(context, attrs,0);
// TODO Auto-generated constructor stub
}
public MyButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
}
得到如下结论:
1.当MyLayout的onInterceptTouchEvent返回true时其子ViewGroup就无法收到手势消息
2.当MyLayout的onTouchEvent在响应event.getAction()为MotionEvent.ACTION_DOWN
的消息时返回true后续的手势消息在onTouchEvent中处理,返回false无法处理后续手势消息
3.当MyLayout的onInterceptTouchEvent返回false时其子ViewGroup就可以收到手势消息