2013-11-21 63 views
6

由於我的應用程序的顏色主題是動態的,我只能使用顏色和shapedrawables創建背景drawables,我想要建立一個帶有顏色和形狀的可繪製的edittext背景,如下所示。 但我想這樣做編程LayerDrawable以編程方式

如何以編程方式構建相同的drawable?

<item> 
    <shape> 
     <solid android:color="@android:color/yellow" /> 
    </shape> 
</item> 

<!-- main color --> 
<item 
    android:bottom="1dp" 
    android:left="1dp" 
    android:right="1dp"> 
    <shape> 
     <solid android:color="@android:color/white" /> 
    </shape> 
</item> 

<!-- draw another block to cut-off the left and right bars --> 
<item android:bottom="10dp"> 
    <shape> 
     <solid android:color="@android:color/white" /> 
    </shape> 
</item> 

這就是我想....

GradientDrawable border = new GradientDrawable(); 
    border.setShape(GradientDrawable.RECTANGLE); 
    border.setColor(Color.WHITE); 

    GradientDrawable background = new GradientDrawable(); 
    background.setShape(GradientDrawable.RECTANGLE); 
    background.setColor(Color.YELLOW); 


    GradientDrawable clip = new GradientDrawable(); 
    clip.setShape(GradientDrawable.RECTANGLE); 
    border.setColor(Color.WHITE); 

    Drawable[] layers = {background, border, clip}; 
    LayerDrawable layerDrawable = new LayerDrawable(layers); 

    layerDrawable.setLayerInset(0, 0, 0, 0, 0); 
    layerDrawable.setLayerInset(1, 1, 0, 1, 1); 
    layerDrawable.setLayerInset(2, 0, 0, 0, 10); 

但結果是不同的......請大家幫忙....!

+0

如果您的應用程序主題是動態的,爲什麼不使用樣式? http://developer.android.com/guide/topics/ui/themes.html –

+0

我不能像xml中的顏色一樣保留值...在我的情況下,顏色值來自服務器,無論如何感謝您的時間......: ) – zaaak

+0

你有沒有想過使用一些圖像並在這些圖像上應用濾鏡來實現主題。 – Alan

回答

20

我得到它的工作finaly ......相反,我使用ShapeDrawable ...的使用GradientDrawable多數民衆贊成.... :)

通過設置這個layerDrawable作爲一個EditText背景,你可以重新生成默認的EditText 樣式自定義顏色...

ShapeDrawable border = new ShapeDrawable(); 
    border.getPaint().setColor(Color.WHITE); 

    ShapeDrawable background = new ShapeDrawable(); 
    background.getPaint().setColor(Color.BLACK); 


    ShapeDrawable clip = new ShapeDrawable(); 
    clip.getPaint().setColor(Color.WHITE); 

    Drawable[] layers = {background, border, clip}; 
    LayerDrawable layerDrawable = new LayerDrawable(layers); 

    layerDrawable.setLayerInset(0, 0, 0, 0, 0); 
    layerDrawable.setLayerInset(1, 1, 0, 1, 1); 
    layerDrawable.setLayerInset(2, 0, 0, 0, 10); 

`

+6

更多的解釋會更好。 – jcaruso

+0

正是我需要的幫助,謝謝 – JamisonMan111

0

這也適用於梯度繪項目:

GradientDrawable border = new GradientDrawable(); 
border.setColor(Color.White); 

GradientDrawable background = new GradientDrawable(); 
background.setColor(Color.Black); 

GradientDrawable clip = new GradientDrawable(); 
clip.setColor(Color.White); 

GradientDrawable[] layers = {background, border, clip}; 
LayerDrawable layerDrawable = new LayerDrawable(layers); 

layerDrawable.setLayerInset(0, 0, 0, 0, 0); 
layerDrawable.setLayerInset(1, 1, 0, 1, 1); 
layerDrawable.setLayerInset(2, 0, 0, 0, 10);