我目前正在尝试使用当前纯白色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实用地设置它。
答案 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)));
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;
@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;
答案 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语句。如果第一个条件失败,则转到第二个条件。由于您的第一个项目没有条件,因此将始终将其选中,而其他项目将被忽略,从而给人的印象是颜色状态列表根本无法使用。因此,请始终将限制条件最严格的颜色状态放在首位。