来自:原版更精彩,个人精简下http://blog.csdn.net/guolin_blog/article/details/16330267
布局的加载:将XML中的布局加载到代码中:
代码示例以及解释:
//获取layoutInflater实例(layoutInflater是单例的)
LayoutInflater layoutInflater = LayoutInflater.from(this);
//参数说明:第一个参数为布局,第二为是否为布局添加外部再嵌套一层父布局,如果不需要就直接传null。
View buttonLayout = layoutInflater.inflate(R.layout.button_layout,null);
提示:布局视图实例可以同addView(View view)方法添加布局;
视图绘制步骤--测量:
View系统的绘制流程会从ViewRoot的performTraversals()开始调用View中measure()方法进行测量:(measure()方法是final的不能从写,只能从写onMeasure()方法)
视图大小设置方法:
1.父视图会为子类视图提供试图参考大小;(优先级别最低)
2.在XML布局文件中指定试图大小;(优先级别中等(使用最多))
3.重写onMeasure()方法,调用setMeasuredDimension(int w,int h)方法设置View大小;(优先级别最高)
提示:在setMeasuredDimension()方法调用之后,我们才能使用getMeasuredWidth()和getMeasuredHeight()来获取视图测量出的宽高,以此之前调用这两个方法得到的值都会是0。
视图绘制步骤--布局(一般很用到):
performTraversals()继续调用View中调用layout();
(layout()方法是final的不能从写,只能从写onLayout()方法)
在View中layout()是一个空方法,在ViewGroup中的onLayout()方法竟然是一个抽象方法,只有布局才必须重写个方法。
layout() 方法执行完毕后,即可调用getWidth()与getHeight()获取控件的宽高;
提示:layout()方法传入的四个参数分别是0、0、childView.getMeasuredWidth()和childView.getMeasuredHeight(),因此getWidth()方法得到的值就是childView.getMeasuredWidth() - 0 = childView.getMeasuredWidth() ,所以此时getWidth()方法和getMeasuredWidth() 得到的值就是相同的。
视图绘制步骤--绘图:
performTraversals()最后调用View中调用draw();
(draw()方法是final的不能从写,只能从写onDraw()方法)
第一步:绘制背景(背景就是在XML中通过android:background属性设置的图片或颜色/代码中通过setBackgroundColor()、setBackgroundResource()等方法进行赋值)
第二步:对视图的内容进行绘制,调用onDraw();(这是我们可以重写的方法,也就是我们可以操作的地方);
第三步:绘制滚动条;
视图重绘--用于进行视图更新的方法 invalidate();(重新执行上面的三个方法)