2012-10-17 51 views
1

我有一個標準的按鈕自定義:設置自定義按鈕,選擇位圖項目從SVG

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_pressed="true"> 
    <layer-list> 
    <item android:drawable="@drawable/standard_button_normal_background_layer1"/> 
    <item android:drawable="@drawable/standard_button_normal_background_layer0"/> 
    <item><bitmap android:gravity="center" android:src="@drawable/the_bitmap" /></item> 
    </layer-list> 
</item> 

... 

</selector> 

我需要一個我從SVG文件加載到更改位圖。我用

http://code.google.com/p/svg-android/

能產生PictureDrawable:

SVG svg = SVGParser.getSVGFromResource(getResources(), R.raw.icon); 
PictureDrawable pd = svg.createPictureDrawable(); 
imageView.setImageDrawable(pd); 

我如何可以訪問特定<bitmap>項目,我怎麼可以設置位圖?任何解決方案

編輯:

我想知道如果我可以通過編程添加到自定義按鈕的圖片上<layer-list>項目的底部。圖片來自svg,所以它不在編譯的資源上。

我需要的結果是一個帶有一些自定義圖形(由<layer-list>定義)的按鈕和一個來自svg的集中在裏面的圖標。

回答

1

如果你問如何編寫一個引用從SVG加載的圖片的XML文件,那就是雞和蛋。在部署應用程序時,res /中的所有內容都是隻讀的。因此,通過從一組繪圖指令動態加載位圖,您可以簡單地存儲輸出的位圖。

imageView.onDraw(mBitmapCanvas);

這是你能做的一切。您可以創建一個柵格作爲預建步驟,但您將失去與應用程序綁定的矢量的大小優勢。當你想使用這個可繪製

層list.xml

<layer-list> 
    <item android:drawable="@drawable/standard_button_normal_background_layer1"/> 
    <item android:drawable="@drawable/standard_button_normal_background_layer0"/> 
    <!-- Remove bitmap --> 
</layer-list> 

然後:

LayerDrawable drawable = (LayerDrawable)getResources().getDrawable(R.drawable.layout_list); 
ArrayList<Drawable> layers = new ArrayList<Drawable>(); 
for(int i=0; i < drawable.getNumberOfLayers(); i++) { 
    layers.add(drawable.getDrawable(i); 
} 

layers.add(new BitmapDrawable(mBitmap)); 
drawable = new LayerDrawable(layers.toArray(new Drawable[layers.size()]); 

如果你問如何編輯佈局列表,試試這個

+0

我編輯了我的問題,也許它現在更清晰了。謝謝。 –

+0

好吧,我看到你的答案更新。圖層列表位於之內,但我想我會發現它如何訪問它。所以,你說我需要一個BitmapDrawable。我可以在運行時從SVG準備它: 'PictureDrawable pd = svg.createPictureDrawable();' 'Bitmap mBitmap = Bitmap.createBitmap(100,100,Config.ARGB_8888);' 'Canvas canvas = new Canvas (bmp);' 'canvas.drawPicture(pd.getPicture());' –

+1

是的,你可以組織選擇器,但是你可以在選擇器中引用其他文件。至於其餘的代碼,我認爲這將是你如何得到你想要的位圖。您需要將其包裝在可繪製的圖層中才能使圖層列表正常工作。你甚至可以使用PictureDrawable。 –