我的应用程序中有不同位置的按钮。我想根据它们的位置给它们上色。(Fragment1中的蓝色按钮,Fragment2中的红色按钮)
我已经尝试过ColorFilter,但这不适用于API< 21.我知道可以为此创建xml,但我不想为我的应用程序中的每个部分创建一个。是否有可能以某种方式创建Backgroud Drawables,它具有我指定的颜色并具有Button动画? (API< 21的纹波和选择器)
答案 0 :(得分:0)
我找到了解决方案:
**
* Sets the color of a button.
* @param button The Button which should be colored.
* @param color The color as a already retrieved value.
*/
public static void setButtonColor(Button button, int color) {
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
//calculate darker color
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] *= 0.8f;
int darkColor = Color.HSVToColor(hsv);
StateListDrawable listDrawable = new StateListDrawable();
GradientDrawable standard = new GradientDrawable();
GradientDrawable pressed = new GradientDrawable();
standard.setColor(color);
standard.setCornerRadius(3);
pressed.setColor(darkColor);
pressed.setCornerRadius(3);
listDrawable.addState(new int[]{android.R.attr.state_pressed}, pressed);
listDrawable.addState(new int[]{android.R.attr.state_focused}, pressed);
listDrawable.addState(StateSet.WILD_CARD, standard);
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
//noinspection deprecation
button.setBackgroundDrawable(listDrawable);
} else {
button.setBackground(listDrawable);
}
} else {
button.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
}
}
我不知道这是否是最佳选择,但它确实有效。