2012-12-26 46 views
4

我試圖用編程方式製作具有不同漸變效果的按鈕。我使用ShapeDrawable,它像一個魅力。以編程方式向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); 

但是我想一個陰影添加到該按鈕,沒有按鈕上的文字編程。任何幫助,將不勝感激。

回答

7

但是我想以編程方式向按鈕添加陰影,而不是按鈕 文本。

我想你想要的是你建立的當前繪圖背後的陰影。如果是,則與另一個Drawable(放在第一)將充當影子沿着LayerDrawable

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); 
+0

謝謝!有用。有沒有辦法讓底層的「陰影」圖層模糊一點? (我嘗試過線性漸變,但看起來很奇怪......) –

+1

@ stevo.mit我知道你想要什麼,但我想不出那麼簡單。你可以創建自己的'Drawable'並在'draw'方法中創建該效果,或者簡單地,用所需的陰影創建一個小的'.png'圖像,並創建一個具有平鋪模式的'BitmapDrawable'以重複該png圖像然後使用該'BitmapDrawable'作爲陰影層。 – Luksprog

-1

一個更清潔的方式來做到這一點是使用Paint.setShadowLayerJack's answer

+0

看起來你的鏈接中沒有傑克的答案。 – Myoch

相關問題