Учитывая Drawable, как замаскировать его для данной формы? - PullRequest
0 голосов
/ 01 мая 2020

Фон

Я хотел ( здесь ), чтобы увидеть, как создать альтернативу 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 преобразует заданный объект в растровое изображение, и внутри него создается еще одно растровое изображение.

Вопросы

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