更新:2017-1-28 理解一
概述
- 第一行代码(第二版)
- Android研究院之应用程序ListView 详解 (六)
其中在自定义ListView中涉及到如何动态加载布局,即XML流→实例化布局得到View对象,便于实现该布局中的各个控件。
以及:
- Android视图绘制流程完全解析,带你一步步深入了解View(二)(
未看完,见下理解一)
View的绘制流程:onMeasure()、onLayout()和onDraw()
ListView工作原理
ListView性能优化
理解一、Android视图绘制流程
onMeasure()具体步骤:
http://blog.youkuaiyun.com/u013480581/article/details/54783399
更新:2017-1-30
onLayout()具体步骤:
ViewRoot的performTraversals()方法会在measure结束后继续执行,并调用View的layout()方法。
- 实现host.layout(0, 0, host.mMeasuredWidth, host.mMeasuredHeight); 四个参数,分别代表着左、上、右、下的坐标(相对于当前视图的父视图而言),其中measure中测量得到的宽度和高度
layout()方法中,首先会调用setFrame()方法来判断视图的大小是否发生过变化,需不需要重绘
- layout()方法中,onLayout(changed, l, t, r, b)方法回调
- View中的onLayout()方法就是一个空方法
- ViewGroup中的onLayout()方法竟然是一个抽象方法protected abstract void onLayout(boolean changed, int l, int t, int r, int b);
- ViewGroup的子类都必须重写这个方法。LinearLayout和RelativeLayout在内部按照各自的规则对子视图进行布局
getWidth()方法和getMeasureWidth()方法的区别
- getMeasureWidth()方法在[1.4]measure()过程结束后就可以获取到了,而getWidth()方法要在[2.1]layout()过程结束后才能获取到。
- getMeasureWidth()方法中的值是通过[1.7]setMeasuredDimension()方法来进行设置的,而getWidth()方法中的值则是通过视图右边的坐标减去左边的坐标计算出来的。
onDraw()具体步骤:
具体见:(引用)http://blog.youkuaiyun.com/xx326664162/article/details/49494207