2012-04-11 7 views
25

¿Cómo puedo obtener el mapa de bits de una forma xml dibujable. ¿Qué estoy haciendo mal?¿Cómo obtener un mapa de bits de un dibujable definido en un 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> 

Mi método para recuperar el mapa de bits de dibujable:

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

getBitmap() está volviendo nula cuando el identificador ha pasado es el shadow.xml ID dibujable

Respuesta

13

ShapeDrawable no tiene un mapa de bits asociado, su único objetivo es dibujar en un lienzo. Hasta que se llama su método de dibujo, no tiene imagen. Si puede obtener un elemento canvas en el lugar donde necesita dibujar la sombra, puede dibujarlo como shapeDrawable, de lo contrario podría necesitar una vista separada y vacía en su diseño con la sombra como fondo.

+0

gracias por la buena explicación. Lo dibujé directamente sobre lienzo y funcionó bien. – kaneda

+0

@kaneda ¿Puedes mostrar el código que finalmente funcionó? Estoy enfrentando el mismo problema aquí. Muchas gracias. –

+0

Eso sería algo similar a 'Drawable d = getContext(). GetResources(). GetDrawable (R.drawable.id);' 'd.draw (canvas);' – Punksmurf

27

Ésta es una solución totalmente trabajo:

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

Y aquí es un ejemplo:

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

Esta debería ser la respuesta aceptada – blueware

+0

Lanza java.lang.IllegalArgumentException: ancho y alto deben ser> 0 – BMU

+0

Solo una actualización de compatibilidad menor: cambiar "getResources(). GetDrawable (drawableRes);" por "ContextCompat.getDrawable (context, drawableRes);" – Tobliug

0

Usted debe agregar atributo de tamaño a tu sha pe dibujable para evitar "java.lang.IllegalArgumentException: ancho y alto debe ser> 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> 
Cuestiones relacionadas