Android群英传读书笔记---View测量和绘制
2015-10-10 22:08
393 查看
想要写自定义控件,必须清楚控件的绘制原理,幸好,幸好,这本书让我对view的理解更清晰了
View的测量
.1. 我们清楚view的测量是在onMeasure()方法中完成的,测量模式,API提供了三种:EXACTLY:
精确模式,控件的layout_width,layout_height,为确定值,或者match_parent
AT_MOST:
最大模式,控件的layout_width,layout_height,为wrap_content,此时控件的大小随着控件的子空间或内容改变,但是控件尺寸不能超过父控件允许的最大尺寸。
UNSPECIFIED:
想多大就多大,通常在自定义VIEW时使用
.2. View默认的onMeasure只支持EXACTLY模式,如果不重写onMeasure方法,只能使用EXACTLY模式。控件可以响应指定的具体宽高,或者match_parent,而如果让自定义view支持wrap_content,必须重写onMeasure指定wrap_content时的大小
(新技能get,哈哈哈)
.3. 参看super.onMeasure源码,可知
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec), getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec)); } 因此,需要重写measureWidth(int measureWidth)方法: @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(measuredWidth(widthMeasureSpec), measuredWidth(heightMeasureSpec)); } private int measuredWidth(int measureSpec) { int result = 0; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if (specMode == MeasureSpec.EXACTLY) { result = specSize; } else { result = 200;// 给个默认值 if (specMode == MeasureSpec.AT_MOST) { result = Math.min(result, specSize);// 不能超过父控件的最大允许尺寸 } } return result; }
设置layout_height,layout_width为wrap_content效果如下图:
设置layout_height=500dp,layout_width=match_parent,效果如下图:
View的绘制
view测量好之后,就要在onDraw(Canvas canvas)方法上绘制.1.创建Canvas 对象
Canvas canvas = new Canvas(bitmap)
传进去的bitmap与创建的canvas画布联系在一起,称之为装载画布。这个bitmap用来存储所有绘制在canvas上的像素信息,后面调用的canvas.drawxxx都作用在这个bitmap上。下面的代码可以证实canvas与bitmap的直接关系
canvas.drawBitmap(bitmap1,0,0,null); Canvas mcanvas = new Canvas(bitmap1); mcanvas.drawxxx
通过这个mcanvas将绘制效果作用在bitmap1上,在刷新view的时候,就会发现通过onDraw方法绘制出来的bitmap1已经发生了变化,这就是bitmap1承载了mcanvas上所进行的绘图操作,我们其实并没有绘制在mcanvas画布上,而是通过改变bitmap,然后让view重绘,从而改变之后的bitmap
(又get新技能,o(∩_∩)o 哈哈)
相关文章推荐
- 自定义View准备:MeasureSpec理解
- View的测量
- 自定义View之总结
- WindowManger与window进阶篇_1(ViewRootImpl深入理解,View测量)
- view的流程(测量,布局,绘制)
- Android View - 测量Measure
- Android 自定义View 之测量过程(onMeasure)
- 自定义View实现
- Android 自定义view的测量
- Android Studio开启虚拟机遇到HAX kernel module is not installed问题
- android系统源码修改注意(1)
- Android 自定义圆形图片
- 《ArcGIS Runtime SDK for Android开发笔记》——数据制作篇:.geodatabase创建,创建时内容缺失问题总结
- 《ArcGIS Runtime SDK for Android开发笔记》——翻译:ArcGIS Runtime SDK for Android 10.2.7发布
- Android-ImageSpan的使用实现图文并排
- [Android Pro] 通过包名启动应用
- Android多线程机制
- android中string.xml中%1$s、%1$d等的用法
- 《ArcGIS Runtime SDK for Android开发笔记》——问题集:.geodatabase创建,创建时内容缺失问题总结
- Android每日范例——密码输入框