android中View和ViewGroup对touch事件对象的处理方法

View中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方法。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值