web-dev-qa-db-fra.com

IllegalArgumentException: la largeur et la hauteur doivent être> 0 lors du chargement du bitmap depuis la vue

J'essaie de dessiner sur une ImageViewTouch, une bibliothèque qui permet un zoom par pincement. Je peux dessiner sur l'image à l'aide de Canvas, mais lorsque je fais un zoom sur l'image, le dessin disparaît.

Pour cela, j'essaie de convertir la vue en bitmap et de définir l'ImageBitmap pour cette même vue. Voici le code:

mImage.setDrawPath(true);
mImage.setImageBitmap(loadBitmapFromView(mImage)); 

public static Bitmap loadBitmapFromView(View v) {
        Bitmap b = Bitmap.createBitmap( v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);                
        Canvas c = new Canvas(b);
        v.layout(0, 0, v.getWidth(), v.getHeight());
        v.draw(c);
        return b;
}

Lorsque je fais cela, j'obtiens l'erreur de journal suivante:

07-11 21:13:41.567: E/AndroidRuntime(20056): Java.lang.IllegalArgumentException: width and height must be > 0
07-11 21:13:41.567: E/AndroidRuntime(20056):    at Android.graphics.Bitmap.createBitmap(Bitmap.Java:638)
07-11 21:13:41.567: E/AndroidRuntime(20056):    at Android.graphics.Bitmap.createBitmap(Bitmap.Java:620)

Si je supprime l'appel loadBitmapFromView, le dessin apparaît normalement sur l'image. Lorsque j'essaie de faire une interaction avec l'image (comme un zoom avant ou arrière), le dessin disparaît, ne laissant que l'image d'arrière-plan, qui est une image.

--- ÉDITER ---

Voici un peu plus de code placé après l'appel à loadBitmapFromView. Le cas est: j'ai un écouteur de groupe radio et quand je vérifie un bouton radio, je dois charger l'image et dessiner quelques dessins possibles dessus. Alors j'essaie de tout convertir (l'image et les dessins) en seulement un bitmap.

Voici l'autre partie du code:

bitmap = BitmapUtils.decodeSampledBitmapFromResource(root + DefinesAndroid.CAMINHO_SHOPPINGS_SDCARD + nomeImagemAtual, size.x, size.y);
mImage.setImageBitmap(bitmap);

Après cela, je dessine tout ce que j'ai à dessiner et j'essaie de convertir la vue en bitmap en utilisant la méthode loadImageBitmap que j'ai montrée.

la méthode decodeSampledBitmapFromResource obtenue à partir de ce lien sur Android http://developer.Android.com/training/displaying-bitmaps/load-bitmap.html

24
Felipe Mosso

J'ai finalement trouvé une solution à mon problème.

J'utilise la méthode post de la vue, qui ne sera exécutée qu'après la mesure et la mise en page de la vue, de cette façon getWidth() et getHeight() renvoie la largeur réelle et la taille.

Voici l'exemple de code:

mImage.post(new Runnable() {
    @Override
    public void run() {
        mImage.setImageBitmap(loadBitmapFromView(mImage));
    }
});

J'espère que cela aide aussi quelqu'un d'autre :)

35
Felipe Mosso

Si tout le reste est correct, vous exécutez votre code trop tôt.

La disposition de la vue n'a pas encore été mesurée par Android. Essayez d'exécuter dans OnResume juste pour voir si c'est votre problème.

À votre santé!

5
Sam Aleksov
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            loadBitmapFromView(mImage);
        }
    }, 1000);
3
manas.abrol

Java.lang.IllegalArgumentException: width and height must be > 0 Est dû au fait que dans votre Bitmap.createBitmap() appelez v.getLayoutParams().width ou v.getLayoutParams().height est 0. Probablement que les LayoutParams sont mal définis dans mImage.

Mettez à jour: setLayoutParams() pour le mImage avant d'utiliser createBitmap(). Quelque chose comme ça:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(30, 30);
mImage.setLayoutParams(layoutParams);
0
Adam Stelmaszczyk

Dans mon cas, j'ai oublié de définir orientation sur vertical pour le parent LinearLayout et la valeur par défaut de horizontal a été définie, donc je l'ai définie et mon problème disparu ...

Android:orientation="vertical"
0
Mehdi Khademloo