View onDraw、dispatchDraw、invalidate和computeScroll介绍
2015-08-09 22:45
357 查看
结合View.java的源码,在draw方法中:
}
ViewGroup中:
protected void dispatchDraw(Canvas canvas) {
...
drawChild(...); //绘制子view
...
}
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
return child.draw(canvas, this, drawingTime);
}
说明:
1. 自定义一个View时,重写onDraw会绘制View。
调用View.invalidate(),会触发onDraw和computeScroll()(前提是该view被附加在当前窗口上)。
View.postInvalidate(); //UI线程调用invalidate,非UI线程调用postInvalidate
2. 自定义一个ViewGroup,重写onDraw。
onDraw可能不会被调用,原因是需要先设置一个背景(颜色或图)。
表示这个ViewGroup有东西需要绘制了,才会触发draw方法,之后是onDraw方法。
因此,一般直接重写dispatchDraw来绘制ViewGroup
3. 自定义一个ViewGroup
dispatchDraw会调用drawChild。
public void draw(Canvas canvas) {
/* View的绘制过程分为下面几步:1. Draw the background 绘制背景2. If necessary, save the canvas' layers to prepare for fading 如有必要,颜色渐变淡之前保存画布层(即锁定原有的画布内容)3. Draw view's content 绘制View的内容4. Draw children 绘制子View5. If necessary, draw the fading edges and restore layers 如有必要,绘制颜色渐变淡的边框,并恢复画布(即画布改变的内容附加到原有内容上)6. Draw decorations (scrollbars for instance) 绘制装饰,比如滚动条*/// Step 1, draw the background, if needed
if (!dirtyOpaque) { drawBackground(canvas); //画背景 }
// skip step 2 & 5 if possible (common case) final int viewFlags = mViewFlags; boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0; boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0; if (!verticalEdges && !horizontalEdges) { // Step 3, draw the content if (!dirtyOpaque) onDraw(canvas); // Step 4, draw the children dispatchDraw(canvas); // Step 6, draw decorations (scrollbars) onDrawScrollBars(canvas); if (mOverlay != null && !mOverlay.isEmpty()) { mOverlay.getOverlayView().dispatchDraw(canvas); } // we're done... return; }
protected void dispatchDraw(Canvas canvas) {} //空实现
protected void onDraw(Canvas canvas) {} //空实现
}
ViewGroup中:
protected void dispatchDraw(Canvas canvas) {
...
drawChild(...); //绘制子view
...
}
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
return child.draw(canvas, this, drawingTime);
}
说明:
1. 自定义一个View时,重写onDraw会绘制View。
调用View.invalidate(),会触发onDraw和computeScroll()(前提是该view被附加在当前窗口上)。
View.postInvalidate(); //UI线程调用invalidate,非UI线程调用postInvalidate
2. 自定义一个ViewGroup,重写onDraw。
onDraw可能不会被调用,原因是需要先设置一个背景(颜色或图)。
表示这个ViewGroup有东西需要绘制了,才会触发draw方法,之后是onDraw方法。
因此,一般直接重写dispatchDraw来绘制ViewGroup
3. 自定义一个ViewGroup
dispatchDraw会调用drawChild。
相关文章推荐
- 之前写的检测mysql 从服务器延迟的脚本
- 深刻理解Docker镜像大小
- 职工管理系统——动态数组实现
- jQuery效果之显示与隐藏
- jvm优化
- 9.Python基础 面向对象的进一步拓展
- FZU 2105-Digits Count(线段树延时标记)
- eclipse的离线svn插件安装方法
- python正则表达式 re (二)split
- 音乐播放器之简单播放(MediaPlayer、Service、BroadcastRecevier的结合用法)
- JPA使用的HelloWorld
- MVVM框架 --- 设计模式
- 来自星星的你
- 我只是一个卖煎饼果子的,你跟我谈个鸡毛营销战略,这么牛B自己敲钟去啊 ...
- Antlr v4入门教程和实例 - 西代零零发 - 博客频道 - CSDN.NET
- 浅析UIWebView编程
- 编程与修行
- UVA 11292 Dragon of Loowater
- 李泽影的第一篇博客
- 有用的MySQL语句