android中draw笔记
来源:互联网 发布:定态薛定谔方程 知乎 编辑:程序博客网 时间:2024/06/06 20:51
整个View树的绘图流程是在ViewRoot类的performTraversals()函数展开的,该函数做的执行过程可简单概况为:根据之前设置的状态,判断是否需要重新计算视图大小(measure)、是否重新需要安置视图的位置(layout)、以及是否需要重绘
(draw)
onDraw()与dispatchDraw()的区别
View.onDraw(canvas)函数实现绘制VIew本身的内容,dispatchDraw(canvas)实现绘制childView
draw()的执行流程
public void draw(Canvas canvas) {...
/* * Draw traversal performs several drawing steps which must be executed * in the appropriate order: * * 1. Draw the background * 2. If necessary, save the canvas' layers to prepare for fading * 3. Draw view's content
* 调用onDraw()方法绘制视图本身 (每个View都需要重载该方法,ViewGroup不需要实现该方法)* 4. Draw children
...* 调用dispatchDraw ()方法绘制子视图(如果该View类型不为ViewGroup,即不包含子视图,不需要重载该方法),* 5. If necessary, draw the fading edges and restore layers * 6. Draw decorations (scrollbars for instance) */dispatchDraw()方法内部会遍历每个子视图,调用drawChild()去重新回调每个子视图的draw()方法(注意,这个
地方“需要重绘”的视图才会调用draw()方法)。
}
上述源码注释已经大致为我们说明了操作内容
View组件的绘制会调用draw(Canvas canvas)方法,draw过程中主要是先画Drawable背景,对 drawable调用setBounds()然后是draw(Canvas c)方法.有点注意的是背景drawable的实际大小会影响view组件的大小,drawable的实际大小通过getIntrinsicWidth()和getIntrinsicHeight()获取,当背景比较大时view组件大小等于背景drawable的大小
画完背景后,draw过程会调用onDraw(Canvas canvas)方法,然后就是dispatchDraw(Canvas canvas)方法, dispatchDraw()主要是分发给子组件进行绘制,我们通常定制组件的时候重写的是onDraw()方法。值得注意的是ViewGroup容器组件的绘制,当它没有背景时直接调用的是dispatchDraw()方法, 而绕过了draw()方法,当它有背景的时候就调用draw()方法,而draw()方法里包含了dispatchDraw()方法的调用。因此要在ViewGroup上绘制东西的时候往往重写的是dispatchDraw()方法而不是onDraw()方法,或者自定制一个Drawable,重写它的draw(Canvas c)和 getIntrinsicWidth(),
invalidate(),requsetLaytout()以及requestFocus() ,这三个函数最终会调用到ViewRoot中的schedulTraversale()方法,该函数然后发起一个异步消息,消息处理中调用performTraverser()方法对整个View进行遍历。
invalidate()方法 :
说明:请求重绘View树,即draw()过程,假如视图发生大小没有变化就不会调用layout()过程,并且只绘制那些“需要重绘的”
视图,即谁(View的话,只绘制该View ;ViewGroup,则绘制整个ViewGroup)请求invalidate()方法,就绘制该视图。
一般引起invalidate()操作的函数如下:
1、直接调用invalidate()方法,请求重新draw(),但只会绘制调用者本身。
2、setSelection()方法 :请求重新draw(),但只会绘制调用者本身。
3、setVisibility()方法 : 当View可视状态在INVISIBLE转换VISIBLE时,会间接调用invalidate()方法, 继而绘制View。
4 、setEnabled()方法 : 请求重新draw(),但不会重新绘制任何视图包括该调用者本身。
requestLayout()方法 :会导致调用measure()过程 和 layout()过程 。
说明:只是对View树重新布局layout过程包括measure()和layout()过程,不会调用draw()过程,但不会重新绘制
任何视图包括该调用者本身。
一般引起invalidate()操作的函数如下:
1、setVisibility()方法:
当View的可视状态在INVISIBLE/ VISIBLE 转换为GONE状态时,会间接调用requestLayout() 和invalidate方法。
同时,由于整个个View树大小发生了变化,会请求measure()过程以及draw()过程,同样地,只绘制需要“重新绘制”的视图。
requestFocus()函数说明:
说明:请求View树的draw()过程,但只绘制“需要重绘”的视图。
canvas.translate(mTranslationX, getHeight() - 2); // 移动画布的原点
- android中draw笔记
- 在Android 中 Draw Bitmap
- Android中Cannot draw recycled bitmaps
- android Draw
- Android Draw 9-patch
- android draw绘图机制
- android canvas.draw 注意
- android draw过程分析
- Android draw学习
- Android Draw PorterDuffXfermode
- Android Draw 实现时钟
- View中Draw方法
- Android中draw过程分析 (结合Android 4.0.4 最新源码)
- Android中draw过程分析 (结合Android 4.0.4 最新源码)
- android Draw Rect 坐标图示
- android Draw Rect 坐标图示
- 点滴:Android源代码 View draw()
- android Draw Rect 坐标图示
- oralcle数据误更新还原操作
- JavaScript IDE推荐
- 内存调试
- bzoj2989&4170【二进制分组】【主席树】
- ofbiz错误解析之三
- android中draw笔记
- 深度学习之DeepLab用于语义分割
- 行的开始和结束 开始符号:^ 结束符号:$
- jqGrid表格的新增和删除功能封装
- 第十五节,Promise对象
- 集成环信的EaseUI 中遇到的一些坑(3.x)
- id选择符可以以数字开头么?
- findstr 命令使用方法
- js学习