📌  相关文章
📜  android drawable中的颜色按钮不会改变 (1)

📅  最后修改于: 2023-12-03 15:29:20.546000             🧑  作者: Mango

Android Drawable中的颜色按钮不会改变
问题描述

在Android开发中,我们经常使用Drawable来实现各种UI效果。然而,有时候我们可能会遇到这样的问题:当我们为某一按钮设置了颜色的Drawable时,点击该按钮后无法实现颜色的改变。

问题原因

这个问题的原因是由于Drawable本身的特性所造成的。Drawable是一种可以用来绘制某些可见元素的对象,包括图像、形状、颜色等。在Android中,Drawable经常被用来实现多态效果,使得UI在不同状态下呈现不同的外观。但是,如果我们只是为某一个Drawable设置了颜色,那么只会在该Drawable第一次被绘制时生效,之后再进行点击等操作也不会触发该Drawable的重新绘制。

解决方案

有两种解决方案可以解决这个问题。

方案一:使用StateListDrawable

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的颜色。