我不认为您可以在 XML 中做到这一点(至少在 Android 中不行) ,但是我发现了一个很好的解决方案,它发布在 给你上,看起来会有很大的帮助!
ShapeDrawable.ShaderFactory sf = new ShapeDrawable.ShaderFactory() {
@Override
public Shader resize(int width, int height) {
LinearGradient lg = new LinearGradient(0, 0, width, height,
new int[]{Color.GREEN, Color.GREEN, Color.WHITE, Color.WHITE},
new float[]{0,0.5f,.55f,1}, Shader.TileMode.REPEAT);
return lg;
}
};
PaintDrawable p=new PaintDrawable();
p.setShape(new RectShape());
p.setShaderFactory(sf);
Button theButton = (Button)findViewById(R.id.thebutton);
ShapeDrawable.ShaderFactory sf = new ShapeDrawable.ShaderFactory() {
@Override
public Shader resize(int width, int height) {
LinearGradient lg = new LinearGradient(0, 0, 0, theButton.getHeight(),
new int[] {
Color.LIGHT_GREEN,
Color.WHITE,
Color.MID_GREEN,
Color.DARK_GREEN }, //substitute the correct colors for these
new float[] {
0, 0.45f, 0.55f, 1 },
Shader.TileMode.REPEAT);
return lg;
}
};
PaintDrawable p = new PaintDrawable();
p.setShape(new RectShape());
p.setShaderFactory(sf);
theButton.setBackground((Drawable)p);
好的,基本上我已经用 XML 为水平绿色渐变创建了一个形状渐变,设置为0度角,从顶部区域的左绿色到右绿色。接下来,我做了一个半透明的灰色矩形形状。我非常确定这可以嵌入到层列表 XML 中,从而避免这个额外的文件,但我不确定如何做到这一点。但是,好吧,那么这种恶作剧的部分出现在 Layer _ list XML 文件中。我把绿色渐变作为底层,然后把半覆盖作为第二层,偏移从顶部的50分贝。显然,你会希望这个数字始终是你的视图大小的一半,虽然,而不是一个固定的50dp。但我觉得你不能用百分比。从那里开始,我只是在 test.xml 布局中插入了一个 TextView,使用 Layer _ list.xml 文件作为背景。我将高度设置为100dp (叠加偏移量的两倍) ,结果如下:
当当当!
再次编辑 : 我已经意识到您可以将形状嵌入到图层列表中作为项目来绘制,这意味着您不再需要3个独立的 XML 文件了!你可以这样把它们结合起来得到同样的结果: