Android之View分发流程的实验总结与记录

在实验开始之前,必须要先构建项目,编写基本的代码。

public class MyButton extends Button {
    private static final String TAG = MyButton.class.getSimpleName();

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action){
            case MotionEvent.ACTION_DOWN:
                Log.i(TAG,"onTouchEvent ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.i(TAG,"onTouchEvent ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.i(TAG,"onTouchEvent ACTION_UP");
                break;
        }
        return super.onTouchEvent(event);
    }


    @Override
    public boolean dispatchTouchEvent(MotionEvent event)
    {
        int action = event.getAction();

        switch (action)
        {
            case MotionEvent.ACTION_DOWN:
                Log.i(TAG, "dispatchTouchEvent ACTION_DOWN");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.i(TAG, "dispatchTouchEvent ACTION_MOVE");
                break;
            case MotionEvent.ACTION_UP:
                Log.i(TAG, "dispatchTouchEvent ACTION_UP");
                break;

            default:
                break;
        }
        return super.dispatchTouchEvent(event);
    }

}

编写一个button类,重写了onTouchEvent和dispatchTouchEvent,分别打印了DOWN,MOVE,UP事件的log,以便于实验观察。

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

    <com.dali.view.MyButton
        android:id="@+id/btn"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_centerInParent="true"
        android:text="点击"/>

</RelativeLayout>

activity_main.xml文件,没啥好说.

public class MainActivity extends AppCompatActivity {
    protected static final String TAG = "MyButton";
    public static void startActivity(Context context){
        context.startActivity(new Intent(context,MainActivity.class));
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.btn);
    }
}
 button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();

                switch (action)
                {
                    case MotionEvent.ACTION_DOWN:
                        Log.i(TAG, "onTouch ACTION_DOWN");
                        break;
                    case MotionEvent.ACTION_MOVE:
                        Log.i(TAG, "onTouch ACTION_MOVE");
                        break;
                    case MotionEvent.ACTION_UP:
                        Log.i(TAG, "onTouch ACTION_UP");
                        break;
                    default:
                        break;
                }

                return false;
            }
        });
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i(TAG, "onClick");
            }
        });

MainActivity文件,找到button控件,开始实验.
1.点击button,会依次处理DOWN,UP事件,处理的过程先后是:dispatchTouchEvent–>onTouchEvent这里写图片描述

2.在button上,轻轻的划一划,会依次处理DOWN,MOVE,UP事件,处理的过程先后是:
dispatchTouchEvent–>onTouchEvent
这里写图片描述

3.在button上添加onTouchListener后,点击button,会依次处理DOWN,UP事件,处理的过程先后是:dispatchTouchEvent–>onTouch–>onTouchEvent
这里写图片描述

4.在button上添加onTouchListener后,在button上,轻轻的划一划,会依次处理DOWN,MOVE,UP事件,处理的过程先后是:
dispatchTouchEvent–>onTouch–>onTouchEvent
这里写图片描述

5.在button上添加onTouchListener,onClickListner后,点击button,会依次处理DOWN,UP事件,处理的过程先后是:dispatchTouchEvent–>onTouch–>onTouchEvent,当处理完所有的事件后,执行onClick
这里写图片描述

6.在button上添加onTouchListener,onClickListner后,在button上,轻轻的划一划,会依次处理DOWN,MOVE,UP事件,处理的过程先后是:dispatchTouchEvent–>onTouch–>onTouchEvent,当处理完所有的事件后,执行onClick
这里写图片描述

7.设置onTouchEvent的DOWN事件返回true,不会走onClick方法,经过上述多次实验,发现MOVE和UP事件得到的结果是一致的,同理MOVE事件也一致。
这里写图片描述

8.设置onTouch的DOWN事件返回true,不会走DOWN事件的onTouchEvent、onClick方法,但是不会影响UP事件的流程,同理MOVE事件也一致。
这里写图片描述

得出总结:消费事件的优先级:onTouch>onTouchEvent>onClick

9.设置dispatchTouchEvent中的DOWN事件返回true后,点击button,会发现DOWN事件只会走dispatchTouchEvent方法,但是不影响UP事件的正常流程,但是会发现,onClick也不走了。同理可得MOVE事件也一致。
这里写图片描述

10.设置dispatchTouchEvent中的UP事件返回true后,点击button,会发现UP事件只会走dispatchTouchEvent方法,但是不影响DOWN事件的正常流程,但是会发现,onClick也不走了。同理MOVE事件也一样。
这里写图片描述
总结:dispatchTouchEvent决定了单个事件的整个流程。

实验总结:
1. View的分发流程基本是:dispatchTouchEvent–>onTouchEvent
2. 消费事件的优先级:onTouch>onTouchEvent>onClick
3. dispatchTouchEvent决定了单个事件的整个流程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值