Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3d29496

Browse files
apply boundaries to particles
1 parent 83b3221 commit 3d29496

File tree

1 file changed

+86
-33
lines changed
  • Tutorial1-1Basics/src/main/java/com/smarttoolfactory/tutorial1_1basics/chapter9_animation

1 file changed

+86
-33
lines changed

‎Tutorial1-1Basics/src/main/java/com/smarttoolfactory/tutorial1_1basics/chapter9_animation/ParticleAnimations.kt

Lines changed: 86 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -386,15 +386,17 @@ fun rememberParticleState(
386386
durationMillis = 2000,
387387
easing = FastOutLinearInEasing
388388
),
389-
strategy: ParticleStrategy = DisintegrateStrategy()
389+
strategy: ParticleStrategy = DisintegrateStrategy(),
390+
particleBoundaries: ParticleBoundaries? = null
390391
): ParticleState {
391392
return remember(
392-
// particleSize, strategy, animationSpec
393+
// particleSize, strategy, animationSpec, particleBoundaries
393394
) {
394395
ParticleState(
395396
particleSize = particleSize,
396397
animationSpec = animationSpec,
397-
strategy = strategy
398+
strategy = strategy,
399+
particleBoundaries = particleBoundaries
398400
)
399401
}
400402
}
@@ -404,6 +406,7 @@ class ParticleState internal constructor(
404406
val particleSize: Dp,
405407
val animationSpec: AnimationSpec<Float>,
406408
val strategy: ParticleStrategy,
409+
val particleBoundaries: ParticleBoundaries?,
407410
) {
408411
val animatable = Animatable(0f)
409412
val particleList = mutableStateListOf<Particle>()
@@ -431,21 +434,34 @@ class ParticleState internal constructor(
431434
) {
432435
if (animationStatus != AnimationStatus.Idle) {
433436
bitmap?.let {
434-
strategy.updateAndDrawParticles(drawScope, particleList, bitmap, progress)
437+
strategy.updateAndDrawParticles(
438+
drawScope = drawScope,
439+
particleList = particleList, imageBitmap = bitmap,
440+
progress = progress,
441+
particleBoundaries = particleBoundaries
442+
)
435443
}
436444
}
437445
}
438446

439447
fun createParticles(
440448
particleList: SnapshotStateList<Particle>,
441449
particleSize: Int,
442-
bitmap: Bitmap
450+
bitmap: Bitmap,
443451
) {
444-
strategy.createParticles(particleList, particleSize, bitmap)
452+
strategy.createParticles(
453+
particleList = particleList,
454+
particleSize = particleSize,
455+
bitmap = bitmap,
456+
particleBoundaries = particleBoundaries
457+
)
445458
}
446459

447460
fun updateParticle(progress: Float, particle: Particle) {
448-
strategy.updateParticle(progress, particle)
461+
strategy.updateParticle(
462+
progress = progress,
463+
particle = particle
464+
)
449465
}
450466

451467
fun startAnimation() {
@@ -485,7 +501,8 @@ open class DisintegrateStrategy : ParticleStrategy {
485501
override fun createParticles(
486502
particleList: SnapshotStateList<Particle>,
487503
particleSize: Int,
488-
bitmap: Bitmap
504+
bitmap: Bitmap,
505+
particleBoundaries: ParticleBoundaries?
489506
) {
490507

491508
particleList.clear()
@@ -542,24 +559,56 @@ open class DisintegrateStrategy : ParticleStrategy {
542559

543560
val imageMinDimension = width.coerceAtMost(height) * 1f
544561

562+
val velocityHorizontalMin =
563+
particleBoundaries?.velocityLowerBound?.x ?: (particleSize * 20f)
564+
val velocityHorizontalMax =
565+
particleBoundaries?.velocityUpperBound?.x ?: (particleSize * 20f)
566+
567+
val velocityVerticalMin =
568+
particleBoundaries?.velocityLowerBound?.y ?: (particleSize * 30f)
569+
val velocityVerticalMax =
570+
particleBoundaries?.velocityUpperBound?.y ?: (particleSize * 30f)
571+
545572
val velocityX = randomInRange(
546573
// Particles close to end should have less randomization to start of image
547-
-(particleSize *20f * (1 - fractionToImageWidth))
574+
-(velocityHorizontalMin * (1 - fractionToImageWidth))
548575
.coerceAtMost(imageMinDimension),
549-
(particleSize *20f).coerceAtMost(imageMinDimension)
576+
(velocityHorizontalMax).coerceAtMost(imageMinDimension)
550577
)
551578
val velocityY = randomInRange(
552-
-(particleSize *30f).coerceAtMost(imageMinDimension),
553-
(particleSize *30f).coerceAtMost(imageMinDimension)
579+
-(velocityVerticalMin).coerceAtMost(imageMinDimension),
580+
(velocityVerticalMax).coerceAtMost(imageMinDimension)
554581
)
555582

556-
val acceleration =
557-
Acceleration(0f, randomInRange(-velocityY * .1f, -velocityY * .2f))
583+
val accelerationHorizontalMin =
584+
particleBoundaries?.accelerationLowerBound?.x ?: 0f
585+
val accelerationHorizontalMax =
586+
particleBoundaries?.accelerationLowerBound?.x ?: 0f
587+
588+
val accelerationVerticalMin =
589+
particleBoundaries?.accelerationLowerBound?.y ?: (-velocityY * .1f)
590+
val accelerationVerticalMax =
591+
particleBoundaries?.accelerationLowerBound?.y ?: (-velocityY * .2f)
558592

593+
val acceleration = Acceleration(
594+
randomInRange(accelerationHorizontalMin, accelerationHorizontalMax),
595+
randomInRange(accelerationVerticalMin, accelerationVerticalMax)
596+
)
597+
598+
// TODO Add boundaries for size
559599
// Set initial and final sizes
560600
val initialSize = Size(particleSize.toFloat(), particleSize.toFloat())
561601
val endSize = randomInRange(.4f, particleSize.toFloat() * .7f)
562602

603+
// Set alpha
604+
val alphaStartMin = (particleBoundaries?.alphaLowerBound?.start) ?: 1f
605+
val alphaStartMax = (particleBoundaries?.alphaLowerBound?.endInclusive) ?: 1f
606+
val alphaStart = randomInRange(alphaStartMin, alphaStartMax)
607+
608+
val alphaEndMin = (particleBoundaries?.alphaLowerBound?.start) ?: 0f
609+
val alphaEndMax = (particleBoundaries?.alphaLowerBound?.endInclusive) ?: 0f
610+
val alphaEnd = randomInRange(alphaEndMin, alphaEndMax)
611+
563612
particleList.add(
564613
Particle(
565614
initialCenter = initialCenter,
@@ -571,7 +620,9 @@ open class DisintegrateStrategy : ParticleStrategy {
571620
x = velocityX,
572621
y = velocityY
573622
),
574-
acceleration = acceleration
623+
acceleration = acceleration,
624+
initialAlpha = alphaStart,
625+
endAlpha = alphaEnd
575626
)
576627
)
577628

@@ -587,12 +638,16 @@ open class DisintegrateStrategy : ParticleStrategy {
587638
particleList: SnapshotStateList<Particle>,
588639
imageBitmap: ImageBitmap,
589640
progress: Float,
641+
particleBoundaries: ParticleBoundaries?
590642
) {
591643
with(drawScope) {
592644

593645
drawWithLayer {
594646
particleList.forEach { particle ->
595-
updateParticle(progress, particle)
647+
updateParticle(
648+
progress = progress,
649+
particle = particle
650+
)
596651

597652
val color = particle.color
598653
val radius = particle.currentSize.width * .5f
@@ -628,7 +683,10 @@ open class DisintegrateStrategy : ParticleStrategy {
628683
}
629684
}
630685

631-
override fun updateParticle(progress: Float, particle: Particle) {
686+
override fun updateParticle(
687+
progress: Float,
688+
particle: Particle
689+
) {
632690
particle.run {
633691
// Trajectory progress translates progress from 0f-1f to
634692
// trajectoryStart-trajectoryEnd
@@ -653,7 +711,7 @@ open class DisintegrateStrategy : ParticleStrategy {
653711
// reduce to zero for particles to disappear
654712
alpha = if (trajectoryProgress == 0f) 0f
655713
else if (trajectoryProgress < .4f) 1f
656-
else scale(.4f, 1f, trajectoryProgress, 1f, 0f)
714+
else scale(.4f, 1f, trajectoryProgress, particle.initialAlpha, particle.endAlpha)
657715

658716
// Set position
659717
val horizontalDisplacement =
@@ -687,17 +745,22 @@ interface ParticleStrategy {
687745
fun createParticles(
688746
particleList: SnapshotStateList<Particle>,
689747
particleSize: Int,
690-
bitmap: Bitmap
748+
bitmap: Bitmap,
749+
particleBoundaries: ParticleBoundaries?
691750
)
692751

693752
fun updateAndDrawParticles(
694753
drawScope: DrawScope,
695754
particleList: SnapshotStateList<Particle>,
696755
imageBitmap: ImageBitmap,
697-
progress: Float
756+
progress: Float,
757+
particleBoundaries: ParticleBoundaries?
698758
)
699759

700-
fun updateParticle(progress: Float, particle: Particle)
760+
fun updateParticle(
761+
progress: Float,
762+
particle: Particle
763+
)
701764
}
702765

703766
/**
@@ -748,6 +811,8 @@ data class Particle(
748811
val initialSize: Size,
749812
val endSize: Size,
750813
val trajectoryProgressRange: ClosedRange<Float> = 0f..1f,
814+
val initialAlpha: Float = 1f,
815+
val endAlpha: Float = 0f,
751816
var color: Color,
752817
var velocity: Velocity = Velocity(0f, 0f),
753818
var acceleration: Acceleration = Acceleration(0f, 0f)
@@ -798,16 +863,4 @@ value class Acceleration internal constructor(private val packedValue: Long) {
798863
*/
799864
@Stable
800865
val y: Float get() = unpackFloat2(packedValue)
801-
802-
/**
803-
* The horizontal component of the velocity in pixels per second.
804-
*/
805-
@Stable
806-
inline operator fun component1(): Float = x
807-
808-
/**
809-
* The vertical component of the velocity in pixels per second.
810-
*/
811-
@Stable
812-
inline operator fun component2(): Float = y
813866
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /