View中onTouchEvent方法返回值对事件传递的影响
以Button的子类MyButton为例说明,通过改变onTouchEvent函数的返回值和输出来判断代码的执行,MyButton代码如下
以鼠标down到up的完成作为一次完整的事件,中间可能包括移动事件等
假如 在一次完整的touch事件中包含如下的分事件
down --- move --- up
重写Button的onTouchEvent方法,如果方法返回true,那么包括down、move、up这三个事件的事件对象都会被传递给控件的onTouchEvent方法,但是如果方法返回false,那么控件只会收到down事件的事件对象,而move 和 up的事件对象则不会收到,这就是onTouchEvent事件中返回true和false的区别
ViewGroup中onInterceptTouchEvent返回值对touch事件传递的影响
onInterceptTouchEvent的返回值有两种true和false
返回true时
如果返回值为true,那么该ViewGroup下的所有View控件都不会收到touch事件,事件对象只会传递给ViewGroup的onTouchEvent函数
返回false
如果返回false,那么touch事件对象会先传递到该函数,然后再传递到target's onTouchEvent对象,通过实验结果得出的结论是这样的
布局文件,
重写onInterceptTouchEvent方法返回false,
在布局文件中引用该布局方式,在布局中添加MyButton控件
那么当单击Button时,touch事件先传递到onInterceptTouchEvent,然后传递给Mybutton的onTouchEvent方法,而不会传递给MyLinearLayout的onTouchEvent方法,如果单击MyButton之外的空白区域,那么touch事件会先传递给MyLinearLayout的onInterceptTouchEvent方法,然后传递给MyLinearLayout的onTouchEvent方法。
以Button的子类MyButton为例说明,通过改变onTouchEvent函数的返回值和输出来判断代码的执行,MyButton代码如下
package com.android.activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;
public class MyButton extends Button{
public MyButton(Context context) {
super(context);
}
public MyButton(Context context, AttributeSet attrs) {
super(context,attrs);
}
public MyButton(Context context,AttributeSet attrs,int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//super.onTouchEvent(event);
System.out.println(1111);
return true;
}
}
布局文件
<LinearLayout 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:orientation="vertical"
tools:context=".MyTextActivity" >
<com.android.activity.MyButton
android:id="@+id/myTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</LinearLayout>
以鼠标down到up的完成作为一次完整的事件,中间可能包括移动事件等
假如 在一次完整的touch事件中包含如下的分事件
down --- move --- up
重写Button的onTouchEvent方法,如果方法返回true,那么包括down、move、up这三个事件的事件对象都会被传递给控件的onTouchEvent方法,但是如果方法返回false,那么控件只会收到down事件的事件对象,而move 和 up的事件对象则不会收到,这就是onTouchEvent事件中返回true和false的区别
ViewGroup中onInterceptTouchEvent返回值对touch事件传递的影响
onInterceptTouchEvent的返回值有两种true和false
返回true时
如果返回值为true,那么该ViewGroup下的所有View控件都不会收到touch事件,事件对象只会传递给ViewGroup的onTouchEvent函数
返回false
如果返回false,那么touch事件对象会先传递到该函数,然后再传递到target's onTouchEvent对象,通过实验结果得出的结论是这样的
假设MyLinearLayout继承了LinearLayout(LinearLayout 属于ViewGroup),MyLinearLayout代码如下
package com.android.activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;
public class MyLinearLayout extends LinearLayout{
public MyLinearLayout(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
System.out.println("Intercept");
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println("Intercept onTouch");
return true;
}
}
布局文件,
<com.android.activity.MyLinearLayout 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:orientation="vertical"
tools:context=".MyTextActivity" >
<com.android.activity.MyButton
android:id="@+id/myTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</com.android.activity.MyLinearLayout>
重写onInterceptTouchEvent方法返回false,
在布局文件中引用该布局方式,在布局中添加MyButton控件
那么当单击Button时,touch事件先传递到onInterceptTouchEvent,然后传递给Mybutton的onTouchEvent方法,而不会传递给MyLinearLayout的onTouchEvent方法,如果单击MyButton之外的空白区域,那么touch事件会先传递给MyLinearLayout的onInterceptTouchEvent方法,然后传递给MyLinearLayout的onTouchEvent方法。