【问题标题】:Add shadow to the ShapeDrawable programmatically以编程方式向 ShapeDrawable 添加阴影
【发布时间】:2012-12-26 14:53:27
【问题描述】:

我正在尝试以编程方式制作具有不同渐变的按钮。我使用 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);

但是,我想以编程方式向按钮添加 阴影,而不是按钮文本。任何帮助将不胜感激。

【问题讨论】:

    标签: java android shadow shapedrawable


    【解决方案1】:

    但是我想给按钮添加阴影,而不是按钮 以编程方式文本。

    我猜你想要你构建的当前可绘制对象背后的阴影。如果是,则制作一个 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 我知道你想要什么,但我想不出一些简单的东西。您可以制作自己的 Drawable 并在 draw 方法中创建该效果,或者,简单地说,创建一个带有所需阴影的小 .png 图像,并创建一个设置为平铺模式的 BitmapDrawable 以重复该 png 图像和然后使用 BitmapDrawable 作为阴影层。
    【解决方案2】:

    一种更简洁的方法是使用Paint.setShadowLayer,如Jack's answer

    【讨论】:

    • 您的链接中似乎没有杰克的答案。
    • “以编程方式”是什么意思?
    • @Arthur Melo。使用代码而不是布局编辑器。
    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多