打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android核心分析(28)-----Android GDI之Surface&Canvas
Surface&Canvas
    Canvas为在画布的意思。Android上层的作图几乎都通过Canvas实例来完成,其实Canvas更多是一种接口的包装。drawPaints ,drawPoints,drawRect,drawBitmap ...
 
1 Canvas与Surface之间本质关系
     对于本节,我们不去研究Skia图形引擎本身,我们需要了解的我们的所做的图形到底放置到了那个地方,并且这个Canvas如何与Surface连接在一起的。
Canvas(Java)在C++Native层有一个Native Canvas的C++对象所对应。
lockCanvas()@java
      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之间的联系。
 
 
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);
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Android 中 更新视图的函数ondraw() 和dispatchdraw()的区别
关于脏矩形的那些事
Android中的Surface和SurfaceView
Scrolling a Canvas smoothly in Android
[Android] SurfaceView相关知识笔记
canvas.save() canvas.restore() 作用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服