View事件传递

结合日志分析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方法将执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值