[Android高级进阶] - Android View绘制流程
来源:互联网 发布:手机淘宝怎么换主题 编辑:程序博客网 时间:2024/06/05 18:58
主要本文的主要的内容来源《Android 高级进阶》(顾浩鑫/著)图书
说到android View(包括ViewGroup)的绘制流程,可以模拟一个生活中的场景。就好比, 一个演员要去人民大会堂演出。进入人民大会堂的时候,门口的保安叔叔要开始搜身(相当于调用onMeasure函数),这里主要给你量一量身高,三围,体重什么的。然后,做好记录你属于哪一种人(Measure.UNSPECIFIED 或者 Measure.EXACTLY 或者 Measure.AT_MOST)。同时,在此你也可以把自己设置成(setMeasuredDimension)他们想要的。
等进入会场以后, 就要找到自己合适的位置(onLayout),根据号码牌(参数)进行入座等待上台表演节目。
时间到了,开始上台的表演了(onDraw)。
Android View 绘制分为三个流程:测量(Measure), 布局(Layout),绘制(Draw)
测量,就是测量的在父视图中测试所占据的位置大小。(在Activity中onResume函数后执行)MeasureSpec类,作为测量静态类。提供了种测量的模式:
1, UNSPECIFIED 不指定测量模式, 通常用在的系统内部,应用中很少用到。
2, EXACTLY 精确测量模式, 当layout_width, layout_height 的值是一个精确的值或者 match_parent时
3, AT_MOST 最大值模式, 当layout_width, layout_height 的值是wrap_parent时,此时子视图的尺寸可以是不超过父视图的任何尺寸。
在View中可以重写onMeasure进行自身在父视图中所占位置的调整,可以调用setMeasuredDimension函数进行改变大小。
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int mode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); Log.i(getClass().getSimpleName(), "widthMeasureSpec mode >> " + this.toModeString(mode) + ", 宽度:" + widthSize); mode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); Log.i(getClass().getSimpleName(), "heightMeasureSpec mode >> " + this.toModeString(mode) + ", 高度:" + heightSize); super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 改变视图的尺寸 super.setMeasuredDimension(200,200); }
布局, 就是确定View在父视图中的位置。
绘制,分为6个步骤:
1, 绘制View的背景
2,如果需要的话,保存canvas的图层,为fading做准备
3,绘制View 内容
4,绘制View的子View
5,如果需要的话,绘制View的fading边缘并恢复图层
6,绘制View的装饰(例如:滚动条
)
- [Android高级进阶] - Android View绘制流程
- Android View绘制流程
- Android View绘制流程
- Android View绘制流程
- Android View绘制流程
- Android View绘制流程
- Android View绘制流程
- android View 绘制流程
- Android View绘制流程
- Android View绘制流程
- Android View绘制流程
- Android View绘制流程
- Android View绘制流程
- Android View绘制流程
- Android View绘制流程
- Android View绘制流程
- Android View绘制流程
- Android View 绘制流程
- 事务四大属性ACID
- AlertDialog显示错误 Unable to add window token null is not for an application
- Linux_Chrome出现Adobe Flash Player is out of date解决方法
- Recyclerview添加头布局
- 简单学习Nginx之:动静分离
- [Android高级进阶] - Android View绘制流程
- Mybatis 批量插入带oracle序列例子+ORA-02287: 此处不允许序号
- 微信开发之准备阶段
- mybatis insert不成功问题
- 深度解析Gradle编译React native时遇到的那些坑【适用于Android开发者】
- 4-1 Iterative Mergesort (9分)
- 关于HBase的SingleColumnValueFilter的坑
- redis分布式锁机制
- 熟悉列表工具框架