zoukankan      html  css  js  c++  java
  • Android核心分析之二十八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
      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之间的联系。
                              


      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);

  • 相关阅读:
    浅析Go中的MPG模式(一)
    panic: assignment to entry in nil map
    Golang 新手可能会踩的 50 个坑
    小刘的go面试题
    go 单元测试整理
    go test 测试单个文件和测试单个函数
    mac pro锁屏后没有声音了怎么处理
    go json返回时间字符串处理time.Time类型
    php求一个字符串中不重复的最长子串
    业务订单号生成算法,每秒50W左右,不同机器保证不重复,包含日期可读性好
  • 原文地址:https://www.cnblogs.com/kingshow123/p/androidcore28.html
Copyright © 2011-2022 走看看