以编程方式向ShapeDrawable添加阴影

6

我正在尝试通过编程方式制作具有不同渐变的按钮。我使用ShapeDrawable,这个方法非常顺利。

RoundRectShape rs = new RoundRectShape(new float[] { 12f, 12f, 12f, 12f, 12f, 12f, 12f, 12f }, null, null);
ShapeDrawable sd = new ShapeDrawable(rs);
ShapeDrawable.ShaderFactory sf = new ShapeDrawable.ShaderFactory() {

    @Override
    public Shader resize(int width, int height) {
        LinearGradient lg = new LinearGradient(0, 0, 0, height,
                new int[] { 
                    Color.parseColor("#feccb1"), 
                    Color.parseColor("#f17432"), 
                    Color.parseColor("#e86320"),
                    Color.parseColor("#f96e22") },
                new float[] {
                    0, 0.50f, 0.50f, 1 },
                Shader.TileMode.REPEAT);
             return lg;
        }
    };
sd.setShaderFactory(sf);
myBtn.setBackgroundDrawable(sd);

但是我希望能够通过编程给按钮添加阴影,而不是按钮文本。任何帮助都将不胜感激。

2个回答

8
然而,我想通过程序添加一个阴影到按钮,而不是按钮的文本。我猜你想在当前构建的可绘制对象后面添加阴影。如果是这样的话,可以使用LayerDrawable和另一个Drawable(放在第一位)来充当阴影。
    RoundRectShape rss = new RoundRectShape(new float[] { 12f, 12f, 12f,
            12f, 12f, 12f, 12f, 12f }, null, null);
    ShapeDrawable sds = new ShapeDrawable(rss);
    sds.setShaderFactory(new ShapeDrawable.ShaderFactory() {

        @Override
        public Shader resize(int width, int height) {
            LinearGradient lg = new LinearGradient(0, 0, 0, height,
                    new int[] { Color.parseColor("#e5e5e5"),
                            Color.parseColor("#e5e5e5"),
                            Color.parseColor("#e5e5e5"),
                            Color.parseColor("#e5e5e5") }, new float[] { 0,
                            0.50f, 0.50f, 1 }, Shader.TileMode.REPEAT);
            return lg;
        }
    });

    LayerDrawable ld = new LayerDrawable(new Drawable[] { sds, sd });
    ld.setLayerInset(0, 5, 5, 0, 0); // inset the shadow so it doesn't start right at the left/top
    ld.setLayerInset(1, 0, 0, 5, 5); // inset the top drawable so we can leave a bit of space for the shadow to use

    b.setBackgroundDrawable(ld);

谢谢!它有效。有没有办法使底层的“阴影”图层有点模糊?(我尝试了线性渐变,但看起来很奇怪...) - stevo.mit
1
@stevo.mit 我知道你想要什么,但我想不到一个简单的方法。你可以创建自己的 Drawable,在 draw 方法中创建该效果,或者更简单的方法是,创建一个带有所需阴影的小 .png 图像,并创建一个 BitmapDrawable,将平铺模式设置为重复该 png 图像,然后将该 BitmapDrawable 用作阴影层。 - user

0
一个更加简洁的方法是使用 Paint.setShadowLayer,就像 Jack's answer 中所示。

2
你的链接中似乎没有杰克的回答。 - Myoch
你所说的“programatically”是什么意思? - Arthur Melo
1
@Arthur Melo。使用代码而非布局编辑器。 - Eduardo Reis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接