在主位图的子区域上执行画布绘制的优化方法

时间:2018-12-24 03:54:26

标签: android kotlin bitmap

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

主位图的大小大于自定义视图的绘图区域。目前,这就是我的代码的样子。尽管它可以工作,但我认为应该有一种进一步优化它的方法。

// 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使我能够直接映射到较大的主位图来创建较小的子位图。

0 个答案:

没有答案