แตะแอนิเมชั่นคำติชม เช่น Spotify ใน Jetpack เขียน
May 04 2023
สร้างเอฟเฟ็กต์การคลิกที่เด้งใน Jetpack Compose
การแสดงคำติชมการคลิกของผู้ใช้เป็นสิ่งสำคัญ bla bla bal เรื่องยาวสั้น ฉันชอบเอฟเฟกต์การคลิกแบบเด้งของ Spotify มากกว่าเอฟเฟกต์ Ripple ที่เป็นค่าเริ่มต้น งั้นมาเริ่มกันเลย ระหว่างทาง เราจะสำรวจตัวปรับแต่งและแอนิเมชันด้วย... สร้างตัวดัดแปลงที่ใช้ซ้ำได้ (คล้ายกับตัวปรับแต่งแบบคลิกได้) ที่ลดขนาดและความทึบเมื่อกดองค์ประกอบ UI ฉันจะใส่โค้ดทั้งหมดแล้วอธิบาย… แค่นั้นแหละ ใช้เลย แค่นั้นแหละ ฉันหวังว่า คุณรักบล็อก ❤️

การแสดงคำติชมการคลิกของผู้ใช้เป็นสิ่งสำคัญ bla bla bal เรื่องยาวสั้น ฉันชอบเอฟเฟกต์การคลิกแบบเด้งของ Spotify มากกว่าเอฟเฟกต์ Ripple เริ่มต้น มาทำกันเถอะ
ระหว่างทาง เราจะสำรวจตัวปรับแต่งและแอนิเมชันด้วย...

ในการทำเช่นนั้น เราจะสร้างตัวแก้ไขที่ใช้ซ้ำได้Modifier
(คล้ายกับตัวปรับแต่งแบบคลิกได้) ที่ลดขนาดและความทึบเมื่อกดองค์ประกอบ UI
ฉันจะไปข้างหน้าและใส่รหัสทั้งหมดแล้วอธิบาย ...
/**
* Adds a bouncing click effect to a Composable.
*
* @param enabled whether the UI element should be enabled and clickable
* @param onClick the action to perform when the UI element is clicked
*/
fun Modifier.bouncingClickable(
enabled: Boolean = true,
onClick: () -> Unit
) = composed {
val interactionSource = remember { MutableInteractionSource() }
val isPressed by interactionSource.collectIsPressedAsState()
val animationTransition = updateTransition(isPressed, label = "BouncingClickableTransition")
val scaleFactor by animationTransition.animateFloat(
targetValueByState = { pressed -> if (pressed) 0.94f else 1f },
label = "BouncingClickableScaleFactorTransition",
)
val opacity by animationTransition.animateFloat(
targetValueByState = { pressed -> if (pressed) 0.7f else 1f },
label = "BouncingClickableOpacityTransition"
)
this
.graphicsLayer {
this.scaleX = scaleFactor
this.scaleY = scaleFactor
this.alpha = opacity
}
.clickable(
interactionSource = interactionSource,
indication = null,
enabled = enabled,
onClick = onClick
)
}
- เนื่องจากเรามีแอนิเมชั่นหลายตัวที่เราต้องการเรียกใช้เมื่อ เราจึง
isPressed == true
ใช้updateTransition()
ฟังก์ชันส่วนขยายเพื่อเรียกใช้แอนิเมชั่นหลายตัว - ในการสร้างแอนิเมชั่น เราใช้
animateFloat()
ส่วนขยายเพื่อสร้างแอนิเมชั่นสองแอนิเมชั่น อันหนึ่งสำหรับscaleFactor
และอีกอันสำหรับopacity
ที่เราจะใช้เพื่อทำให้องค์ประกอบ UI ของเราเคลื่อนไหว - ในการเปลี่ยนสเกล & อัลฟ่า เราใช้
graphicsLayer
Modifier ซึ่งโดยปกติจะใช้เพื่อใช้การแปลงร่างและแอนิเมชั่นกับองค์ประกอบ UI ( อ่านบทความดีๆ นี้เพื่อเรียนรู้เพิ่มเติม ) - สุดท้าย เราเพิ่มตัวแก้ไขที่คลิกได้เพื่อจัดการการคลิกและลบเอฟเฟกต์ระลอกเริ่มต้นโดยตั้งค่า
indication
พารามิเตอร์เป็นnull
เท่านี้ก็นำไปใช้ได้เลย
Box(
modifier = Modifier
.bouncingClickable {
println("Clicked...")
}
.size(100.dp)
.clip(CircleShape)
.background(Color.Black)
) {}
val scaleFactor by animationTransition.animateFloat(
targetValueByState = { pressed -> if (pressed) 0.94f else 1f },
label = "BouncingClickableScaleFactorTransition",
transitionSpec = {
spring(
dampingRatio = Spring.DampingRatioMediumBouncy,
stiffness = Spring.StiffnessLow
)
}
)
ฉันหวังว่าคุณจะชอบบล็อกนี้ ❤️