ImageButton Icon Tint基于State

时间:2018-01-29 16:29:16

标签: android

我目前正在尝试使用当前纯白色Drawable实现一些ImageButtons的着色。 Tint Color应由StateList提供,并应根据按钮的当前状态而改变。状态列表看起来像:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#FF0000"/>
    <item android:color="#00FF00" android:state_enabled="false"/>
    <item android:color="#0000FF" android:state_pressed="true" android:state_enabled="true"/>
</selector>

按钮的布局XML代码段为:

<ImageButton
    android:id="@+id/btnNext"
    style="@style/Widget.AppCompat.Button.Borderless"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="@dimen/vertical_content_padding"
    android:layout_marginEnd="@dimen/horizontal_content_padding"
    android:contentDescription="@string/next"
    android:src="@drawable/ic_chevron_right_white_24dp"
    android:tint="@color/state_btn_tint_light"/>

选择并正确显示“颜色状态列表”中的默认色调。但禁用按钮或按下按钮不会触发所有图标的任何颜色变化。我尝试用setImageTintList实用地设置它。

2 个答案:

答案 0 :(得分:0)

我要简化我的回答。希望它有所帮助。 你总是可以在colors.xml中输入你想要的任何颜色吗?所以让我们使用它。

你可以创建一个你想要的颜色的整数数组列表

integer[] colors = new integer[]{R.color.white, R.color.black, ...};

现在imageButtons可以采用这样的背景色调,例如:

imagebutton.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext,R.color.white)));
  1. 现在让我们将它们与动画放在一起,创建动画方法:
  2. &#13;
    &#13;
    public ValueAnimator ColorAnimation(ImageButton imagebutton, int colorFrom, int colorTo){
            ValueAnimator anim = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
            anim .addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    imagebutton.setImageTintList(ColorStateList.valueOf((int) animation.getAnimatedValue()));
                }
            });
            anim.setInterpolator(new DecelerateInterpolator());
            anim.setDuration(300); // -- Whatever time
            return anim;
        };
    &#13;
    &#13;
    &#13;

    1. 现在,在您的活动中,您可以像这样实现它:
    2. &#13;
      &#13;
      @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.layout);
              mContext = this;
              ...
      
              ImageButton myButton = (ImageButton) findViewById(R.id.imagebutton);
      
              //-- Define All the Colors You want
              integer[] listOfColors = new integer[]{R.color.white, R.color.black, R.color.yellow, R.color.red, R.color.blue};
      
              //-- With this you can randomly get a color from the list
              int aColor = (int)(Math.random()*listOfColors.length); 
      
              //-- Your Default imageButton Color
              int DefaultColor = ContextCompat.getColor(mContext,R.color.white);
      
              myButton.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      ColorAnimation(myButton, DefaultColor, listOfColors[aColor]).start;
                      //-- You can even enter whatever color want directly for "colorTo"
                      //-- You can Reverse this animation as well
                  }
              });
      
              ...
      &#13;
      &#13;
      &#13;

答案 1 :(得分:0)

您的代码应该可以使用。但是,有一个错误:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#FF0000"/>
    <item android:color="#00FF00" android:state_enabled="false"/>
    <item android:color="#0000FF" android:state_pressed="true" android:state_enabled="true"/>
</selector>

您需要颠倒状态的顺序。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#0000FF" android:state_pressed="true" android:state_enabled="true"/>
    <item android:color="#00FF00" android:state_enabled="false"/>
    <item android:color="#FF0000"/>
</selector>

我不完全确定它在内部如何工作,但它的功能似乎类似于If / Else语句。如果第一个条件失败,则转到第二个条件。由于您的第一个项目没有条件,因此将始终将其选中,而其他项目将被忽略,从而给人的印象是颜色状态列表根本无法使用。因此,请始终将限制条件最严格的颜色状态放在首位。