简述:
对于三个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结束这次事件