从源码角度分析android事件分发处理机制

正式开始之前的准备工作:

           之前也写过一篇《android事件拦截处理机制详解》的博客,通过博客的名字也可以知道那篇博客只是分析了android控件View对事件的拦截和处理,简单的总结如下:

           1)父View优先拦截当前事件,拦截不成功就让子View对当前事件进行拦截。

            2)如果拦截成功的话,就会沿着子view到父View的路径查找onTouchEvent返回true的那个子View,让该子View对该事件进行处理;

             3)同时如果某一个View对当前事件拦截成功的话,当前事件就不会继续分发给这个View的子View。

            一直在说事件,那么事件到底是指什么?这里所说的事件是指手指按下(down)、移动(move)、抬起(up)此为一个事件集合或者说是事件序列,从手指接触屏幕开始到手指离开屏幕结束。所以本篇所说的事件序列或者事件集合是指从手指刚接触屏幕到离开屏幕的那一瞬间产生的各个事件:

事件序列为:ACTION_DOWN-->ACTION_MOVE-->ACTION-->...->ACTION_UP事件。

             上面的总结很简单,详细的分析以及说明都在《android事件拦截处理机制详解》这篇文章里,有兴趣的可以看一下。

             其实那篇博客说的有点简单了,只是涉及到View的层面而没有涉及到Activity和Window层面。本篇就在此基础上加上对事件源码的分析来进行补充说明。

            通过《

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
Android ,ImageView 是一个常用的控件,通常用于显示图片。其的 setVisible 方法是用来设置 ImageView 是否可见的方法。下面从源码角度分析一下这个方法的实现。 ImageView 的 setVisible 方法实际上是从 View 类继承而来的,其源码如下: ``` @Override public void setVisible(boolean visible, boolean restart) { super.setVisible(visible, restart); mPrivateFlags &= ~PFLAG_DRAWABLE_STATE_DIRTY; } ``` 在这个方法,首先调用了 View 类的 setVisible 方法,而该方法的实现主要是设置 View 的 visibility 属性。而 ImageView 这个子类,visibility 属性的设置方法是 setVisibility 方法。因此,如果想要设置 ImageView 的可见性,实际上应该调用的是 setVisibility 方法。 setVisible 方法的第二个参数 restart 表示是否需要重绘 View。在 ImageView ,如果需要重绘,则会调用 ImageView 的 invalidate 方法,使其重绘。而在 invalidate 方法,会标记 View 的状态为需要重绘,这个标记的状态就是 mPrivateFlags 变量的 PFLAG_DRAWABLE_STATE_DIRTY 标记。因此,在 setVisible 方法,还需要将这个标记清除,以便在下一次需要重绘时,重新标记。 综上所述,ImageView 的 setVisible 方法主要是继承自 View 类,并调用了其父类的 setVisible 方法,同时还需要清除重绘标记。如果想要设置 ImageView 的可见性,应该调用 setVisibility 方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭梧悠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值