Android draw、onDraw、dispatchDraw、invalidate、computeScroll 一些简要说明(转)
2015-11-05 13:40
423 查看
View中:
public void draw(Canvas canvas) {
/*
1. Draw the background 绘制背景
2. If necessary, save the canvas' layers to prepare for fading 如有必要,颜色渐变淡之前保存画布层(即锁定原有的画布内容)
3. Draw view's content 绘制view的内容
4. Draw children 绘制子view
5. If necessary, draw the fading edges and restore layers 如有必要,绘制颜色渐变淡的边框,并恢复画布(即画布改变的内容附加到原有内容上)
6. Draw decorations (scrollbars for instance) 绘制装饰,比如滚动条
*/
...
if (!dirtyOpaque) {
drawBackground(canvas); //背景绘制
}
// skip step 2 & 5 if possible (common case) 通常情况跳过第2和第5步
...
if (!dirtyOpaque) onDraw(canvas); //调用onDraw
dispatchDraw(canvas); //绘制子view
onDrawScrollBars(canvas); //绘制滚动条
...
}
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.invalidate(),会触发onDraw和computeScroll()。前提是该view被附加在当前窗口上
view.postInvalidate(); //是在非UI线程上调用的
2. 自定义一个ViewGroup,重写onDraw。
onDraw可能不会被调用,原因是需要先设置一个背景(颜色或图)。
表示这个group有东西需要绘制了,才会触发draw,之后是onDraw。
因此,一般直接重写dispatchDraw来绘制viewGroup
3. 自定义一个ViewGroup
dispatchDraw会调用drawChild。
http://blog.csdn.net/jjwwmlp456/article/details/43986141
public void draw(Canvas canvas) {
/*
1. Draw the background 绘制背景
2. If necessary, save the canvas' layers to prepare for fading 如有必要,颜色渐变淡之前保存画布层(即锁定原有的画布内容)
3. Draw view's content 绘制view的内容
4. Draw children 绘制子view
5. If necessary, draw the fading edges and restore layers 如有必要,绘制颜色渐变淡的边框,并恢复画布(即画布改变的内容附加到原有内容上)
6. Draw decorations (scrollbars for instance) 绘制装饰,比如滚动条
*/
...
if (!dirtyOpaque) {
drawBackground(canvas); //背景绘制
}
// skip step 2 & 5 if possible (common case) 通常情况跳过第2和第5步
...
if (!dirtyOpaque) onDraw(canvas); //调用onDraw
dispatchDraw(canvas); //绘制子view
onDrawScrollBars(canvas); //绘制滚动条
...
}
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.invalidate(),会触发onDraw和computeScroll()。前提是该view被附加在当前窗口上
view.postInvalidate(); //是在非UI线程上调用的
2. 自定义一个ViewGroup,重写onDraw。
onDraw可能不会被调用,原因是需要先设置一个背景(颜色或图)。
表示这个group有东西需要绘制了,才会触发draw,之后是onDraw。
因此,一般直接重写dispatchDraw来绘制viewGroup
3. 自定义一个ViewGroup
dispatchDraw会调用drawChild。
http://blog.csdn.net/jjwwmlp456/article/details/43986141
相关文章推荐
- Android SDK和ADT版本问题
- android学习指南
- android 学习路线指南
- Cordova or Xamarin 用.net开发IOS和Android程序
- Android EventBus源码解析 带你深入理解EventBus
- 学习Android有用的插件和工具推荐
- Android-04 setCompoundDrawables与setCompoundDrawablesWithIntrinsicBounds的区别
- android content provider java.lang.SecurityException: Permission Denial异常解决
- android底层开发进阶(2)--makefile笔记与android的平台编译
- android intent 选择文件
- AsyncTask的使用
- 仿QQ聊天(1)—无形装比,最为致命
- Android开发入门------开发环境的搭建
- Android基本控件ListView的使用总结
- Android--简单开发和使用ContentProvider数据共享
- Activity启动过程详解
- 强烈推荐android studio用的几个插件
- Android开发&常用权限使用
- 如何在VirtualBox虚拟机中安装Android x86
- android经典DEMO