Android按钮背景色动画时如何保持圆角半径?
解决按钮背景色动画时圆角丢失的问题
问题原因
直接通过objectAnimator动画backgroundColor属性时,系统会将原本的GradientDrawable(你的圆角背景)替换为ColorDrawable,而ColorDrawable不具备圆角属性,导致圆角丢失。
解决方案:动画Drawable内部的颜色属性
不要直接替换整个背景,而是修改原有圆角Drawable的颜色,同时保留缩放动画。以下是具体实现:
Java代码实现
public void anim() { // 获取按钮的圆角背景(确保背景是GradientDrawable,对应你的shape drawable) GradientDrawable bgDrawable = (GradientDrawable) btn.getBackground(); // 背景色动画:修改GradientDrawable的color属性 ValueAnimator colorAnim = ValueAnimator.ofObject( new ArgbEvaluator(), ContextCompat.getColor(context, R.color.bgBtnConnect), ContextCompat.getColor(context, R.color.bgBtnConnecting) ); colorAnim.setDuration(600); colorAnim.setInterpolator(new DecelerateInterpolator()); colorAnim.addUpdateListener(animator -> { bgDrawable.setColor((int) animator.getAnimatedValue()); }); // 缩放动画 ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(btn, "scaleX", 1f, 0.8f); ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(btn, "scaleY", 1f, 0.8f); scaleXAnim.setDuration(600); scaleYAnim.setDuration(600); scaleXAnim.setInterpolator(new DecelerateInterpolator()); scaleYAnim.setInterpolator(new DecelerateInterpolator()); // 组合并启动动画 AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(colorAnim, scaleXAnim, scaleYAnim); animatorSet.start(); }
关键说明
- 直接操作原有
GradientDrawable的setColor方法,仅修改颜色,不会替换整个背景,因此圆角属性得以保留。 - 使用
ValueAnimator配合ArgbEvaluator实现平滑的颜色过渡,这比直接动画backgroundColor更可控。 - 缩放动画保持原有逻辑,与颜色动画并行执行。
备选方案:使用AnimatedStateListDrawable(适合状态切换场景)
如果你的动画是伴随按钮状态变化(如按下、加载),可以用AnimatedStateListDrawable定义不同状态下的圆角背景和颜色过渡,示例如下:
<!-- res/drawable/animated_btn_bg.xml --> <animated-selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 初始状态 --> <item android:id="@+id/state_normal" android:drawable="@drawable/button" android:state_enabled="true"/> <!-- 加载状态 --> <item android:id="@+id/state_connecting" android:drawable="@drawable/button_connecting" android:state_enabled="false"/> <!-- 状态过渡动画 --> <transition android:fromId="@+id/state_normal" android:toId="@+id/state_connecting" android:drawable="@drawable/btn_color_transition"/> </animated-selector> <!-- res/drawable/btn_color_transition.xml --> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@color/bgBtnConnect"/> <corners android:radius="40dp"/> <transition android:drawable="@drawable/button_connecting"/> </shape>
然后在代码中切换按钮状态即可触发动画,这种方式也能保留圆角。
内容的提问来源于stack exchange,提问作者André Hart
相关产品推荐
相关产品推荐

