IllegalArgumentException: ancho y alto deben ser> 0 al cargar Bitmap desde View

Intento recurrir a ImageViewTouch, una biblioteca que permite hacer zoom de pellizco. Puedo dibujar sobre la imagen usando Canvas, pero cuando hago zoom en la imagen, el dibujo desaparece.

Para esto, estoy tratando de convertir la vista a un bitmap y establecer el mapa de imágenes para esta misma vista. Aquí está el código:

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

Cuando hago esto, aparece el siguiente error de registro:

 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 loadBitmapFromView llamada loadBitmapFromView el dibujo normalmente aparece sobre la imagen. Cuando bash interactuar con la imagen (como acercar o alejar), el dibujo desaparece, quedando solo la imagen de fondo, que es una imagen.

— EDITAR —

Aquí hay un código más colocado después de la llamada loadBitmapFromView . El caso es: tengo un audífono de grupo de radio y cuando reviso un botón de radio, tengo que cargar la imagen y dibujar algunos dibujos posibles sobre ella … luego bash convertir todo (la imagen y los dibujos) en solo un bitmap

Esta es la siguiente parte del código:

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

Después de eso, dibujo todo lo que tengo que dibujar e bash convertir la vista a bitmap utilizando el método loadImageBitmap que he mostrado.

el método decodeSampledBitmapFromResource que obtuve de este enlace en los desarrolladores de Android http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

Finalmente descubrí una solución para mi problema.

Estoy utilizando el método de post de la Vista, que se ejecutará solo después de la vista de medición y diseño, de esta manera getWidth() y getHeight() devuelve el ancho y la altura reales.

Aquí está el ejemplo del código:

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

Espero que también ayude a alguien más 🙂

Si todo lo demás es correcto, estás ejecutando tu código demasiado pronto.

El diseño de la vista aún no ha sido medido por Android. Intenta ejecutar en OnResume solo para ver si este es tu problema.

¡Aclamaciones!

java.lang.IllegalArgumentException: width and height must be > 0 porque en la llamada v.getLayoutParams().width o v.getLayoutParams().height es 0. Probablemente los LayoutParams se establezcan erróneamente en mImage .

Actualización: setLayoutParams() para mImage antes de usar createBitmap() . Algo como esto:

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

En mi caso, olvidé establecer la orientation en vertical para LinearLayout padre y se ha establecido el valor predeterminado de horizontal , así que lo configuré y mi problema desapareció …

 android:orientation="vertical" 
  new Handler().postDelayed(new Runnable() { @Override public void run() { loadBitmapFromView(mImage); } }, 1000);