很多时候都想弄清楚view的源码,很多时候在自定义view的时候都是感觉到无尽的迷茫,很多时候看到炫酷的view总是心生羡慕之情,这次我来了,我自己来开始我的源码分析之路。
问题
人都喜欢简单明了的工作流程图,那么我就上自己理解的流程图,由简单到复杂,一步步走进自定义view的心里。
最想知道的流程是:
- 从点击屏幕开始,是怎么样响应我的点击事件的?
- 界面上显示的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,源码大体流程
其中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源码:
public boolean superDispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);
}
事件分发的大体流程以及大体源码跟踪到此结束,了解了流程,心理是不是就有个底了?分析起来应该会顺畅很多了,下面就是开始ViewGroup和View的源码解析了。