Use Drawable::level to animate dynamic clock icons

This commit is contained in:
MM20 2023-06-21 15:50:10 +02:00
parent a78ef7f4bd
commit dc23ef1f32
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389

View File

@ -416,22 +416,21 @@ private fun ClockLayer(
} }
val second = remember { val second = remember {
Animatable((time.second - defaultSecond).toFloat()) Animatable((time.second).toFloat() + (time.nano / 1000000f) / 1000f)
} }
val minute = remember { val minute = remember {
Animatable((time.minute - defaultMinute).toFloat() + time.second.toFloat() / 60f) Animatable((time.minute).toFloat() + time.second.toFloat() / 60f)
} }
val hour = remember { val hour = remember {
Animatable((time.hour - defaultHour).toFloat() + time.minute.toFloat() / 60f) Animatable((time.hour).toFloat() + time.minute.toFloat() / 60f)
} }
LaunchedEffect(time) { LaunchedEffect(time) {
val h = (time.hour - defaultHour).toFloat() + (time.minute - defaultSecond).toFloat() / 60f val h = (time.hour).toFloat() + (time.minute).toFloat() / 60f
val m = val m = (time.minute.toFloat() + (time.second).toFloat() / 60f)
(time.minute - defaultMinute).toFloat() + (time.second - defaultSecond).toFloat() / 60f val s = (time.second).toFloat() + (time.nano / 1000000f) / 1000f
val s = (time.second - defaultSecond).toFloat() + (time.nano / 1000000f) / 1000f
second.snapTo(s) second.snapTo(s)
hour.snapTo(h) hour.snapTo(h)
minute.snapTo(m) minute.snapTo(m)
@ -454,23 +453,15 @@ private fun ClockLayer(
this.scale(scale) this.scale(scale)
}) { }) {
for (sublayer in sublayers) { for (sublayer in sublayers) {
withTransform({
when (sublayer.role) { when (sublayer.role) {
ClockSublayerRole.Hour -> { ClockSublayerRole.Hour -> {
rotate(hour.value / 12f * 360f) sublayer.drawable.level = (((hour.value.toInt() - defaultHour + 12) % 12) * 60
+ ((minute.value.toInt() - defaultMinute + 60) % 60))
} }
ClockSublayerRole.Minute -> sublayer.drawable.level = ((minute.value.toInt() - defaultMinute + 60) % 60)
ClockSublayerRole.Minute -> { ClockSublayerRole.Second -> sublayer.drawable.level = (((second.value.toInt() - defaultSecond + 60) % 60) * 10)
rotate(minute.value / 60f * 360f) else -> {}
} }
ClockSublayerRole.Second -> {
rotate(second.value / 60f * 360f)
}
ClockSublayerRole.Static -> {}
}
}) {
drawIntoCanvas { drawIntoCanvas {
sublayer.drawable.bounds = this.size.toRect().toAndroidRect() sublayer.drawable.bounds = this.size.toRect().toAndroidRect()
sublayer.drawable.drawWithColorFilter(it.nativeCanvas, colorFilter) sublayer.drawable.drawWithColorFilter(it.nativeCanvas, colorFilter)
@ -479,7 +470,6 @@ private fun ClockLayer(
} }
} }
} }
}
class BitmapShaderBrush( class BitmapShaderBrush(
val bitmap: Bitmap, val bitmap: Bitmap,