Android中dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent浅析

简述:

对于三个Touch进行分析测试


UI 设计如下

最底部是一个RelativeLayout

然后再上面添加一个重写了

dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent的自定义MyRelativeLayout

在这个自定义的layout上添加重写了自定义的MyButton

下面是代码:

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainRelativeLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    >
</RelativeLayout>

MyRelativeLayout.java

package com.atp.ui;

import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.LinearLayout;

public class MyRelativeLayout extends LinearLayout {

	public MyRelativeLayout(Context context) {
		super(context);
	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		Log.i("MyLinearLayouts", "dispatchTouchEvent! ");
		return super.dispatchTouchEvent(ev);
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		Log.i("MyLinearLayouts", "onTouchEvent! ");
		return super.onTouchEvent(event);
	}
	
	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		Log.i("MyLinearLayouts", "onInterceptTouchEvent! ");
		return super.onInterceptTouchEvent(ev);
	}

}

MyButton.java

package com.atp.ui;

import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Button;

public class MyButton extends Button {

	public MyButton(Context context) {
		super(context);
	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent event) {
		Log.i("MyButton", "dispatchTouchEvent! ");
		return super.dispatchTouchEvent(event);
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		Log.i("MyButton", "onTouchEvent! ");
		return super.onTouchEvent(event);
	}

}

MainActivity.java 主视图

package com.atp.ui;

import android.app.Activity;
import android.os.Bundle;
import android.widget.RelativeLayout;

import com.atp.R;

public class MainActivity extends Activity {

	private RelativeLayout mainLayout = null;
	private MyButton myBtn = null; 
	private MyRelativeLayout myRelativeLayout = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main_activity);
		mainLayout = (RelativeLayout) findViewById(R.id.mainRelativeLayout);
		myRelativeLayout = new MyRelativeLayout(this);
		myBtn = new MyButton(this);
		myBtn.setWidth(400);
		myBtn.setHeight(400);
		myBtn.setText("Touch Here!");
		myRelativeLayout.addView(myBtn);
		mainLayout.addView(myRelativeLayout);
	}
}

测试界面:



点击中心自定义的button后,观察到LogCat中的输出如下


发现顺序是

底层时间的dispatchTouchEvent先获取,然后再有OnInterceptTouchEvent处理,之后再交给上层的空间Button的dispatchTouchEvent处理,最后是onTouchEvent处理


如果在MyRelativeLayout中dispatchTouchEvent返回返回fasle或者true,那么只会执行以MyRelativeLayout中的dispatchTouchEvent之后就跳出

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		Log.i("MyLinearLayouts", "dispatchTouchEvent! ");
		return false;
	}

输出:



1)如果在MyRelativeLayout中没有重写dispatchTouchEvent, 那么就会转交给onInterceptTouchEvent处理,如果onInterceptTouchEvent返回false

然后就会,交给底下的MyButton处理

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		Log.i("MyLinearLayouts", "onInterceptTouchEvent! ");
		return false;
	}

输出如下



2)如果在MyRelative的重写方法onInterceptTouchEvent中返回true, 则会交给MyRelative中的onTouchEvent来处理事件

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		Log.i("MyLinearLayouts", "onInterceptTouchEvent! ");
		return true;
	}

则输出如下:




3)如果在MyRelativeLayout的重写方法onTouchEvent中返回false或者true,则都到该myRelativeLayout的onTouchEvent结束这次事件



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值