Как эффективно перерисовать растровое изображение? - PullRequest
0 голосов
/ 18 октября 2019

Я сделал вид, который рисует квадрат и в середине есть «дыра», которая отображает то, что находится под ним. Также необходимо было добавить анимацию изменения размера этой дыры. Вот моя реализация:

class RoundMaskView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr), SizeChangeListener {

    companion object {
        private const val SHIFT_COEF = 0.3f
    }

    init {
        setLayerType(LAYER_TYPE_SOFTWARE, null)
    }

    private val squarePaint = Paint()
    private val squareBitmapPaint = Paint().apply {
        isAntiAlias = true
        style = Paint.Style.FILL
        color = ContextCompat.getColor(context, R.color.intro_color_background)
    }
    private val holeBitmapPaint = Paint().apply {
        isAntiAlias = true
        style = Paint.Style.FILL
    }
    private val holePaint = Paint().apply {
        xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_OUT)
    }

    private var shift = 1f
    private val holeSquareSize = context.resources.getDimensionPixelSize(R.dimen.item_intro_size)
        get() = (field * shift).toInt()
    private var squareBitmap: Bitmap? = null
    private var holeBitmap: Bitmap? = null

    override fun onSizeChange(progress: Float) {
        shift = 1f - SHIFT_COEF * progress
        resizeHoleBitmap()
        invalidate()
    }

    override fun onDraw(canvas: Canvas) {
        if (squareBitmap == null) {
            initBitmaps()
        }
        canvas.drawBitmap(squareBitmap!!, 0f, 0f, squarePaint)
        canvas.drawBitmap(
            holeBitmap!!,
            (width / 2f) - holeSquareSize / 2f,
            (height / 2f) - holeSquareSize / 2f,
            holePaint
        )
    }

    private fun initBitmaps() {
        squareBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888).apply {
            Canvas(this).drawRect(Rect(0, 0, width, height), squareBitmapPaint)
        }
        holeBitmap = Bitmap.createBitmap(holeSquareSize, holeSquareSize, Bitmap.Config.ARGB_8888).apply {
            Canvas(this).drawCircle(holeSquareSize / 2f, holeSquareSize / 2f, holeSquareSize / 2f, holeBitmapPaint)
        }
    }

    private fun resizeHoleBitmap() {
        holeBitmap = Bitmap.createBitmap(holeSquareSize, holeSquareSize, Bitmap.Config.ARGB_8888).apply {
            Canvas(this).drawCircle(holeSquareSize / 2f, holeSquareSize / 2f, holeSquareSize / 2f, holeBitmapPaint)
        }
    }
}

Как вы видите, когда я звоню onSizeChange(progress) изменить размер отверстия (Bitmap). Но после каждого вызова создайте новое растровое изображение, и я знаю, что это не эффективно. Как исправить размер изменения растрового изображения для каждого вызова onSizeChange?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...