Учитывая 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.
Вопросы
- Можно ли использовать только одно растровое изображение, которое будет выходным?
- Возможно ли иметь Drawable в качестве вывода, чтобы он работал даже с VectorDrawable, позволяя вам хорошо масштабировать его?