结合日志分析View事件的传递
此次分析view事件传递步骤如下:
1、编写MyButton继承Button,增加日志输出
2、将MyButton在布局中进行应用
3、增加Activity中的日志输出
下列是文章中涉及的代码以及相关的布局xml:
package com.eshore.test.view;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
/**
* Created by Administrator on 2017/8/15.
*/
public class MyButton extends android.support.v7.widget.AppCompatButton {
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* MyButton的分发触摸事件
* @param event
* @return
*/
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.i("MyButton-->:","dispatchTouchEvent-->ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.i("MyButton-->:","dispatchTouchEvent-->ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.i("MyButton-->:","dispatchTouchEvent-->ACTION_UP");
break;
}
return super.dispatchTouchEvent(event);
}
/**
* MyButton触摸事件
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.i("MyButton-->:","onTouchEvent-->ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.i("MyButton-->:","onTouchEvent-->ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.i("MyButton-->:","onTouchEvent-->ACTION_UP");
break;
}
return super.onTouchEvent(event);
}
}
在布局中进行应用,如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.eshore.test.view.MyButton
android:layout_width="300dp"
android:layout_height="200dp"
android:background="@color/colorAccent"
android:layout_gravity="center"/>
</LinearLayout>
Activity中的代码为:
package com.eshore.test;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
Log.i("MainActivity-->:","dispatchTouchEvent-->ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.i("MainActivity-->:","dispatchTouchEvent-->ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.i("MainActivity-->:","dispatchTouchEvent-->ACTION_UP");
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.i("MainActivity-->:","onTouchEvent-->ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.i("MainActivity-->:","onTouchEvent-->ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.i("MainActivity-->:","onTouchEvent-->ACTION_UP");
break;
}
return super.onTouchEvent(event);
}
}
通过改变MyButton中dispatchTouchEvent,onTouchEvent方法以及Activity中dispatchTouchEvent,onTouchEvent方法的返回值,通过日志打印查看view的事件传递。
1、不修改任何返回值,日志输出如下:
08-16 11:52:27.986 24538-24538/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 11:52:27.987 24538-24538/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 11:52:27.987 24538-24538/com.eshore.test I/MyButton-->:: onTouchEvent-->ACTION_DOWN
08-16 11:52:28.023 24538-24538/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 11:52:28.023 24538-24538/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 11:52:28.023 24538-24538/com.eshore.test I/MyButton-->:: onTouchEvent-->ACTION_MOVE
08-16 11:52:28.074 24538-24538/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_UP
08-16 11:52:28.074 24538-24538/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_UP
08-16 11:52:28.074 24538-24538/com.eshore.test I/MyButton-->:: onTouchEvent-->ACTION_UP
从日中看出View事件的传递为 Activity(dispatchTouchEvent)–>MyButton(dispatchTouchEvent)–>MyButton(onTouchEvent)
2、将Activity中dispatchTouchEvent方法直接返回true/false
08-16 11:58:01.542 30497-30497/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 11:58:01.626 30497-30497/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 11:58:01.627 30497-30497/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_UP
从日志中可看出view事件不会往下传递,也不会触发Activity中onTouchEvent 方法
3、将Activity中的onTouchEvent方法直接返回true/false
08-16 12:00:17.690 1296-1296/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 12:00:17.690 1296-1296/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 12:00:17.691 1296-1296/com.eshore.test I/MyButton-->:: onTouchEvent-->ACTION_DOWN
08-16 12:00:17.779 1296-1296/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 12:00:17.780 1296-1296/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 12:00:17.780 1296-1296/com.eshore.test I/MyButton-->:: onTouchEvent-->ACTION_MOVE
08-16 12:00:17.780 1296-1296/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_UP
08-16 12:00:17.781 1296-1296/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_UP
08-16 12:00:17.781 1296-1296/com.eshore.test I/MyButton-->:: onTouchEvent-->ACTION_UP
从日中中看出,view事件传递不受影响
4、将MyButton中dispatchTouchEvent 方法直接返回true
08-16 14:32:00.810 21176-21176/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 14:32:00.811 21176-21176/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 14:32:00.869 21176-21176/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 14:32:00.869 21176-21176/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 14:32:00.933 21176-21176/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 14:32:00.933 21176-21176/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 14:32:00.934 21176-21176/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_UP
08-16 14:32:00.934 21176-21176/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_UP
从日志中发现Avtivity,MyButton中onTouchEvent方法均不执行
5、将MyButton中dispatchTouchEvent 方法直接返回false
08-16 14:33:18.093 22479-22479/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 14:33:18.093 22479-22479/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 14:33:18.093 22479-22479/com.eshore.test I/MainActivity-->:: onTouchEvent-->ACTION_DOWN
08-16 14:33:18.152 22479-22479/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 14:33:18.152 22479-22479/com.eshore.test I/MainActivity-->:: onTouchEvent-->ACTION_MOVE
08-16 14:33:18.169 22479-22479/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 14:33:18.169 22479-22479/com.eshore.test I/MainActivity-->:: onTouchEvent-->ACTION_MOVE
08-16 14:33:18.176 22479-22479/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 14:33:18.176 22479-22479/com.eshore.test I/MainActivity-->:: onTouchEvent-->ACTION_MOVE
08-16 14:33:18.177 22479-22479/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_UP
08-16 14:33:18.177 22479-22479/com.eshore.test I/MainActivity-->:: onTouchEvent-->ACTION_UP
从日志中发现MyButton中dispatchTouchEvent,onTouchEvent均不执行
6、将MyButton中onTouchEvent方法直接返回true
08-16 14:35:40.765 24813-24813/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 14:35:40.765 24813-24813/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 14:35:40.766 24813-24813/com.eshore.test I/MyButton-->:: onTouchEvent-->ACTION_DOWN
08-16 14:35:40.776 24813-24813/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 14:35:40.776 24813-24813/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 14:35:40.777 24813-24813/com.eshore.test I/MyButton-->:: onTouchEvent-->ACTION_MOVE
08-16 14:35:40.835 24813-24813/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_UP
08-16 14:35:40.835 24813-24813/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_UP
08-16 14:35:40.835 24813-24813/com.eshore.test I/MyButton-->:: onTouchEvent-->ACTION_UP
从日志中发现view事件传递无影响
7、将MyButton中onTouchEvent方法直接返回false
08-16 14:36:22.339 25427-25427/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 14:36:22.341 25427-25427/com.eshore.test I/MyButton-->:: dispatchTouchEvent-->ACTION_DOWN
08-16 14:36:22.341 25427-25427/com.eshore.test I/MyButton-->:: onTouchEvent-->ACTION_DOWN
08-16 14:36:22.341 25427-25427/com.eshore.test I/MainActivity-->:: onTouchEvent-->ACTION_DOWN
08-16 14:36:22.371 25427-25427/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 14:36:22.372 25427-25427/com.eshore.test I/MainActivity-->:: onTouchEvent-->ACTION_MOVE
08-16 14:36:22.388 25427-25427/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 14:36:22.388 25427-25427/com.eshore.test I/MainActivity-->:: onTouchEvent-->ACTION_MOVE
08-16 14:36:22.394 25427-25427/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_MOVE
08-16 14:36:22.395 25427-25427/com.eshore.test I/MainActivity-->:: onTouchEvent-->ACTION_MOVE
08-16 14:36:22.395 25427-25427/com.eshore.test I/MainActivity-->:: dispatchTouchEvent-->ACTION_UP
08-16 14:36:22.395 25427-25427/com.eshore.test I/MainActivity-->:: onTouchEvent-->ACTION_UP
从日志中发现MyButton中dispatchTouchEvent,onTouchEvent均不执行
经上述7点结论如下:
1、view事件的传递为从Activity(dispatchTouchEvent)–>view(dispatchTouchEvent)–>view(onTouchEvent)
2、view中重写dispatchTouchEvent方法直接返回true,view中onTouchEvent方法将不执行,Activity中onTouchEvent方法将不执行;
直接返回false,view中onTouchEvent方法将不执行,Activity中onTouchEvent方法将执行
3、view中重写onTouchEvent方法,直接返回true,无影响;直接返回false,view中onTouchEvent方法执行一次后不在执行,Activity中onTouchEvent方法将执行