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
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 :)
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é!
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
loadBitmapFromView(mImage);
}
}, 1000);
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);
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"