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 186f02b

Browse files
tune params
1 parent 479ba63 commit 186f02b

File tree

1 file changed

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

1 file changed

+69
-29
lines changed

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

Lines changed: 69 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import androidx.compose.ui.graphics.ImageBitmap
4444
import androidx.compose.ui.graphics.asAndroidBitmap
4545
import androidx.compose.ui.graphics.asImageBitmap
4646
import androidx.compose.ui.graphics.drawscope.DrawScope
47+
import androidx.compose.ui.graphics.drawscope.Stroke
4748
import androidx.compose.ui.graphics.drawscope.clipRect
4849
import androidx.compose.ui.graphics.nativeCanvas
4950
import androidx.compose.ui.graphics.rememberGraphicsLayer
@@ -56,9 +57,10 @@ import androidx.compose.ui.unit.Velocity
5657
import androidx.compose.ui.unit.dp
5758
import androidx.compose.ui.unit.sp
5859
import com.smarttoolfactory.tutorial1_1basics.R
60+
import com.smarttoolfactory.tutorial1_1basics.chapter3_layout.chat.MessageStatus
61+
import com.smarttoolfactory.tutorial1_1basics.chapter3_layout.chat.SentMessageRowAlt
5962
import com.smarttoolfactory.tutorial1_1basics.chapter6_graphics.randomInRange
6063
import com.smarttoolfactory.tutorial1_1basics.chapter6_graphics.scale
61-
import com.smarttoolfactory.tutorial1_1basics.ui.BlueGrey400
6264
import com.smarttoolfactory.tutorial1_1basics.ui.Pink400
6365
import kotlinx.coroutines.CancellationException
6466
import kotlin.math.roundToInt
@@ -96,6 +98,12 @@ fun SingleParticleTrajectorySample() {
9698

9799
LaunchedEffect(trajectoryProgressStart, trajectoryProgressEnd) {
98100
particleState.particleList.clear()
101+
102+
val velocity = Velocity(
103+
x = sizePxHalf,
104+
y = sizePxHalf * 4
105+
)
106+
99107
particleState.addParticle(
100108
Particle(
101109
color = Pink400,
@@ -105,10 +113,8 @@ fun SingleParticleTrajectorySample() {
105113
),
106114
initialSize = Size(particleSize, particleSize),
107115
endSize = Size(sizePx, sizePx),
108-
velocity = Velocity(
109-
x = sizePxHalf,
110-
y = sizePxHalf * 4
111-
),
116+
velocity = velocity,
117+
acceleration = -2 * velocity.y,
112118
trajectoryProgressRange = trajectoryProgressStart..trajectoryProgressEnd
113119
)
114120
)
@@ -213,25 +219,48 @@ fun ParticleAnimationSample() {
213219
}
214220

215221
val particleState = rememberParticleState()
222+
val particleState2 = rememberParticleState()
216223

217224
val context = LocalContext.current
218225

219226
var progress by remember {
220227
mutableFloatStateOf(0f)
221228
}
229+
230+
231+
SentMessageRowAlt(
232+
modifier = Modifier.disintegrate(
233+
// progress = progress,
234+
particleState = particleState,
235+
onStart = {
236+
Toast.makeText(context, "Animation started...", Toast.LENGTH_SHORT).show()
237+
},
238+
onEnd = {
239+
particleState.animationStatus = AnimationStatus.Idle
240+
Toast.makeText(context, "Animation ended...", Toast.LENGTH_SHORT).show()
241+
}
242+
),
243+
quotedImage = R.drawable.avatar_4_raster,
244+
text = "Some long message",
245+
messageTime = "11.02.2024",
246+
messageStatus = MessageStatus.READ
247+
)
248+
249+
Spacer(Modifier.height(16.dp))
250+
222251
Image(
223252
painter = painterResource(R.drawable.avatar_2_raster),
224253
modifier = Modifier
225254
.border(2.dp, Color.Red)
226255
.size(widthDp)
227256
.disintegrate(
228-
progress = progress,
229-
particleState = particleState,
257+
// progress = progress,
258+
particleState = particleState2,
230259
onStart = {
231260
Toast.makeText(context, "Animation started...", Toast.LENGTH_SHORT).show()
232261
},
233262
onEnd = {
234-
// particleState.animationStatus = AnimationStatus.Idle
263+
particleState2.animationStatus = AnimationStatus.Idle
235264
Toast.makeText(context, "Animation ended...", Toast.LENGTH_SHORT).show()
236265
}
237266
),
@@ -250,6 +279,7 @@ fun ParticleAnimationSample() {
250279
modifier = Modifier.fillMaxWidth(),
251280
onClick = {
252281
particleState.startAnimation()
282+
particleState2.startAnimation()
253283
}
254284
) {
255285
Text("Convert graphicsLayer to particles")
@@ -264,7 +294,7 @@ data class Particle(
264294
val trajectoryProgressRange: ClosedRange<Float> = 0f..1f,
265295
var color: Color,
266296
var velocity: Velocity = Velocity(0f, 0f),
267-
var acceleration: Float = -2 * velocity.y
297+
var acceleration: Float = 0f
268298
) {
269299
var currentPosition: Offset = initialCenter
270300
internal set
@@ -352,7 +382,7 @@ fun Modifier.disintegrate(
352382
}
353383

354384
@Composable
355-
fun rememberParticleState(particleSize: Dp = 2.dp): ParticleState {
385+
fun rememberParticleState(particleSize: Dp = 1.dp): ParticleState {
356386
return remember {
357387
ParticleState(particleSize)
358388
}
@@ -393,9 +423,7 @@ class ParticleState internal constructor(particleSize: Dp) {
393423
if (animationStatus != AnimationStatus.Idle) {
394424

395425
drawWithLayer {
396-
397426
particleList.forEach { particle ->
398-
399427
updateParticle(progress, particle)
400428

401429
val color = particle.color
@@ -423,12 +451,12 @@ class ParticleState internal constructor(particleSize: Dp) {
423451
}
424452

425453
// For debugging
426-
// drawRect(
427-
// color = Color.Black,
428-
// topLeft = Offset(progress * size.width, 0f),
429-
// size = Size(size.width - progress * size.width, size.height),
430-
// style = Stroke(4.dp.toPx())
431-
// )
454+
drawRect(
455+
color = Color.Black,
456+
topLeft = Offset(progress * size.width, 0f),
457+
size = Size(size.width - progress * size.width, size.height),
458+
style = Stroke(4.dp.toPx())
459+
)
432460
}
433461
}
434462
}
@@ -452,7 +480,6 @@ class ParticleState internal constructor(particleSize: Dp) {
452480
for (column in 0 until width step particleSize) {
453481
for (row in 0 until height step particleSize) {
454482

455-
456483
// Get pixel at center of this pixel rectangle
457484
// If last pixel is out of image get it from end of the width or height
458485
// 🔥x must be < bitmap.width() and y must be < bitmap.height()
@@ -464,11 +491,8 @@ class ParticleState internal constructor(particleSize: Dp) {
464491
val color = Color(pixel)
465492

466493
if (color != Color.Unspecified) {
494+
// Set center
467495
val initialCenter = Offset(pixelCenterX.toFloat(), pixelCenterY.toFloat())
468-
val horizontalDisplacement = randomInRange(-50f, 50f)
469-
470-
val verticalDisplacement = randomInRange(-height * .1f, height * .2f)
471-
val acceleration = randomInRange(-2f, 2f)
472496

473497
// If this particle is at 20% of image width in x plane
474498
// it returns 0.2f
@@ -494,18 +518,34 @@ class ParticleState internal constructor(particleSize: Dp) {
494518
trajectoryProgressRange =
495519
trajectoryProgressRange.start + startYOffset..trajectoryProgressRange.endInclusive
496520

521+
val imageMinDimension = width.coerceAtMost(height) * 1f
522+
523+
val velocityX = randomInRange(
524+
// Particles close to end should have less randomization to start of image
525+
-(particleSize * 30f * (1 - fractionToImageWidth * .7f))
526+
.coerceAtMost(imageMinDimension),
527+
(particleSize * 30f).coerceAtMost(imageMinDimension)
528+
)
529+
val velocityY = randomInRange(
530+
-(particleSize * 20f).coerceAtMost(imageMinDimension),
531+
(particleSize * 30f).coerceAtMost(imageMinDimension)
532+
)
533+
val acceleration = randomInRange(-1f, 1f)
534+
535+
// Set initial and final sizes
536+
val initialSize = Size(particleSize.toFloat(), particleSize.toFloat())
497537
val endSize = randomInRange(0f, particleSize.toFloat() * .5f)
498538

499539
particleList.add(
500540
Particle(
501541
initialCenter = initialCenter,
502-
initialSize = Size(particleSize.toFloat(), particleSize.toFloat()),
503-
trajectoryProgressRange = trajectoryProgressRange,
542+
initialSize = initialSize,
504543
endSize = Size(endSize, endSize),
544+
trajectoryProgressRange = trajectoryProgressRange,
505545
color = color,
506546
velocity = Velocity(
507-
x = horizontalDisplacement,
508-
y = verticalDisplacement
547+
x = velocityX,
548+
y = velocityY
509549
),
510550
acceleration = acceleration
511551
)
@@ -544,8 +584,8 @@ class ParticleState internal constructor(particleSize: Dp) {
544584
// While trajectory progress is less than 80% have full alpha then slowly
545585
// reduce to zero for particles to disappear
546586
alpha = if (trajectoryProgress == 0f) 1f
547-
else if (trajectoryProgress < .8f) 1f
548-
else scale(.8f, 1f, trajectoryProgress, 1f, 0f)
587+
else if (trajectoryProgress < .5f) 1f
588+
else scale(.5f, 1f, trajectoryProgress, 1f, 0f)
549589

550590
val horizontalDisplacement = velocity.x * trajectoryProgress
551591
val verticalDisplacement =

0 commit comments

Comments
(0)

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