Android Studio开发答题APP:按钮闪烁及圆角恢复效果求助
嘿,我刚好做过类似的答题APP按钮闪烁功能!你要的正确闪绿、错误闪红,还要保留原圆角的需求,这两个方法绝对能解决:
方法一:使用ValueAnimator实现平滑颜色过渡(推荐)
这种方法能实现从按钮原本颜色到目标色的平滑闪烁,而且完全不会破坏按钮原有的圆角样式——因为只是修改背景色,不会替换整个背景Drawable。
先写个通用的工具方法,直接复用:
fun Button.flashColor(targetColor: Int, flashDuration: Long = 600) { // 先保存按钮原来的背景色 val originalColor = (background as ColorDrawable).color // 创建颜色过渡动画:原颜色 → 目标色 → 原颜色 val colorAnimator = ValueAnimator.ofArgb(originalColor, targetColor, originalColor) colorAnimator.duration = flashDuration colorAnimator.addUpdateListener { animation -> val currentColor = animation.animatedValue as Int setBackgroundColor(currentColor) } // 保险起见,动画结束/取消时强制恢复原颜色,避免异常情况 colorAnimator.addListener(object : Animator.AnimatorListener { override fun onAnimationStart(animation: Animator?) {} override fun onAnimationEnd(animation: Animator?) { setBackgroundColor(originalColor) } override fun onAnimationCancel(animation: Animator?) { setBackgroundColor(originalColor) } override fun onAnimationRepeat(animation: Animator?) {} }) colorAnimator.start() }
之后在你的答题逻辑里直接调用就行:
// 答案正确时,让choice1按钮闪绿色 choice1.flashColor(ContextCompat.getColor(this, R.color.correct_green)) // 答案错误时,闪红色 choice1.flashColor(ContextCompat.getColor(this, R.color.wrong_red))
注意:如果你的按钮背景是带圆角的Shape Drawable,这个方法依然生效——setBackgroundColor()会在Shape的上层叠加颜色,完全不影响圆角样式。
方法二:使用帧动画实现"闪烁跳变"效果
如果你想要的是那种突然切换颜色的闪烁(不是平滑过渡),可以用帧动画:
先在
res/drawable下创建两个帧动画文件:- 正确闪烁的
anim_flash_green.xml:<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <!-- 这里的your_original_btn_bg是你按钮原本带圆角的背景 --> <item android:drawable="@drawable/your_original_btn_bg" android:duration="200"/> <item android:drawable="@drawable/btn_bg_green" android:duration="200"/> <item android:drawable="@drawable/your_original_btn_bg" android:duration="200"/> <item android:drawable="@drawable/btn_bg_green" android:duration="200"/> <item android:drawable="@drawable/your_original_btn_bg" android:duration="200"/> </animation-list> - 错误闪烁的
anim_flash_red.xml同理,把绿色Drawable换成红色版本即可。
要点:
btn_bg_green和btn_bg_red要和原按钮背景的圆角参数完全一致,这样闪烁时不会有样式突变。- 正确闪烁的
然后写调用逻辑:
fun Button.flashWithFrameAnimation(animResId: Int) { val originalBackground = background val flashDrawable = ContextCompat.getDrawable(context, animResId) as AnimationDrawable background = flashDrawable flashDrawable.start() // 动画结束后恢复原背景 Handler(Looper.getMainLooper()).postDelayed({ background = originalBackground }, flashDrawable.totalDuration.toLong()) }
使用时直接传对应的动画资源:
// 正确时调用 choice1.flashWithFrameAnimation(R.drawable.anim_flash_green) // 错误时调用 choice1.flashWithFrameAnimation(R.drawable.anim_flash_red)
内容的提问来源于stack exchange,提问作者Ingor Sievaz
相关产品推荐
相关产品推荐

