Android群英传——第三章绘制View和ViewGroup
2016-11-12 19:10
113 查看
Android在绘制View之前,需要知道这个View的大小,即需要对View进行测量。这个过程在onMeasure方法中进行
Android提供了一个
-
- 高2位为测量模式,低30位为测量大小
- 测量模式:
- EXACTLY:精确值模式,比如width指定为match_parent或100dp
- AT_MOST:最大值模式,比如wrap_content
- UNSPECIFIED:不指定测量大小
- View的默认onMeasure()方法只支持EXACTLY模式,如果要使用其他模式需要重写onMeasure()方法
- 如果想让View支持wrap_content,则必须要根据情况设置view的大小
使用
默认的wrap_content(AT_MOST),会填充父布局
使用MeasureSpec进行设置或者获取View的模式和大小
Bitmap将会用来存储所有绘制在Canves上的像素信息。
当使用此构造器后,后面所有的draw方法都会发生在bitmap上(可以理解Canvas实际上为在bitmap上作画)
当ViewGroup为wrap_content的时候,就需要对子View进行遍历,从而确定自己的大小
在onMeasure()方法测量结束后,使用onLayout()确定每个子View的位置
具体请参考:Android视图绘制流程完全解析,带你一步步深入了解View(二)
Android提供了一个
MeasureSpec类用来帮助我们测来嗯View
-
MeasureSpec是一个32位int值
- 高2位为测量模式,低30位为测量大小
- 测量模式:
- EXACTLY:精确值模式,比如width指定为match_parent或100dp
- AT_MOST:最大值模式,比如wrap_content
- UNSPECIFIED:不指定测量大小
- View的默认onMeasure()方法只支持EXACTLY模式,如果要使用其他模式需要重写onMeasure()方法
- 如果想让View支持wrap_content,则必须要根据情况设置view的大小
测量View:
在onMeasure()方法中测量使用
setMeasuredDimension()方法设置测量后的值
默认的wrap_content(AT_MOST),会填充父布局
使用MeasureSpec进行设置或者获取View的模式和大小
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(mesure(widthMeasureSpec), mesure(heightMeasureSpec)); } private int mesure(int measureSpec) { int result = 0; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if (specMode == MeasureSpec.EXACTLY) { // 当设置为match_parent时,控件的大小设置多少就是多少 result = specSize; } else { // 当没有精确的值的时候,设置为200 result = 200; if (specMode == MeasureSpec.AT_MOST) { // 当为wrap_content的时候,默认会填充整个屏幕 result = Math.min(result, specSize); // 如果手机的宽度或者高度小于200, // 则使用手机宽度高度作为view的width和height } } return result; }
绘制View
在onDraw()中使用Canvas绘画创建Canvas
在外部创建Canvas时,通常使用 Canvas(Bitmap)构造器,这是因为传入的这个bitmap与Canvas紧密联系,称之为装载画布。Bitmap将会用来存储所有绘制在Canves上的像素信息。
当使用此构造器后,后面所有的draw方法都会发生在bitmap上(可以理解Canvas实际上为在bitmap上作画)
ViewGroup测量
ViewGroup主要用于管理子View:管理子View的大小,子View的位置当ViewGroup为wrap_content的时候,就需要对子View进行遍历,从而确定自己的大小
在onMeasure()方法测量结束后,使用onLayout()确定每个子View的位置
ViewGroup的绘制
ViewGroup会使用dispatchDraw()方法绘制子View
具体请参考:Android视图绘制流程完全解析,带你一步步深入了解View(二)
相关文章推荐
- Android群英传---View、ViewGroup的测量和绘制
- ViewGroup的测量与绘制(Android群英传)
- Android 自定义View、ViewGroup(二)之绘制流程
- Android 自定义控件之ViewGroup的测量与绘制
- ViewGroup学习之绘制过程
- 深入解析view和viewgroup绘制过程
- 《Android群英传》笔记6——自定义ViewGroup
- View 与ViewGroup的测量与绘制
- View和ViewGroup的基本绘制流程
- ViewGroup的测量、绘制
- ViewGroup学习之绘制过程
- 自定义控件(14)---ViewGroup绘制的Padding、margin注意
- 自定义view之ViewGroup绘制阶梯型布局
- ViewGroup学习之绘制过程
- ViewGroup的手势和绘制机制(个人看法)
- ViewGroup的绘制
- 自定义View绘制心得(自定义view和自定义viewGroup)
- 《Android群英传》笔记4——View绘制流程分析及重写
- 自定义ViewGroup(Android群英传)
- 自定义控件(15)---ViewGroup绘制的自定义子View的margin注意