Android Surface&Canvas

Canvas 为在画布的意思。Android上层的作图几乎都通过Canvas实例来完成,其实Canvas更多是一种接口的包装。drawPaints ,drawPoints,drawRect,drawBitmap ...

Android Surface&Canvas_第1张图片

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 操作:
GraphicBuffer :lock
getBufferMapper().lock<-> GraphicBufferMapper ::lock
mAllocMod->lock<->gralloc_module_t::lock
通过SurfaceLock可取得Surface(mLockedBuffe)所对应的图形缓冲区地址。
(1)建立与SkCanvas 连接的位图设备,而该位图使用上面取得的图形缓冲区地址做自己的位图内存。
(2)设置SkCanvas 的作图目标设备为该位图。通过该过程就建立起了SurfaceControl与Canvas 之间的联系。

Android Surface&Canvas_第2张图片

Android Surface&Canvas_第3张图片

2 View:OnDraw 的本源
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);


你可能感兴趣的:(Android Surface&Canvas)