# Surface&Canvas
Canvas为在画布的意思。Android上层的作图几乎都通过Canvas实例来完成,其实Canvas更多是一种接口的包装。drawPaints ,drawPoints,drawRect,drawBitmap ...
[![image](https://box.kancloud.cn/2016-05-05_572b1a2cba92c.gif "image")
](http://hi.csdn.net/attachment/201006/14/0_1276524262qcXC.gif)
### 1 Canvas与Surface之间本质关系
对于本节,我们不去研究Skia图形引擎本身,我们需要了解的我们的所做的图形到底放置到了那个地方,并且这个Canvas如何与Surface连接在一起的。
Canvas(Java)在C++Native层有一个Native Canvas的C++对象所对应。
lockCanvas()@java
Surface_lockCanvas@android_view_Surface.cpp
SurfaceControl->new Surface(control) @Surface.cpp
Surface: lock操作:
[](http://hi.csdn.net/attachment/201006/14/0_1276524263FdtA.gif)[![image](https://box.kancloud.cn/2016-05-05_572b1a2ccb054.gif "image")](http://hi.csdn.net/attachment/201006/14/0_1276524264rrrr.gif)
GraphicBuffer :lock
getBufferMapper().lock GraphicBufferMapper ::lock
mAllocMod->lockgralloc_module_t::lock
通过SurfaceLock可取得Surface(mLockedBuffe)所对应的图形缓冲区地址。
(1) 建立与SkCanvas连接的位图设备,而该位图使用上面取得的图形缓冲区地址做自己的位图内存。
(2) 设置SkCanvas的作图目标设备为该位图。
通过该过程就建立起了SurfaceControl与Canvas之间的联系。
[](http://hi.csdn.net/attachment/201006/14/0_1276524266rhNg.gif)[![image](https://box.kancloud.cn/2016-05-05_572b1a2cdc00c.gif "image")](http://hi.csdn.net/attachment/201006/14/0_1276524267jPRF.gif)
### 2 View:OnDraw的本源
不是使用OpenGL绘制时,Android在View属性发生变化,新建View时,或者Z-order发生变化时,需要对系统屏幕上的View重新绘制,此时我们的View会执行OnDraw(canvas),这个根源在哪里呢?
~~~
ViewRoot.Java
performTraversals(..)
…
draw()
canvas = surface.lockCanvas(dirty);
…
mView.draw(canvas);
draw(cavas)@view.java
background.draw(canvas);
onDraw(cavas)
dispatchDraw(cavas)
onDrawScrolbars(cavas)
surface.unlockCanvasAndPost(canvas);
~~~
- 前言
- (一)分析方法论探讨之设计意图
- (二)方法论探讨之概念空间篇
- (三)手机之硬件形态
- (四)手机的软件形态
- (五)基本空间划分
- (六)IPC框架分析 Binder,Service,Service manager
- (七)Service深入分析
- (八)Android 启动过程详解
- (九)Zygote Service
- (十)Android GWES之基本原理篇
- (十一)Android GWES之消息系统
- (十二)Android GEWS窗口管理之基本架构原理
- (十三)Android GWES之Android窗口管理
- (十四)Android GWES之输入系统
- (十五)Android输入系统之输入路径详解
- (十六)Android电话系统-概述篇
- (十七)电话系统之rilD
- (十八)Android电话系统之RIL-Java
- (十九)电话系统之GSMCallTacker
- (二十)Android应用程序框架之无边界设计意图
- (二十一)Android应用框架之AndroidApplication
- (二十二)Android应用框架之Activity
- (二十三)Andoird GDI之基本原理及其总体框架
- (二十四)Android GDI之显示缓冲管理
- (二十五)Android GDI之共享缓冲区机制
- (二十六)Android GDI之SurfaceFlinger
- (二十七)Android GDI 之SurfaceFlinger之动态结构示意图
- (二十八)Android GDI之Surface&Canvas