canvas、bitmap、paint之间是什么关系

官方文档翻译过来的解释:

要绘图,需要4个基本组件:

  • Bitmap 保存像素的容器
  • Canvas 执行绘图命令的宿主
  • Rect/Path/text/Bitmap 要绘制的元素
  • Paint 用什么样的方式绘制

android的canvas绘图,基于skia,想要了解canvas的绘图过程,需要对canvasskia的源码有所了解。

查看Canvas源码,发现Canvas与Bitmap类似,都是对其native方法进行了封装。

真正起绘图作用的是mNativeCanvas,保存有nativeCanvas(SkCanvas)的指针。

mNativeCanvas注释上指明

assigned in constructors or setBitmap, freed in finalizer

说明mNativeCanvas(SkCanvas)是在构造函数、或者setBitmap时分配的。

继续查看源码,发现mNativeCanvas是调用native方法

initRaster(int nativeBitmapOrZero)

方法生成。

initRaster中的参数就是Canvas私有属性mBitmapnativeBitmap(SkBitmap)的指针。

查看frameworks/base/core/jni/android/graphics/下的Canvas.cpp文件,

static SkCanvas* initRaster(JNIEnv* env, jobject, SkBitmap* bitmap) {
        return bitmap ? new SkCanvas(*bitmap) : new SkCanvas;
}

发现如果指定了SkBitmapinitRaster会以指定的SkBitmap生成SkCanvas

反之会生成默认的SkCanvas

继续查看android/external/skia/src/core/下SkCanvas的源码,

默认构造函数

SkCanvas::SkCanvas()
: fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) {
    inc_canvas();

    this->init(NULL);
}

init方法调用setDevice方法,生成默认的SkDevice,而SkDeveice最终会生成默认的SkBitmap

总结

  • Canvas的属性mNativeCanvas(SkCanvas)是根据mBitmap生成的,如果mBitmap不为空,

    mNativeCanvas操作/修改的SkBitmap就是mBitmap

    否则会操作/修改mNativeCanvas自己的SkBitmap.

  • Canvas最终操作/修改的内存还是Bitmap(SkBitmap)中的数据.

  • Canvas(bitmap) 与 canvas.setBitmap(bitmap)中的bitmap是Canvas的mBitmap,直接操作/修改的对象。

    canvas.drawBitmap(bitmap)中的bitmap是源bitmap,draw时,不对源bitmap进行写操作,

    而是写入到mBitmapmNativeCanvas自己的SkBitmap中。

  • 源码中指明Canvas最大绘图大小为32766 * 32766。超过这个大小会直接报错。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值