【达内课程】UI执行顺序和事件处理顺序

本文主要探讨UI执行顺序和事件处理顺序。通过新建MyLinearLayout并继承LinearLayout,重写相关方法,在多个自定义控件中打印日志来观察。还研究了ShadeView的onTouchEvent返回值变化以及CenterLayout中onInterceptTouchEvent返回值为true时对事件处理的影响。

UI执行顺序

了解一下UI的执行顺序,我们新建一个MyLinearLayout ,并继承LinearLayout,重写onMeasure(),onSizeChanged(),onLayout()方法

其中CenterLayoutShadeView都是之前的自定义控件

布局结构如下
--MyLinearLayout
----CenterLayout
--------ShadeView

<com.xx.shadeview.MyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.xx.shadeview.CenterLayout xmlns:Shade="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.xx.shadeview.ShadeView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            Shade:shade_color="#FF888888"
            Shade:text="运动伙伴 就选酷跑"
            Shade:text_color="#FF0000FF"
            Shade:text_size="20" />

    </com.xx.shadeview.CenterLayout>
</com.xx.shadeview.MyLinearLayout>

在MyLinearLayout ,CenterLayout ,ShadeView中打印日志
在这里插入图片描述
事件处理顺序

在MyLinearLayout、CenterView中重写以下三个方法

    //分发
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.d("事件处理顺序",this.toString()+" dispatchTouchEvent()");
        return super.dispatchTouchEvent(ev);
    }

    //拦截
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.d("事件处理顺序",this.toString()+" onInterceptTouchEvent()");
        return super.onInterceptTouchEvent(ev);
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("事件处理顺序",this.toString()+" onTouchEvent() action:"+event.getAction());
        return super.onTouchEvent(event);
    }

在ShadeView,以及MainActivity中重写dispatchTouchEvent()、onTouchEvent()方法,打印日志

点击界面上的ShadeView,观察日志

正常事件处理顺序如下:
在这里插入图片描述
修改ShadeView的onTouchEvent,改为return true

     @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("事件处理顺序",this.toString()+" onTouchEvent() action:"+event.getAction());
        //return super.onTouchEvent(event);
        return true;
    }

再次点击界面上的ShadeView,观察日志
当ShadeView的onTouchEvent()返回true后,容器的onTouchEvent()就不执行了。而且点击事件分为了按下:0、抬起:1、移动:2。当进行移动时,事件会分发多次

当return super.onTouchEvent(event);时,只有按下
在这里插入图片描述
现在将ShadeView的onTouchEvent改为return super.onTouchEvent(event);

然后修改CenterLayout中的onInterceptTouchEvent()方法返回值为true

 @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.d("事件处理顺序",this.toString()+" onInterceptTouchEvent()");
        //return super.onInterceptTouchEvent(ev);
        return true;
    }

这样会导致其子控件ShadeView的onTouchEvent()执行不到,因为进行了拦截
观察日志
在这里插入图片描述
总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值