作者:上海悠u7_ | 来源:互联网 | 2023-05-28 12:06
我的涟漪有以下代码:
-
现在我想让用户选择自己的颜色,所以我需要以编程方式创建波纹.
我找到了这个,我认为这是正确的方法,但我不知道如何处理这个问题.
这里将使用波纹:
我需要将背景设置为RippleDrawable
这样:
addButton.setBackground(ripple);
kdenney..
52
这就是我能够实现这一目标的方式.
请注意,这只是Api 21+,因此如果您支持较低版本,则必须回退到正常的Drawable.
public static RippleDrawable getPressedColorRippleDrawable(int normalColor, int pressedColor)
{
return new RippleDrawable(getPressedColorSelector(normalColor, pressedColor), getColorDrawableFromColor(normalColor), null);
}
public static ColorStateList getPressedColorSelector(int normalColor, int pressedColor)
{
return new ColorStateList(
new int[][]
{
new int[]{android.R.attr.state_pressed},
new int[]{android.R.attr.state_focused},
new int[]{android.R.attr.state_activated},
new int[]{}
},
new int[]
{
pressedColor,
pressedColor,
pressedColor,
normalColor
}
);
}
public static ColorDrawable getColorDrawableFromColor(int color)
{
return new ColorDrawable(color);
}
编辑:
我对此进行了更多修改,发现ColorStateList不需要像上面的解决方案那样复杂.我把它简化为下面的代码片段.(上面代码块中的其他所有内容都是相同的.我只更改了ColorStateList创建.)我将上面的块保留为原始块,以防此方法对某人不起作用.
new ColorStateList(
new int[][]
{
new int[]{}
},
new int[]
{
pressedColor
}
);
Ashok Varma..
21
public static Drawable getAdaptiveRippleDrawable(
int normalColor, int pressedColor) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return new RippleDrawable(ColorStateList.valueOf(pressedColor),
null, getRippleMask(normalColor));
} else {
return getStateListDrawable(normalColor, pressedColor);
}
}
private static Drawable getRippleMask(int color) {
float[] outerRadii = new float[8];
// 3 is radius of final ripple,
// instead of 3 you can give required final radius
Arrays.fill(outerRadii, 3);
RoundRectShape r = new RoundRectShape(outerRadii, null, null);
ShapeDrawable shapeDrawable = new ShapeDrawable(r);
shapeDrawable.getPaint().setColor(color);
return shapeDrawable;
}
public static StateListDrawable getStateListDrawable(
int normalColor, int pressedColor) {
StateListDrawable states = new StateListDrawable();
states.addState(new int[]{android.R.attr.state_pressed},
new ColorDrawable(pressedColor));
states.addState(new int[]{android.R.attr.state_focused},
new ColorDrawable(pressedColor));
states.addState(new int[]{android.R.attr.state_activated},
new ColorDrawable(pressedColor));
states.addState(new int[]{},
new ColorDrawable(normalColor));
return states;
}
您可以获取drawable并应用于任何视图view.setDrawable
.
对于Lollipop +设备,你会得到波纹,否则会改变视图的颜色.
1> kdenney..:
这就是我能够实现这一目标的方式.
请注意,这只是Api 21+,因此如果您支持较低版本,则必须回退到正常的Drawable.
public static RippleDrawable getPressedColorRippleDrawable(int normalColor, int pressedColor)
{
return new RippleDrawable(getPressedColorSelector(normalColor, pressedColor), getColorDrawableFromColor(normalColor), null);
}
public static ColorStateList getPressedColorSelector(int normalColor, int pressedColor)
{
return new ColorStateList(
new int[][]
{
new int[]{android.R.attr.state_pressed},
new int[]{android.R.attr.state_focused},
new int[]{android.R.attr.state_activated},
new int[]{}
},
new int[]
{
pressedColor,
pressedColor,
pressedColor,
normalColor
}
);
}
public static ColorDrawable getColorDrawableFromColor(int color)
{
return new ColorDrawable(color);
}
编辑:
我对此进行了更多修改,发现ColorStateList不需要像上面的解决方案那样复杂.我把它简化为下面的代码片段.(上面代码块中的其他所有内容都是相同的.我只更改了ColorStateList创建.)我将上面的块保留为原始块,以防此方法对某人不起作用.
new ColorStateList(
new int[][]
{
new int[]{}
},
new int[]
{
pressedColor
}
);
您也可以使用`ColorStateList.valueOf(rippleColor);`来完成它
非常感谢你的回答:)(不能给你一个upvote,没有足够的声誉).
2> Ashok Varma..:
public static Drawable getAdaptiveRippleDrawable(
int normalColor, int pressedColor) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return new RippleDrawable(ColorStateList.valueOf(pressedColor),
null, getRippleMask(normalColor));
} else {
return getStateListDrawable(normalColor, pressedColor);
}
}
private static Drawable getRippleMask(int color) {
float[] outerRadii = new float[8];
// 3 is radius of final ripple,
// instead of 3 you can give required final radius
Arrays.fill(outerRadii, 3);
RoundRectShape r = new RoundRectShape(outerRadii, null, null);
ShapeDrawable shapeDrawable = new ShapeDrawable(r);
shapeDrawable.getPaint().setColor(color);
return shapeDrawable;
}
public static StateListDrawable getStateListDrawable(
int normalColor, int pressedColor) {
StateListDrawable states = new StateListDrawable();
states.addState(new int[]{android.R.attr.state_pressed},
new ColorDrawable(pressedColor));
states.addState(new int[]{android.R.attr.state_focused},
new ColorDrawable(pressedColor));
states.addState(new int[]{android.R.attr.state_activated},
new ColorDrawable(pressedColor));
states.addState(new int[]{},
new ColorDrawable(normalColor));
return states;
}
您可以获取drawable并应用于任何视图view.setDrawable
.
对于Lollipop +设备,你会得到波纹,否则会改变视图的颜色.