Учитывая Drawable, как замаскировать его до заданной формы?

Задний план

Я хотел ( здесь) увидеть, как создать альтернативуAdaptiveIconDrawable, но измените его фон, который можно рисовать, чтобы придать форму заданному Path.

Проблема

Что ж, то, что я сделал, работало для Bitmap, но я хотел знать, можно ли преобразовать данный Drawable непосредственно в Bitmap и даже Drawable, который имеет форму заданного Path, без создания дополнительных экземпляров Bitmap.

Что я пробовал

Это текущий код:


        fun resizePath(path: Path, width: Float, height: Float): Path {
            val bounds = RectF(0f, 0f, width, height)
            val resizedPath = Path(path)
            val src = RectF()
            resizedPath.computeBounds(src, true)
            val resizeMatrix = Matrix()
            resizeMatrix.setRectToRect(src, bounds, Matrix.ScaleToFit.CENTER)
            resizedPath.transform(resizeMatrix)
            return resizedPath
        }

        fun getMaskedBitmap(src: Bitmap, path: Path, resizePathToMatchBitmap: Boolean = true): Bitmap {
            val pathToUse = if (resizePathToMatchBitmap) resizePath(path, src.width.toFloat(), src.height.toFloat()) else path
            val output = Bitmap.createBitmap(src.width, src.height, Bitmap.Config.ARGB_8888)
            val canvas = Canvas(output)
            val paint = Paint(Paint.ANTI_ALIAS_FLAG)
            paint.color = 0XFF000000.toInt()
            canvas.drawPath(pathToUse, paint)
            paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
            canvas.drawBitmap(src, 0f, 0f, paint)
            return output
        }

        fun getMaskedBitmap(drawable: Drawable, path: Path, resizePathToMatchBitmap: Boolean = true): Bitmap = getMaskedBitmap(drawable.toBitmap(), path, resizePathToMatchBitmap)

Как вы видете, getMaskedBitmap преобразует данный объект для рисования в Bitmap и внутри него создает еще один Bitmap.

Вопросы

  1. Можно ли использовать только одно растровое изображение, которое будет выходным?
  2. Возможно ли иметь Drawable в качестве вывода, чтобы он работал даже с VectorDrawable, позволяя вам хорошо масштабировать его?

0 ответов

Другие вопросы по тегам