47 votes

Comment obtenir un Bitmap à partir d'un dessin défini dans un XML ?

Comment puis-je obtenir le bitmap à partir d'une forme XML pouvant être dessinée. Qu'est-ce que je fais mal?

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>

Ma méthode pour récupérer le bitmap de drawable :

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

getBitmap() renvoie null lorsque l'identifiant transmis est l' identifiant pouvant être dessiné shadow.xml.

73voto

vovahost Points 1123

Il s'agit d'une solution entièrement fonctionnelle :

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

Et voici un exemple :

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

forme_cercle.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>

14voto

JRaymond Points 6348

un ShapeDrawable n'a pas de bitmap associé - son seul but est d'être dessiné sur un canevas. Jusqu'à ce que sa méthode draw soit appelée, il n'a pas d'image. Si vous pouvez obtenir un élément de canevas à l'endroit où vous devez dessiner l'ombre, vous pouvez le dessiner en tant que shapeDrawable, sinon vous aurez peut-être besoin d'une vue séparée et vide dans votre mise en page avec l'ombre en arrière-plan.

4voto

Selcan Points 41

Vous devez ajouter l'attribut size à votre shape drawable pour empêcher "java.lang.IllegalArgumentException: width and height must be > 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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X