首页 > 解决方案 > 在主位图的子区域上执行画布绘制的优化方式

问题描述

目前,我有一个自定义视图,它需要在主位图的子区域上绘制自己。

主位图大小大于自定义视图的绘图区域。目前,这就是我的代码的样子。虽然它有效,但我觉得应该有一种方法可以进一步优化它。

// Code in a custom View
private fun getBitmap(): Bitmap {
    val resources = context.resources

    // Creating a larger master bitmap.
    val screenWidth = resources.getDisplayMetrics().widthPixels;
    val screenHeight = resources.getDisplayMetrics().heightPixels;
    val masterBitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888)
    val masterCanvas = Canvas(masterBitmap)
    masterCanvas.drawColor(Color.WHITE)

    // Creating a smaller child bitmap.
    val childBitmap = Bitmap.createBitmap(
            masterBitmap,
            (screenWidth-width) shr 1,
            (screenHeight-height) shr 1,
            width,
            height
    )

    // Perform drawing on smaller child bitmap.
    val childCanvas = Canvas(childBitmap)
    draw(childCanvas)

    // Copy the smaller child bitmap back to larger master bitmap.
    masterCanvas.drawBitmap(
            childBitmap,
            ((screenWidth-width) shr 1).toFloat(),
            ((screenHeight-height) shr 1).toFloat(),
            Paint()
    )
}

因此,步骤可以总结如下

  1. 创建更大的主位图。
  2. 创建一个较小的子位图。
  3. 在较小的子位图上执行绘图。
  4. 将较小的子位图复制回较大的主位图。

我想知道,有没有办法消除第 4 步:将较小的子位图复制回较大的主位图。?

是否可以创建一个子位图,其数据存储区域直接共享主位图的相同数据存储区域?作为,Bitmap.createBitmap将使用新分配的内存创建一个新的 Bitmap 实例。

我想要的步骤是

  1. 创建更大的主位图。
  2. 通过直接映射到较大的主位图来创建较小的子位图。
  3. 在较小的子位图上执行绘图。这将在子位图绘制过程中立即影响较大的主位图。

我想知道,是否有任何 API 使我能够通过直接映射到较大的主位图来创建较小的子位图。?

标签: androidkotlinbitmap

解决方案


推荐阅读