2012-04-11 16 views
25

Jak uzyskać mapę bitową z rysowania w kształcie xml. Co robię źle?Jak uzyskać bitmapę z losowania zdefiniowanego w xml?

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> 

moja metoda, aby pobrać bitmapę z odkształcalne:

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

getBitmap() zwraca wartość null, gdy id przekazany jest shadow.xml identyfikator do pobrania.

Odpowiedz

13

a ShapeDrawable nie ma powiązanej z nim mapy bitowej - jej jedynym celem jest rysowanie na płótnie. Dopóki nie zostanie wywołana metoda jego rysowania, nie ma obrazu. Jeśli możesz uzyskać element canvas w miejscu, w którym chcesz narysować cień, możesz narysować go jako shapeDrawable, w przeciwnym razie możesz potrzebować osobnego, pustego widoku w układzie z cieniem jako tłem.

+0

dziękuję za dobre wyjaśnienie. Rysowałem go bezpośrednio na płótnie i działałem dobrze. – kaneda

+0

@kaneda możesz pokazać kod, który w końcu zadziałał? Mam tu do czynienia z tym samym problemem. Wielkie dzięki. –

+0

To byłoby coś wzdłuż linii 'rozciągliwej d = getContext() getResources() getDrawable (R.drawable.id);..' 'D.draw (płótno);' – Punksmurf

27

Jest to rozwiązanie w pełni pracy:

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; 
} 

A oto przykład:

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

To powinna być zaakceptowana odpowiedź – blueware

+0

Wrzuca java.lang.IllegalArgumentException: szerokość i wysokość musi być> 0 – BMU

+0

Po prostu drobna aktualizacja kompatybilności: zmień "getResources(). GetDrawable (drawableRes);" przez "ContextCompat.getDrawable (context, drawableRes);" – Tobliug

0

Należy dodać atrybut rozmiaru do twojego sha pe drawable dla zapobiegania "java.lang.IllegalArgumentException: szerokość i wysokość muszą być> 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> 
Powiązane problemy