From 4cf088f1727d78d5c9f7ff5be873d180b45917f1 Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Tue, 6 Oct 2020 16:49:29 +0100 Subject: [PATCH] Update AndroidDrawablePainter (#110) * Update AndroidDrawablePainter - Fixes instrinsic size using width for height - Now works with Drawables which change intrinsic size (hello LottieDrawable) - Now properly scales drawables as per ContentScale (through the canvas size) * Don't scale if the drawable has no intrinsic size --- .../imageloading/AndroidDrawablePainter.kt | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/imageloading-core/src/main/java/dev/chrisbanes/accompanist/imageloading/AndroidDrawablePainter.kt b/imageloading-core/src/main/java/dev/chrisbanes/accompanist/imageloading/AndroidDrawablePainter.kt index 955bf4f96..629503a75 100644 --- a/imageloading-core/src/main/java/dev/chrisbanes/accompanist/imageloading/AndroidDrawablePainter.kt +++ b/imageloading-core/src/main/java/dev/chrisbanes/accompanist/imageloading/AndroidDrawablePainter.kt @@ -39,21 +39,19 @@ import androidx.compose.ui.graphics.painter.ColorPainter import androidx.compose.ui.graphics.painter.ImagePainter import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.graphics.withSave import androidx.compose.ui.unit.LayoutDirection import androidx.core.graphics.drawable.DrawableCompat import kotlin.math.roundToInt /** * A [Painter] which draws an Android [Drawable]. Supports [Animatable] drawables. + * + * Taken from https://goo.gle/compose-drawable-painter */ class AndroidDrawablePainter( private val drawable: Drawable ) : Painter() { - private val drawableSize = Size( - drawable.intrinsicWidth.toFloat(), - drawable.intrinsicWidth.toFloat() - ) - private var invalidateTick by mutableStateOf(0) private var startedAnimatable = drawable is Animatable && drawable.isRunning @@ -102,7 +100,11 @@ class AndroidDrawablePainter( ) } - override val intrinsicSize: Size get() = drawableSize + override val intrinsicSize: Size + get() = Size( + drawable.intrinsicWidth.toFloat(), + drawable.intrinsicHeight.toFloat() + ) override fun DrawScope.onDraw() { if (!startedAnimatable && drawable is Animatable && !drawable.isRunning) { @@ -116,7 +118,17 @@ class AndroidDrawablePainter( invalidateTick drawable.setBounds(0, 0, size.width.toInt(), size.height.toInt()) - drawable.draw(canvas.nativeCanvas) + + canvas.withSave { + // Painters are responsible for scaling content to meet the canvas size + if (drawable.intrinsicWidth > 0 && drawable.intrinsicHeight > 0) { + canvas.scale( + sx = size.width / drawable.intrinsicWidth, + sy = size.height / drawable.intrinsicHeight + ) + } + drawable.draw(canvas.nativeCanvas) + } } } }