2012-04-11 41 views
25

如何從可繪製的xml形狀獲取位圖。 我在做什麼錯?如何從xml中定義的drawable獲取位圖?

shadow.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle" > 

    <gradient 
     android:angle="270.0" 
     android:endColor="@android:color/transparent" 
     android:startColor="#33000000" 
     android:type="linear" /> 

    <size android:height="7.0dip" /> 

</shape> 

我的方法來檢索繪製位圖:

private Bitmap getBitmap(int id) { 
    return BitmapFactory.decodeResource(getContext().getResources(), id); 
} 

getBitmap()的返回null時傳遞的id是shadow.xml可繪製的ID。

回答

13

ShapeDrawable沒有與它相關聯的位圖 - 它的唯一目的是在畫布上繪製。直到它的繪製方法被調用,它沒有圖像。如果您可以在需要繪製陰影的位置獲取畫布元素,則可以將其繪製爲shapeDrawable,否則可能需要在佈局中以陰影作爲背景的單獨的空視圖。

+0

謝謝你的好解釋。我直接在畫布上繪製,工作正常。 – kaneda 2012-04-11 18:08:27

+0

@kaneda可以顯示最終工作的代碼嗎?我在這裏面臨同樣的問題。非常感謝。 – 2015-10-07 22:14:46

+0

這將是沿線 '可繪製的d = getContext()。getResources()。getDrawable(R.drawable.id);' 'd.draw(canvas);' – Punksmurf 2015-10-09 12:40:44

27

這是一個完全工作液

private Bitmap getBitmap(int drawableRes) { 
    Drawable drawable = getResources().getDrawable(drawableRes); 
    Canvas canvas = new Canvas(); 
    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); 
    canvas.setBitmap(bitmap); 
    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 
    drawable.draw(canvas); 

    return bitmap; 
} 

而且這裏有一個例子:

Bitmap drawableBitmap = getBitmap(R.drawable.circle_shape); 

circle_shape.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval"> 
    <size 
     android:width="15dp" 
     android:height="15dp" /> 
    <solid 
     android:color="#94f5b6" /> 
    <stroke 
     android:width="2dp" 
     android:color="#487b5a"/> 
</shape> 
+1

這應該是公認的答案 – blueware 2016-12-27 12:06:47

+0

它拋出java.lang.IllegalArgumentException:寬度和高度必須> 0 – BMU 2017-04-20 11:37:48

+0

只是一個小的兼容性更新:更改「getResources()。getDrawable(drawableRes);」通過「ContextCompat.getDrawable(context,drawableRes);」 – Tobliug 2017-08-25 12:20:00

0

您應該添加大小屬性對你的沙pe drawable用於防止「java.lang.IllegalArgumentException:寬度和高度必須> 0」。

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="oval"> 
     <solid android:color="@color/colorAccent" /> 
     <stroke 
      android:width="1.3dp" 
      android:color="@color/white" /> 

     <size android:height="24dp" android:width="24dp"/> 
</shape>