From 4b1b048adc481bf743ba9ba92f1c1a8ecaea8e8d Mon Sep 17 00:00:00 2001 From: perry <13410365214@163.com> Date: Fri, 27 Sep 2019 09:44:57 +0800 Subject: [PATCH] Support animator --- .../java/com/zdog/demo/ui/basic/Shapes.kt | 40 +-- .../main/java/com/zdog/demo/ui/effects/Sky.kt | 10 +- .../zdog/demo/ui/effects/cloud/CloudSky.kt | 4 +- .../com/zdog/demo/ui/effects/rain/RainSky.kt | 7 +- .../zdog/demo/ui/effects/rain/Raindrops.kt | 5 +- .../com/zdog/demo/ui/effects/rain/Sea2.kt | 1 - .../com/zdog/demo/ui/effects/rain/Sea3.kt | 5 +- .../com/zdog/demo/ui/effects/rain/Ship.kt | 6 +- .../com/zdog/demo/ui/effects/rain/Smoke.kt | 5 +- .../com/zdog/demo/ui/effects/rain/Spray.kt | 1 - .../com/zdog/demo/ui/effects/sunny/Bird.kt | 1 + .../com/zdog/demo/ui/effects/sunny/Clouds.kt | 4 +- .../zdog/demo/ui/effects/sunny/Glowworm.kt | 4 +- .../zdog/demo/ui/effects/sunny/RandomMover.kt | 4 +- .../com/zdog/demo/ui/effects/sunny/Stars.kt | 1 + .../zdog/demo/ui/effects/sunny/SunnySky.kt | 4 +- .../main/java/com/zdog/demo/ui/shapes/Sun.kt | 8 +- .../java/com/zdog/demo/ui/shapes/World.kt | 182 +------------ .../java/com/zdog/demo/ui/status/Cloudy.kt | 8 +- .../main/java/com/zdog/demo/ui/status/Drop.kt | 2 +- .../main/java/com/zdog/demo/ui/status/Dust.kt | 4 +- .../main/java/com/zdog/demo/ui/status/Fog.kt | 10 +- .../java/com/zdog/demo/ui/status/Storm.kt | 2 +- .../java/com/zdog/demo/ui/status/Sunny.kt | 2 +- .../java/com/zdog/demo/ui/status/Tornado.kt | 2 +- .../java/com/zdog/demo/ui/status/Unknown.kt | 2 +- .../java/com/zdog/demo/ui/status/Windy.kt | 2 +- .../java/com/zdog/library/render/Anchor.kt | 6 +- .../java/com/zdog/library/render}/Animator.kt | 71 ++--- .../com/zdog/library/render/ZdogDrawable.kt | 249 ++++++++++++++++++ 30 files changed, 344 insertions(+), 308 deletions(-) rename {app/src/main/java/com/zdog/demo/ui/shapes => library/src/main/java/com/zdog/library/render}/Animator.kt (69%) create mode 100644 library/src/main/java/com/zdog/library/render/ZdogDrawable.kt diff --git a/app/src/main/java/com/zdog/demo/ui/basic/Shapes.kt b/app/src/main/java/com/zdog/demo/ui/basic/Shapes.kt index 45bec8d..c6f6c57 100644 --- a/app/src/main/java/com/zdog/demo/ui/basic/Shapes.kt +++ b/app/src/main/java/com/zdog/demo/ui/basic/Shapes.kt @@ -1,8 +1,8 @@ package com.zdog.demo.ui.basic import com.zdog.demo.ui.shapes.World -import com.zdog.demo.ui.shapes.duration -import com.zdog.demo.ui.shapes.repeat +import com.zdog.library.render.duration +import com.zdog.library.render.repeat import com.zdog.library.render.* class Shapes { @@ -13,7 +13,7 @@ class Shapes { init { var index = 0 shape { - addTo = shapes[index++].world + addTo = shapes[index++].illo path( line(x = -40f), line(x = 40f) @@ -23,7 +23,7 @@ class Shapes { } shape { - addTo = shapes[index++].world + addTo = shapes[index++].illo path( line(x = -32f, y = -40f), line(x = 32f, y = -40f), @@ -36,7 +36,7 @@ class Shapes { } shape { - addTo = shapes[index++].world + addTo = shapes[index++].illo path( line(x = -32f, y = -40f, z = 40f), line(x = 32f, y = -40f), @@ -49,7 +49,7 @@ class Shapes { } shape { - addTo = shapes[index++].world + addTo = shapes[index++].illo path( line(x = -60f, y = -60f), arc( @@ -67,7 +67,7 @@ class Shapes { } shape { - addTo = shapes[index++].world + addTo = shapes[index++].illo path( line(x = -60f, y = -60f), bezier( @@ -82,7 +82,7 @@ class Shapes { } val triangle = shape { - addTo = shapes[index++].world + addTo = shapes[index++].illo path( line(x = 0f, y = -40f), line(x = 40f, y = 40f), @@ -93,12 +93,12 @@ class Shapes { } triangle.copy { - addTo = shapes[index++].world + addTo = shapes[index++].illo closed = false } hemisphere { - addTo = shapes[index++].world + addTo = shapes[index++].illo diameter = 120f stroke = 0f color = "#C25".toColour() @@ -106,7 +106,7 @@ class Shapes { } cone { - addTo = shapes[index++].world + addTo = shapes[index++].illo diameter = 70f length = 90f stroke = 0f @@ -115,7 +115,7 @@ class Shapes { } cylinder { - addTo = shapes[index++].world + addTo = shapes[index++].illo diameter = 80f length = 120f stroke = 0f @@ -124,7 +124,7 @@ class Shapes { } cylinder { - addTo = shapes[index++].world + addTo = shapes[index++].illo diameter = 80f length = 120f stroke = 0f @@ -134,7 +134,7 @@ class Shapes { } val box = box { - addTo = shapes[index++].world + addTo = shapes[index++].illo width = 120f height = 100f depth = 80f @@ -147,7 +147,7 @@ class Shapes { } box.copy { - addTo = shapes[index++].world + addTo = shapes[index++].illo leftFace = null rightFace = null rearFace = "#EA0".toColour() @@ -155,9 +155,9 @@ class Shapes { val distance = 40f - shapes[index].world.rotate(x = -(TAU / 16).toFloat()) + shapes[index].illo.rotate(x = -(TAU / 16).toFloat()) val dot = shape { - addTo = shapes[index++].world + addTo = shapes[index++].illo translate(y = -distance) stroke = 80f color = "#636".toColour() @@ -182,9 +182,9 @@ class Shapes { translate(y = distance) } - shapes[index].world.rotate(x = -(TAU / 16).toFloat()) + shapes[index].illo.rotate(x = -(TAU / 16).toFloat()) val dot2 = dot.copy { - addTo = shapes[index++].world + addTo = shapes[index++].illo } dot2.copy { translate(x = -distance) @@ -205,7 +205,7 @@ class Shapes { shapes.forEach { it.apply { play( - world.rotateTo(y = TAU.toFloat()).duration(3000).repeat() + illo.rotateTo(y = TAU.toFloat()).duration(3000).repeat() ) } } diff --git a/app/src/main/java/com/zdog/demo/ui/effects/Sky.kt b/app/src/main/java/com/zdog/demo/ui/effects/Sky.kt index e3a7b15..ddbae33 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/Sky.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/Sky.kt @@ -6,7 +6,7 @@ import com.zdog.library.render.* class Sky(world: World) { val background = shape { - addTo = world.world + addTo = world.illo translate(z = layerSpace * -2) visible = false } @@ -97,7 +97,7 @@ class Sky(world: World) { } cloud = cloud { - addTo = world.world + addTo = world.illo translate(z = layerSpace * -1) } } @@ -108,7 +108,7 @@ class Sky(world: World) { bgGroup3.color = theme.background3 sun.color = theme.sun cloud.color = theme.cloud - world.world.color = theme.sky + world.illo.color = theme.sky } fun onSwitchDay(world: World, theme: SkyTheme, inDay: Boolean) { @@ -130,7 +130,7 @@ class Sky(world: World) { bgGroup2.colorTo(world, theme.background2).duration(1200).start() bgGroup3.colorTo(world, theme.background3).duration(1200).start() cloud.colorTo(world, theme.cloud).duration(1200).start() - world.world.colorTo(world, theme.sky).duration(1200).start() + world.illo.colorTo(world, theme.sky).duration(1200).start() } else { sunshine.children.forEachIndexed { index, dot -> dot.translateTo( @@ -152,7 +152,7 @@ class Sky(world: World) { bgGroup2.colorTo(world, theme.background2).delay(1200).start() bgGroup3.colorTo(world, theme.background3).delay(1200).start() cloud.colorTo(world, theme.cloud).delay(1200).start() - world.world.colorTo(world, theme.sky).delay(1200).start() + world.illo.colorTo(world, theme.sky).delay(1200).start() } } } \ No newline at end of file diff --git a/app/src/main/java/com/zdog/demo/ui/effects/cloud/CloudSky.kt b/app/src/main/java/com/zdog/demo/ui/effects/cloud/CloudSky.kt index 3e88d63..7001886 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/cloud/CloudSky.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/cloud/CloudSky.kt @@ -3,8 +3,8 @@ package com.zdog.demo.ui.effects.cloud import com.zdog.demo.ui.effects.Entity import com.zdog.demo.ui.effects.Sky import com.zdog.demo.ui.shapes.World -import com.zdog.demo.ui.shapes.duration -import com.zdog.demo.ui.shapes.translateTo +import com.zdog.library.render.duration +import com.zdog.library.render.translateTo class CloudSky(private val sky: Sky) : Entity() { override fun onAttachTo(world: World, inDay: Boolean) { diff --git a/app/src/main/java/com/zdog/demo/ui/effects/rain/RainSky.kt b/app/src/main/java/com/zdog/demo/ui/effects/rain/RainSky.kt index 88bed02..11f1fec 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/rain/RainSky.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/rain/RainSky.kt @@ -1,13 +1,10 @@ package com.zdog.demo.ui.effects.rain -import android.animation.ValueAnimator import com.zdog.demo.ui.effects.Entity import com.zdog.demo.ui.effects.Sky import com.zdog.demo.ui.effects.layerSpace import com.zdog.demo.ui.shapes.* -import com.zdog.library.render.attachTo -import com.zdog.library.render.set -import com.zdog.library.render.vector +import com.zdog.library.render.* class RainSky(private val sky: Sky) : Entity() { private val drops1 = Raindrops( @@ -75,6 +72,6 @@ class RainSky(private val sky: Sky) : Entity() { sky.cloud.colorTo(world, theme.cloud).duration(1200).start() drops1.colorTo(world, theme.sea1).duration(1200).start() drops2.colorTo(world, theme.sea3).duration(1200).start() - world.world.colorTo(world, theme.sky).duration(1200).start() + world.illo.colorTo(world, theme.sky).duration(1200).start() } } \ No newline at end of file diff --git a/app/src/main/java/com/zdog/demo/ui/effects/rain/Raindrops.kt b/app/src/main/java/com/zdog/demo/ui/effects/rain/Raindrops.kt index 243a1b1..1ef820c 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/rain/Raindrops.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/rain/Raindrops.kt @@ -3,10 +3,7 @@ package com.zdog.demo.ui.effects.rain import android.animation.Animator import android.animation.AnimatorListenerAdapter import com.zdog.demo.ui.shapes.* -import com.zdog.library.render.Combine -import com.zdog.library.render.Shape -import com.zdog.library.render.line -import com.zdog.library.render.set +import com.zdog.library.render.* import kotlin.random.Random class Raindrops(count: Int, diff --git a/app/src/main/java/com/zdog/demo/ui/effects/rain/Sea2.kt b/app/src/main/java/com/zdog/demo/ui/effects/rain/Sea2.kt index 0a4b0bd..9624b85 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/rain/Sea2.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/rain/Sea2.kt @@ -1,6 +1,5 @@ package com.zdog.demo.ui.effects.rain -import android.animation.ValueAnimator import com.zdog.demo.ui.effects.Entity import com.zdog.demo.ui.effects.layerSpace import com.zdog.demo.ui.shapes.* diff --git a/app/src/main/java/com/zdog/demo/ui/effects/rain/Sea3.kt b/app/src/main/java/com/zdog/demo/ui/effects/rain/Sea3.kt index e36420c..b7f6260 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/rain/Sea3.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/rain/Sea3.kt @@ -3,10 +3,7 @@ package com.zdog.demo.ui.effects.rain import com.zdog.demo.ui.effects.Entity import com.zdog.demo.ui.effects.layerSpace import com.zdog.demo.ui.shapes.* -import com.zdog.library.render.Shape -import com.zdog.library.render.anchor -import com.zdog.library.render.line -import com.zdog.library.render.shape +import com.zdog.library.render.* class Sea3 : Entity() { private val container = anchor { diff --git a/app/src/main/java/com/zdog/demo/ui/effects/rain/Ship.kt b/app/src/main/java/com/zdog/demo/ui/effects/rain/Ship.kt index bec1e92..1dabc32 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/rain/Ship.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/rain/Ship.kt @@ -1,9 +1,9 @@ package com.zdog.demo.ui.effects.rain import com.zdog.demo.ui.shapes.World -import com.zdog.demo.ui.shapes.colorTo -import com.zdog.demo.ui.shapes.delay -import com.zdog.demo.ui.shapes.duration +import com.zdog.library.render.colorTo +import com.zdog.library.render.delay +import com.zdog.library.render.duration import com.zdog.library.render.* class Ship : Group() { diff --git a/app/src/main/java/com/zdog/demo/ui/effects/rain/Smoke.kt b/app/src/main/java/com/zdog/demo/ui/effects/rain/Smoke.kt index 1615914..d851574 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/rain/Smoke.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/rain/Smoke.kt @@ -1,10 +1,7 @@ package com.zdog.demo.ui.effects.rain import com.zdog.demo.ui.shapes.* -import com.zdog.library.render.Combine -import com.zdog.library.render.copy -import com.zdog.library.render.ellipse -import com.zdog.library.render.magnitudeSqrt +import com.zdog.library.render.* class Smoke : Combine() { init { diff --git a/app/src/main/java/com/zdog/demo/ui/effects/rain/Spray.kt b/app/src/main/java/com/zdog/demo/ui/effects/rain/Spray.kt index e6c8477..4daf91c 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/rain/Spray.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/rain/Spray.kt @@ -1,6 +1,5 @@ package com.zdog.demo.ui.effects.rain -import android.animation.ValueAnimator import com.zdog.demo.ui.shapes.* import com.zdog.library.render.* diff --git a/app/src/main/java/com/zdog/demo/ui/effects/sunny/Bird.kt b/app/src/main/java/com/zdog/demo/ui/effects/sunny/Bird.kt index ea98d1a..d14fcfa 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/sunny/Bird.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/sunny/Bird.kt @@ -5,6 +5,7 @@ import com.zdog.demo.ui.effects.bird import com.zdog.demo.ui.effects.layerSpace import com.zdog.demo.ui.shapes.* import com.zdog.demo.ui.shapes.Colors.midnight +import com.zdog.library.render.* class Bird : Entity() { private val shape = bird { diff --git a/app/src/main/java/com/zdog/demo/ui/effects/sunny/Clouds.kt b/app/src/main/java/com/zdog/demo/ui/effects/sunny/Clouds.kt index fcb2b38..2997067 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/sunny/Clouds.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/sunny/Clouds.kt @@ -6,9 +6,7 @@ import com.zdog.demo.ui.effects.cloud2 import com.zdog.demo.ui.effects.layerSpace import com.zdog.demo.ui.shapes.* import com.zdog.demo.ui.shapes.Colors.white -import com.zdog.library.render.TAU -import com.zdog.library.render.combine -import com.zdog.library.render.copy +import com.zdog.library.render.* class Clouds : Entity() { private val container = combine { diff --git a/app/src/main/java/com/zdog/demo/ui/effects/sunny/Glowworm.kt b/app/src/main/java/com/zdog/demo/ui/effects/sunny/Glowworm.kt index 6705f0a..ea4d9a7 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/sunny/Glowworm.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/sunny/Glowworm.kt @@ -5,8 +5,8 @@ import com.zdog.demo.ui.effects.layerSpace import com.zdog.demo.ui.shapes.Colors import com.zdog.demo.ui.shapes.Colors.amber import com.zdog.demo.ui.shapes.World -import com.zdog.demo.ui.shapes.alphaTo -import com.zdog.demo.ui.shapes.delay +import com.zdog.library.render.alphaTo +import com.zdog.library.render.delay import com.zdog.library.render.anchor import com.zdog.library.render.copy import com.zdog.library.render.shape diff --git a/app/src/main/java/com/zdog/demo/ui/effects/sunny/RandomMover.kt b/app/src/main/java/com/zdog/demo/ui/effects/sunny/RandomMover.kt index 8f7f4d9..61fb75b 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/sunny/RandomMover.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/sunny/RandomMover.kt @@ -4,9 +4,7 @@ package com.zdog.demo.ui.effects.sunny import android.animation.Animator import android.animation.AnimatorListenerAdapter import com.zdog.demo.ui.shapes.* -import com.zdog.library.render.Anchor -import com.zdog.library.render.Vector -import com.zdog.library.render.vector +import com.zdog.library.render.* import kotlin.random.Random class RandomMover( diff --git a/app/src/main/java/com/zdog/demo/ui/effects/sunny/Stars.kt b/app/src/main/java/com/zdog/demo/ui/effects/sunny/Stars.kt index a546566..4adde29 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/sunny/Stars.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/sunny/Stars.kt @@ -5,6 +5,7 @@ import com.zdog.demo.ui.effects.layerSpace import com.zdog.demo.ui.effects.star import com.zdog.demo.ui.shapes.* import com.zdog.demo.ui.shapes.Colors.gold1 +import com.zdog.library.render.* class Stars: Entity() { private val star1 = star { diff --git a/app/src/main/java/com/zdog/demo/ui/effects/sunny/SunnySky.kt b/app/src/main/java/com/zdog/demo/ui/effects/sunny/SunnySky.kt index 17fd4ec..63eb6df 100644 --- a/app/src/main/java/com/zdog/demo/ui/effects/sunny/SunnySky.kt +++ b/app/src/main/java/com/zdog/demo/ui/effects/sunny/SunnySky.kt @@ -3,8 +3,8 @@ package com.zdog.demo.ui.effects.sunny import com.zdog.demo.ui.effects.Entity import com.zdog.demo.ui.effects.Sky import com.zdog.demo.ui.shapes.World -import com.zdog.demo.ui.shapes.duration -import com.zdog.demo.ui.shapes.translateTo +import com.zdog.library.render.duration +import com.zdog.library.render.translateTo class SunnySky(private val sky: Sky): Entity() { override fun onAttachTo(world: World, inDay: Boolean) { diff --git a/app/src/main/java/com/zdog/demo/ui/shapes/Sun.kt b/app/src/main/java/com/zdog/demo/ui/shapes/Sun.kt index 615fee0..fe8e35a 100644 --- a/app/src/main/java/com/zdog/demo/ui/shapes/Sun.kt +++ b/app/src/main/java/com/zdog/demo/ui/shapes/Sun.kt @@ -5,13 +5,7 @@ import android.animation.ValueAnimator import android.view.animation.OvershootInterpolator import com.zdog.demo.ui.shapes.Colors.gold1 import com.zdog.demo.ui.shapes.Colors.gold2 -import com.zdog.library.render.Anchor -import com.zdog.library.render.Combine -import com.zdog.library.render.TAU -import com.zdog.library.render.combine -import com.zdog.library.render.copy -import com.zdog.library.render.rect -import com.zdog.library.render.shape +import com.zdog.library.render.* class Sun(diameter: Float) : Anchor() { private val sunshine: Combine diff --git a/app/src/main/java/com/zdog/demo/ui/shapes/World.kt b/app/src/main/java/com/zdog/demo/ui/shapes/World.kt index 8259f0a..e269058 100644 --- a/app/src/main/java/com/zdog/demo/ui/shapes/World.kt +++ b/app/src/main/java/com/zdog/demo/ui/shapes/World.kt @@ -1,194 +1,26 @@ package com.zdog.demo.ui.shapes -import android.animation.Animator -import android.animation.AnimatorListenerAdapter -import android.animation.AnimatorSet -import android.animation.ValueAnimator -import android.graphics.Canvas -import android.graphics.ColorFilter -import android.graphics.PixelFormat -import android.graphics.Rect -import android.graphics.drawable.Drawable import androidx.interpolator.view.animation.FastOutSlowInInterpolator import com.zdog.library.render.* -open class World: Drawable() { - val world = illustration { - color.alpha = 0 - } - private val resetCallbacks = mutableListOf<()-> Unit>() - - protected var animator: AnimatorSet? = null - - override fun draw(canvas: Canvas) { - world.updateRenderGraph(canvas) - } - - override fun onBoundsChange(bounds: Rect?) { - bounds?.let { - changeSize(it.width(), it.height()) - } - } - - override fun setAlpha(alpha: Int) { - world.alpha = alpha / 255f - } - - override fun getOpacity(): Int { - return PixelFormat.TRANSLUCENT - } - - override fun setColorFilter(colorFilter: ColorFilter?) { - } - - private fun changeSize(width: Int, height: Int) { - world.zoom = Math.min(width, height)/240f - world.onResize(width.toFloat(), height.toFloat()) - } - - fun addChild(shape: Anchor) { - world.addChild(shape) - } - - fun removeChild(shape: Anchor) { - shape.remove() +open class World: ZdogDrawable() { + init { + illo.color.alpha = 0 } fun rotate(rotate: Boolean) { if (rotate) { - world.animate { + illo.animate { interpolator = FastOutSlowInInterpolator() update { val theta = it * TAU val delta = TAU * -3 / 64 - world.rotate.y = (Math.sin(theta) * delta).toFloat() - world.rotate.x = ((Math.cos(theta) * -0.5 + 0.5) * delta).toFloat() + illo.rotate.y = (Math.sin(theta) * delta).toFloat() + illo.rotate.x = ((Math.cos(theta) * -0.5 + 0.5) * delta).toFloat() } }.duration(1500).repeat().start() } else { - world.getAnimator(Anchor.AnimatorType.Custom)?.repeatCount = 0 - } - } - - fun animator(): AnimatorSet { - animator = animator?: AnimatorSet() - return animator!! - } - - fun play(block: ValueAnimator.()-> Unit) = - animator().play(block) - - fun play(anim: ValueAnimator) = - animator().play(anim) - - fun cancel() { - animator?.cancel() - resetCallbacks.forEach { - it.invoke() - invalidateSelf() - } - } - - fun clearAnimator() { - animator?.pause() - animator = null - } - - fun isRunning(): Boolean { - return animator?.isRunning ?: false - } - - fun onEnd(block: ()-> Unit) { - animator?.addListener(object: AnimatorListenerAdapter() { - override fun onAnimationCancel(animation: Animator?) { - block() - } - - override fun onAnimationEnd(animation: Animator?) { - block() - } - }) - } - - fun onReset(block: ()-> Unit) { - resetCallbacks.add(block) - } - - fun start() { - if (isRunning()) { - return - } - animator?.start() - } - - fun start(delay: Long = 0) { - if (isRunning()) { - return - } - animator?.apply { - startDelay = delay - start() - } - } - - fun resume() { - animator?.apply { - if (isPaused) { - resume() - } - } - } - - fun pause() { - if (isRunning()) { - animator?.pause() + illo.getAnimator(Anchor.AnimatorType.Custom)?.repeatCount = 0 } } - - fun AnimatorSet.play(block: ValueAnimator.()-> Unit): AnimatorSet.Builder = - this.play(ValueAnimator.ofFloat(0f, 1f).apply(block)) - - fun AnimatorSet.Builder.with(block: ValueAnimator.()-> Unit): AnimatorSet.Builder = - this.with(ValueAnimator.ofFloat(0f, 1f).apply(block)) - - fun AnimatorSet.Builder.before(block: ValueAnimator.()-> Unit): AnimatorSet.Builder = - this.before(ValueAnimator.ofFloat(0f, 1f).apply(block)) - - fun AnimatorSet.Builder.after(block: ValueAnimator.()-> Unit): AnimatorSet.Builder = - this.after(ValueAnimator.ofFloat(0f, 1f).apply(block)) - - fun ValueAnimator.update(block: (Float)-> Unit) { - update(this@World, block) - } - - fun Anchor.translateTo(x: Float = translate.x, y: Float = translate.y, z: Float = translate.z, - block: (ValueAnimator.() -> Unit)? = null) = - translateTo(this@World, x, y, z, block) - - fun Anchor.translateBy(x: Float = 0f, y: Float = 0f, z: Float = 0f, - block: (ValueAnimator.() -> Unit)? = null) = - translateBy(this@World, x, y, z, block) - - fun Anchor.translateBy(delta: Vector, block: (ValueAnimator.() -> Unit)? = null) = - translateBy(this@World, delta, block) - - fun Anchor.rotateTo(x: Float = rotate.x, y: Float = rotate.y, z: Float = rotate.z, - block: (ValueAnimator.() -> Unit)? = null) = - rotateTo(this@World, x, y, z, block) - - fun Anchor.rotateBy(x: Float = 0f, y: Float = 0f, z: Float = 0f, - block: (ValueAnimator.() -> Unit)? = null) = - rotateBy(this@World, x, y, z, block) - - fun Anchor.rotateBy(delta: Vector, block: (ValueAnimator.() -> Unit)? = null) = - rotateBy(this@World, delta, block) - - fun Anchor.scaleTo(dest: Float, block: (ValueAnimator.() -> Unit)? = null) = - scaleTo(this@World, dest, block) - - fun Anchor.alphaTo(dest: Float, block: (ValueAnimator.() -> Unit)? = null) = - alphaTo(this@World, dest, block) - - fun Anchor.colorTo(dest: Colour, block: (ValueAnimator.() -> Unit)? = null) = - colorTo(this@World, dest, block) } \ No newline at end of file diff --git a/app/src/main/java/com/zdog/demo/ui/status/Cloudy.kt b/app/src/main/java/com/zdog/demo/ui/status/Cloudy.kt index cb6b896..8b2058e 100644 --- a/app/src/main/java/com/zdog/demo/ui/status/Cloudy.kt +++ b/app/src/main/java/com/zdog/demo/ui/status/Cloudy.kt @@ -12,7 +12,7 @@ class Cloudy : Status() { init { anchor { translate { x = -80f; y = 40f } - addTo = world + addTo = illo }.also { Cloud().set { color = white.colour @@ -28,20 +28,20 @@ class Cloudy : Status() { translate { x = -70f; y = 10f; z = -8f } scale(1.2f) color = white.colour - addTo = world + addTo = illo } } override fun onDynamic(inDay: Boolean) { super.onDynamic(inDay) play( - world.children[0].translateBy(10f, 10f) { + illo.children[0].translateBy(10f, 10f) { repeatMode = REVERSE repeatCount = INFINITE duration = 1000 } ).with( - world.children[1].translateBy(10f, 10f) { + illo.children[1].translateBy(10f, 10f) { repeatMode = REVERSE repeatCount = INFINITE duration = 1000 diff --git a/app/src/main/java/com/zdog/demo/ui/status/Drop.kt b/app/src/main/java/com/zdog/demo/ui/status/Drop.kt index 8df5f61..10d404f 100644 --- a/app/src/main/java/com/zdog/demo/ui/status/Drop.kt +++ b/app/src/main/java/com/zdog/demo/ui/status/Drop.kt @@ -7,7 +7,7 @@ import com.zdog.library.render.anchor open class Drop(vararg components: Anchor, showers: Boolean = false) : Scattered(showers) { protected val drops = anchor { - addTo = world + addTo = illo components.forEach { addChild(it) } diff --git a/app/src/main/java/com/zdog/demo/ui/status/Dust.kt b/app/src/main/java/com/zdog/demo/ui/status/Dust.kt index 710a01f..2a034a1 100644 --- a/app/src/main/java/com/zdog/demo/ui/status/Dust.kt +++ b/app/src/main/java/com/zdog/demo/ui/status/Dust.kt @@ -21,12 +21,12 @@ class Dust: Scattered() { stroke = 16f fill = false color = "#ddd".toColour() - addTo = world + addTo = illo } dusts = combine { translate { y = 100f; z = -8f } - addTo = world + addTo = illo color = dust.colour }.also { val dots = shape { diff --git a/app/src/main/java/com/zdog/demo/ui/status/Fog.kt b/app/src/main/java/com/zdog/demo/ui/status/Fog.kt index 0796f34..742f841 100644 --- a/app/src/main/java/com/zdog/demo/ui/status/Fog.kt +++ b/app/src/main/java/com/zdog/demo/ui/status/Fog.kt @@ -9,7 +9,7 @@ import com.zdog.library.render.shape class Fog : Scattered() { private val fog1 = combine { - addTo = world + addTo = illo translate { x = -5f; y = 35f; z = -8f } color = rain.colour }.also { @@ -25,7 +25,7 @@ class Fog : Scattered() { } } private val fog2 = combine { - addTo = world + addTo = illo translate { x = 5f; y = 50f; z = -8f } color = rain.colour }.also { @@ -46,7 +46,7 @@ class Fog : Scattered() { } } private val fog3 = combine { - addTo = world + addTo = illo translate { x = -5f; y = 65f; z = -8f } color = rain.colour }.also { @@ -72,7 +72,7 @@ class Fog : Scattered() { } } private val fog4 = combine { - addTo = world + addTo = illo translate { x = 5f; y = 80f; z = -8f } color = rain.colour }.also { @@ -103,7 +103,7 @@ class Fog : Scattered() { } } private val fog5 = combine { - addTo = world + addTo = illo translate { x = -5f; y = 95f; z = -8f } color = rain.colour }.also { diff --git a/app/src/main/java/com/zdog/demo/ui/status/Storm.kt b/app/src/main/java/com/zdog/demo/ui/status/Storm.kt index 4625278..599cfac 100644 --- a/app/src/main/java/com/zdog/demo/ui/status/Storm.kt +++ b/app/src/main/java/com/zdog/demo/ui/status/Storm.kt @@ -19,7 +19,7 @@ open class Storm(vararg components: Anchor = } drops.forEach { it.translate { x= 20f; y = 10f; z = -8f } - world.addChild(it) + illo.addChild(it) } } diff --git a/app/src/main/java/com/zdog/demo/ui/status/Sunny.kt b/app/src/main/java/com/zdog/demo/ui/status/Sunny.kt index 8394ee5..47c7a1e 100644 --- a/app/src/main/java/com/zdog/demo/ui/status/Sunny.kt +++ b/app/src/main/java/com/zdog/demo/ui/status/Sunny.kt @@ -12,7 +12,7 @@ import com.zdog.library.render.set open class Sunny(diameter: Float=100f): Status() { protected val sky = anchor { - addTo = world + addTo = illo } protected val moon by lazy { diff --git a/app/src/main/java/com/zdog/demo/ui/status/Tornado.kt b/app/src/main/java/com/zdog/demo/ui/status/Tornado.kt index 074c282..69078f7 100644 --- a/app/src/main/java/com/zdog/demo/ui/status/Tornado.kt +++ b/app/src/main/java/com/zdog/demo/ui/status/Tornado.kt @@ -10,7 +10,7 @@ class Tornado : Scattered() { private val tornado = tornado { translate { y = 110f; z = -8f } color = wind.colour - addTo = world + addTo = illo } override fun onDynamic(inDay: Boolean) { diff --git a/app/src/main/java/com/zdog/demo/ui/status/Unknown.kt b/app/src/main/java/com/zdog/demo/ui/status/Unknown.kt index 319e19e..d01005b 100644 --- a/app/src/main/java/com/zdog/demo/ui/status/Unknown.kt +++ b/app/src/main/java/com/zdog/demo/ui/status/Unknown.kt @@ -9,7 +9,7 @@ import com.zdog.library.render.set class Unknown : Scattered() { private val question = Question().set { - addTo = world + addTo = illo translate { y = 50f } } diff --git a/app/src/main/java/com/zdog/demo/ui/status/Windy.kt b/app/src/main/java/com/zdog/demo/ui/status/Windy.kt index 68e6932..8619897 100644 --- a/app/src/main/java/com/zdog/demo/ui/status/Windy.kt +++ b/app/src/main/java/com/zdog/demo/ui/status/Windy.kt @@ -9,7 +9,7 @@ import com.zdog.library.render.set open class Windy : Scattered() { protected val wind = Wind().set { color = Colors.wind.colour - addTo = world + addTo = illo alpha = 0f scale(0.7f) translate { y = 70f; z = -8f } diff --git a/library/src/main/java/com/zdog/library/render/Anchor.kt b/library/src/main/java/com/zdog/library/render/Anchor.kt index ac92b08..a5e2ffa 100644 --- a/library/src/main/java/com/zdog/library/render/Anchor.kt +++ b/library/src/main/java/com/zdog/library/render/Anchor.kt @@ -46,7 +46,7 @@ open class Anchor: IProperty { Color } - private val animators = SparseArray(AnimatorType.values().size) + private val animators by lazy { SparseArray(AnimatorType.values().size) } override fun onCreate() { addTo?.addChild(this) @@ -195,7 +195,7 @@ open class Anchor: IProperty { for (i in 0 until animators.size()) { val animator = animators.valueAt(i) if (animator != null) { - animator.removeAllListeners() + animator.pause() animator.cancel() } } @@ -206,7 +206,7 @@ open class Anchor: IProperty { fun addAnimator(type: AnimatorType, animator: ValueAnimator) { val old = animators[type.ordinal] if (old != null) { - old.removeAllListeners() + old.pause() old.cancel() } animators.put(type.ordinal, animator) diff --git a/app/src/main/java/com/zdog/demo/ui/shapes/Animator.kt b/library/src/main/java/com/zdog/library/render/Animator.kt similarity index 69% rename from app/src/main/java/com/zdog/demo/ui/shapes/Animator.kt rename to library/src/main/java/com/zdog/library/render/Animator.kt index 23b77a7..25b2a74 100644 --- a/app/src/main/java/com/zdog/demo/ui/shapes/Animator.kt +++ b/library/src/main/java/com/zdog/library/render/Animator.kt @@ -1,19 +1,16 @@ -package com.zdog.demo.ui.shapes +package com.zdog.library.render import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.animation.TimeInterpolator import android.animation.ValueAnimator +import android.graphics.drawable.Drawable import android.view.animation.LinearInterpolator -import com.zdog.library.render.Anchor -import com.zdog.library.render.Colour -import com.zdog.library.render.Vector -import com.zdog.library.render.vector -fun ValueAnimator.update(world: World, block: (Float)-> Unit) { +fun ValueAnimator.update(d: Drawable, block: (Float)-> Unit) { addUpdateListener { block.invoke(it.animatedFraction) - world.invalidateSelf() + d.invalidateSelf() } } @@ -78,32 +75,28 @@ fun Anchor.animate(block: (ValueAnimator.() -> Unit)? = null): ValueAnimator { } } -fun Anchor.translateTo(world: World, x: Float = translate.x, y: Float = translate.y, z: Float = translate.z, +fun Anchor.translateTo(d: Drawable, x: Float = translate.x, y: Float = translate.y, z: Float = translate.z, block: (ValueAnimator.() -> Unit)? = null) = - translateTo(world, vector(x, y, z), block) + translateTo(d, vector(x, y, z), block) -fun Anchor.translateTo(world: World, vector: Vector, +fun Anchor.translateTo(d: Drawable, vector: Vector, block: (ValueAnimator.() -> Unit)? = null) = - translateBy(world, vector.subtract(this.translate), block) + translateBy(d, vector.subtract(this.translate), block) -fun Anchor.translateBy(world: World, x: Float = 0f, y: Float = 0f, z: Float = 0f, +fun Anchor.translateBy(d: Drawable, x: Float = 0f, y: Float = 0f, z: Float = 0f, block: (ValueAnimator.() -> Unit)? = null) = - translateBy(world, vector(x, y, z), block) + translateBy(d, vector(x, y, z), block) -fun Anchor.translateBy(world: World, delta: Vector, block: (ValueAnimator.() -> Unit)? = null): ValueAnimator { +fun Anchor.translateBy(d: Drawable, delta: Vector, block: (ValueAnimator.() -> Unit)? = null): ValueAnimator { val src = translate.copy() - world.onReset { - translate.set(src) - } - return ValueAnimator.ofFloat(0f, 1f).also { it.interpolator = LinearInterpolator() it.duration = 300 block?.invoke(it) - it.update(world) { + it.update(d) { translate.set(delta).multiply(it).add(src) } @@ -111,28 +104,24 @@ fun Anchor.translateBy(world: World, delta: Vector, block: (ValueAnimator.() -> } } -fun Anchor.rotateTo(world: World, x: Float = rotate.x, y: Float = rotate.y, z: Float = rotate.z, +fun Anchor.rotateTo(d: Drawable, x: Float = rotate.x, y: Float = rotate.y, z: Float = rotate.z, block: (ValueAnimator.() -> Unit)? = null) = - rotateBy(world, vector(x, y, z).subtract(this.rotate), block) + rotateBy(d, vector(x, y, z).subtract(this.rotate), block) -fun Anchor.rotateBy(world: World, x: Float = 0f, y: Float = 0f, z: Float = 0f, +fun Anchor.rotateBy(d: Drawable, x: Float = 0f, y: Float = 0f, z: Float = 0f, block: (ValueAnimator.() -> Unit)? = null) = - rotateBy(world, vector(x, y, z), block) + rotateBy(d, vector(x, y, z), block) -fun Anchor.rotateBy(world: World, delta: Vector, block: (ValueAnimator.() -> Unit)? = null): ValueAnimator { +fun Anchor.rotateBy(d: Drawable, delta: Vector, block: (ValueAnimator.() -> Unit)? = null): ValueAnimator { val src = rotate.copy() - world.onReset { - rotate.set(src) - } - return ValueAnimator.ofFloat(0f, 1f).also { it.interpolator = LinearInterpolator() it.duration = 300 block?.invoke(it) - it.update(world) { + it.update(d) { rotate.set(delta).multiply(it).add(src) } @@ -140,21 +129,17 @@ fun Anchor.rotateBy(world: World, delta: Vector, block: (ValueAnimator.() -> Uni } } -fun Anchor.scaleTo(world: World, dest: Float, block: (ValueAnimator.() -> Unit)? = null): ValueAnimator { +fun Anchor.scaleTo(d: Drawable, dest: Float, block: (ValueAnimator.() -> Unit)? = null): ValueAnimator { val src = scale.copy() val delta = vector(dest).subtract(src) - world.onReset { - scale.set(src) - } - return ValueAnimator.ofFloat(0f, 1f).also { it.interpolator = LinearInterpolator() it.duration = 300 block?.invoke(it) - it.update(world) { + it.update(d) { scale.set(delta).multiply(it).add(src) } @@ -162,21 +147,17 @@ fun Anchor.scaleTo(world: World, dest: Float, block: (ValueAnimator.() -> Unit)? } } -fun Anchor.alphaTo(world: World, dest: Float, block: (ValueAnimator.() -> Unit)? = null): ValueAnimator { +fun Anchor.alphaTo(d: Drawable, dest: Float, block: (ValueAnimator.() -> Unit)? = null): ValueAnimator { val src = alpha val delta = dest - src - world.onReset { - alpha = src - } - return ValueAnimator.ofFloat(0f, 1f).also { it.interpolator = LinearInterpolator() it.duration = 300 block?.invoke(it) - it.update(world) { + it.update(d) { alpha = src + delta * it } @@ -184,7 +165,7 @@ fun Anchor.alphaTo(world: World, dest: Float, block: (ValueAnimator.() -> Unit)? } } -fun Anchor.colorTo(world: World, dest: Colour, block: (ValueAnimator.() -> Unit)? = null): ValueAnimator { +fun Anchor.colorTo(d: Drawable, dest: Colour, block: (ValueAnimator.() -> Unit)? = null): ValueAnimator { val c = arrayOf( color.alpha, color.red, color.green, color.blue ) @@ -195,10 +176,6 @@ fun Anchor.colorTo(world: World, dest: Colour, block: (ValueAnimator.() -> Unit) dest.blue - c[3] ) - world.onReset { - color.set(c[0], c[1], c[2], c[3]) - } - fun compute(delta: Int, from: Int, factor: Float) = (delta * factor + from).toInt() @@ -208,7 +185,7 @@ fun Anchor.colorTo(world: World, dest: Colour, block: (ValueAnimator.() -> Unit) block?.invoke(it) - it.update(world) { + it.update(d) { color.set( compute(delta[0], c[0], it), compute(delta[1], c[1], it), diff --git a/library/src/main/java/com/zdog/library/render/ZdogDrawable.kt b/library/src/main/java/com/zdog/library/render/ZdogDrawable.kt new file mode 100644 index 0000000..f442168 --- /dev/null +++ b/library/src/main/java/com/zdog/library/render/ZdogDrawable.kt @@ -0,0 +1,249 @@ +package com.zdog.library.render + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.AnimatorSet +import android.animation.ValueAnimator +import android.graphics.Canvas +import android.graphics.ColorFilter +import android.graphics.PixelFormat +import android.graphics.Rect +import android.graphics.drawable.Drawable + +open class ZdogDrawable : Drawable() { + val illo = illustration() + protected var animator: AnimatorSet? = null + + override fun draw(canvas: Canvas) { + illo.updateRenderGraph(canvas) + } + + override fun onBoundsChange(bounds: Rect?) { + bounds?.let { + changeSize(it.width(), it.height()) + } + } + + override fun setAlpha(alpha: Int) { + illo.alpha = alpha / 255f + } + + override fun getOpacity(): Int { + return PixelFormat.TRANSLUCENT + } + + override fun setColorFilter(colorFilter: ColorFilter?) { + } + + private fun changeSize(width: Int, height: Int) { + illo.zoom = Math.min(width, height) / 240f + illo.onResize(width.toFloat(), height.toFloat()) + } + + fun addChild(shape: Anchor) { + illo.addChild(shape) + } + + fun removeChild(shape: Anchor) { + shape.remove() + } + + fun animator(): AnimatorSet { + animator = animator ?: AnimatorSet() + return animator!! + } + + fun play(block: ValueAnimator.() -> Unit) = + animator().play(block) + + fun play(anim: ValueAnimator) = + animator().play(anim) + + fun cancel() { + animator?.pause() + animator?.cancel() + } + + fun clearAnimator() { + cancel() + animator = null + } + + fun isRunning(): Boolean { + return animator?.isRunning ?: false + } + + fun onEnd(block: () -> Unit) { + animator?.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator?) { + block() + } + }) + } + + fun onReset(block: () -> Unit) { + animator?.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator?) { + block() + } + + override fun onAnimationCancel(animation: Animator?) { + block() + } + }) + } + + fun start() { + if (isRunning()) { + return + } + animator?.start() + } + + fun start(delay: Long = 0) { + if (isRunning()) { + return + } + animator?.apply { + startDelay = delay + start() + } + } + + fun resume() { + animator?.apply { + if (isPaused) { + resume() + } + } + } + + fun pause() { + if (isRunning()) { + animator?.pause() + } + } + + fun AnimatorSet.play(block: ValueAnimator.() -> Unit): AnimatorSet.Builder = + this.play(ValueAnimator.ofFloat(0f, 1f).apply(block)) + + fun AnimatorSet.Builder.with(block: ValueAnimator.() -> Unit): AnimatorSet.Builder = + this.with(ValueAnimator.ofFloat(0f, 1f).apply(block)) + + fun AnimatorSet.Builder.before(block: ValueAnimator.() -> Unit): AnimatorSet.Builder = + this.before(ValueAnimator.ofFloat(0f, 1f).apply(block)) + + fun AnimatorSet.Builder.after(block: ValueAnimator.() -> Unit): AnimatorSet.Builder = + this.after(ValueAnimator.ofFloat(0f, 1f).apply(block)) + + fun ValueAnimator.update(block: (Float) -> Unit) { + update(this@ZdogDrawable, block) + } + + fun Anchor.translateTo( + x: Float = translate.x, y: Float = translate.y, z: Float = translate.z, + block: (ValueAnimator.() -> Unit)? = null + ) = + translateTo(this@ZdogDrawable, x, y, z) { + val _x = translate.x + val _y = translate.y + val _z = translate.z + onReset { + translate(_x, _y, _z) + } + block?.invoke(this) + } + + fun Anchor.translateBy( + x: Float = 0f, y: Float = 0f, z: Float = 0f, + block: (ValueAnimator.() -> Unit)? = null + ) = + translateBy(this@ZdogDrawable, x, y, z) { + val _x = translate.x + val _y = translate.y + val _z = translate.z + onReset { + translate(_x, _y, _z) + } + block?.invoke(this) + } + + fun Anchor.translateBy(delta: Vector, block: (ValueAnimator.() -> Unit)? = null) = + translateBy(this@ZdogDrawable, delta) { + val _x = translate.x + val _y = translate.y + val _z = translate.z + onReset { + translate(_x, _y, _z) + } + block?.invoke(this) + } + + fun Anchor.rotateTo( + x: Float = rotate.x, y: Float = rotate.y, z: Float = rotate.z, + block: (ValueAnimator.() -> Unit)? = null + ) = + rotateTo(this@ZdogDrawable, x, y, z) { + val _x = rotate.x + val _y = rotate.y + val _z = rotate.z + onReset { + rotate(_x, _y, _z) + } + block?.invoke(this) + } + + fun Anchor.rotateBy( + x: Float = 0f, y: Float = 0f, z: Float = 0f, + block: (ValueAnimator.() -> Unit)? = null + ) = + rotateBy(this@ZdogDrawable, x, y, z) { + val _x = rotate.x + val _y = rotate.y + val _z = rotate.z + onReset { + rotate(_x, _y, _z) + } + block?.invoke(this) + } + + fun Anchor.rotateBy(delta: Vector, block: (ValueAnimator.() -> Unit)? = null) = + rotateBy(this@ZdogDrawable, delta) { + val _x = rotate.x + val _y = rotate.y + val _z = rotate.z + onReset { + rotate(_x, _y, _z) + } + block?.invoke(this) + } + + fun Anchor.scaleTo(dest: Float, block: (ValueAnimator.() -> Unit)? = null) = + scaleTo(this@ZdogDrawable, dest) { + val _x = scale.x + val _y = scale.y + val _z = scale.z + onReset { + scale { x = _x;y = _y;z = _z } + } + block?.invoke(this) + } + + fun Anchor.alphaTo(dest: Float, block: (ValueAnimator.() -> Unit)? = null) = + alphaTo(this@ZdogDrawable, dest) { + val _alpha = alpha + onReset { + alpha = _alpha + } + block?.invoke(this) + } + + fun Anchor.colorTo(dest: Colour, block: (ValueAnimator.() -> Unit)? = null) = + colorTo(this@ZdogDrawable, dest) { + val _color = color.get() + onReset { + color.set(_color) + } + block?.invoke(this) + } +} \ No newline at end of file