📅  最后修改于: 2023-12-03 15:29:20.546000             🧑  作者: Mango
在Android开发中,我们经常使用Drawable来实现各种UI效果。然而,有时候我们可能会遇到这样的问题:当我们为某一按钮设置了颜色的Drawable时,点击该按钮后无法实现颜色的改变。
这个问题的原因是由于Drawable本身的特性所造成的。Drawable是一种可以用来绘制某些可见元素的对象,包括图像、形状、颜色等。在Android中,Drawable经常被用来实现多态效果,使得UI在不同状态下呈现不同的外观。但是,如果我们只是为某一个Drawable设置了颜色,那么只会在该Drawable第一次被绘制时生效,之后再进行点击等操作也不会触发该Drawable的重新绘制。
有两种解决方案可以解决这个问题。
StateListDrawable是一种用来实现多态效果的Drawable,它可以根据不同的状态,来显示不同的Drawable。实现StateListDrawable的方式很简单,只需要在res/drawable目录下,新建一个xml文件,然后在文件中定义好各种状态下的Drawable即可。
例如,下面这个代码片段展示了如何使用StateListDrawable来实现在不同状态下,按钮的不同外观:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@color/button_pressed" /> <!-- pressed -->
<item android:drawable="@color/button_normal" /> <!-- default -->
</selector>
上述代码中,我们定义了两个状态,一个是pressed状态,一个是默认状态。当按钮处于pressed状态时,使用名为button_pressed的color资源作为按钮的背景色;否则,使用名为button_normal的color资源作为按钮的背景色。
另一种方案是,使用颜色过渡动画,通过动画效果来改变Drawable的颜色。实现这个方案也很简单,我们只需要在代码中动态地创建一个Drawable对象,然后设置该Drawable的背景色,并为该Drawable添加颜色过渡动画即可。
例如,下面这段代码展示了如何使用颜色过渡动画来实现在点击按钮后,改变按钮的背景颜色:
// 定义一个 Drawable
GradientDrawable button = new GradientDrawable();
button.setShape(GradientDrawable.RECTANGLE);
button.setColor(getResources().getColor(R.color.button_normal));
// 定义一个颜色过渡动画
ValueAnimator colorAnimation = ValueAnimator.ofArgb(getResources().getColor(R.color.button_normal), getResources().getColor(R.color.button_pressed));
colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
button.setColor((int) animator.getAnimatedValue());
}
});
colorAnimation.setDuration(200);
// 开始动画
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
colorAnimation.start();
}
});
上述代码中,我们首先定义了一个GradientDrawable对象,然后为该对象设置默认背景颜色。接着,我们使用ValueAnimator来定义一个颜色过渡动画,并将该动画应用于Drawable的颜色属性。最后,我们为按钮设置一个点击事件监听器,在点击时启动颜色过渡动画。
在Android开发中,遇到Drawable中颜色按钮不会改变的问题时,我们可以使用两种解决方案:一是使用StateListDrawable,根据不同的状态来显示不同的Drawable;二是使用颜色过渡动画,在点击事件中动态地改变Drawable的颜色。