自定义view源码分析之事件分发01

作者: 袋袋_Deken | 来源:发表于2017-01-19 10:37 被阅读33次

很多时候都想弄清楚view的源码,很多时候在自定义view的时候都是感觉到无尽的迷茫,很多时候看到炫酷的view总是心生羡慕之情,这次我来了,我自己来开始我的源码分析之路。

问题

人都喜欢简单明了的工作流程图,那么我就上自己理解的流程图,由简单到复杂,一步步走进自定义view的心里。

最想知道的流程是:

  1. 从点击屏幕开始,是怎么样响应我的点击事件的?
  2. 界面上显示的view,又是怎么样呈现在我们面前的(记得有一次被面试问到: 你最常用的listview是怎么显示出来的?)?

怀着问题,开始开车上路。

事件分发

点击事件分发的流程:

1,屏幕传感器->Activity ->ViewGroup->View 。
外层的touch事件的调用顺序为:

  Action_Down传递:
      dispatchTouchEvent(Activity) ->dispatchTouchEvent(ViewGroup) -> onInterceptTouchEvent(ViewGroup)->dispatchTouchEvent(View) -> onTouch(View)->onTouchEvent(View)->onClick()(View) 
  如果不消费:
      onTouchEvent(View)->onTouchEvent(ViewGroup)->onTouchEvent(Activity)

2,源码大体流程


workflow类图

其中Activity的源码:

  public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        onUserInteraction();
    }
    if (getWindow().superDispatchTouchEvent(ev)) {
        return true;
    }
    return onTouchEvent(ev);
}

getWindow()返回的便是一个Window的抽象类,具体实现便是PhoneWindow类,具体跟踪源码便能找到。
PhoneWindow源码:

@Override
public boolean superDispatchTouchEvent(MotionEvent event) {
    return mDecor.superDispatchTouchEvent(event);
}

但是PhoneWindow属于framework层了,想继续跟踪便需要下载源码查看源码:老司机的查看方法:http://blog.csdn.net/a740169405/article/details/50019273

继续跟踪framework源码到DecorView类,这个类便最顶层的,它继承至ViewGroup,根据递归,进而便顺利成章的将事件分发到各个ViewGroup和View。

DecorView源码

DecorView源码:

 public boolean superDispatchTouchEvent(MotionEvent event) {
      return super.dispatchTouchEvent(event);
 }

事件分发的大体流程以及大体源码跟踪到此结束,了解了流程,心理是不是就有个底了?分析起来应该会顺畅很多了,下面就是开始ViewGroup和View的源码解析了。

相关文章

网友评论

    本文标题:自定义view源码分析之事件分发01

    本文链接:https://www.haomeiwen.com/subject/jgmvbttx.html