Я сделал вид, который рисует квадрат и в середине есть «дыра», которая отображает то, что находится под ним. Также необходимо было добавить анимацию изменения размера этой дыры. Вот моя реализация:
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
?