IllegalArgumentException: width e height devem ser> 0 ao carregar o Bitmap de View

Estou tentando desenhar em um ImageViewTouch, uma biblioteca que permite o zoom de pinça. Eu sou capaz de desenhar sobre a imagem usando o Canvas, mas quando eu zoom a imagem, o desenho desaparece.

Para isso, estou tentando converter a exibição em um bitmap e definir o ImageBitmap para essa mesma exibição. Aqui está o 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; } 

Quando faço isso, recebo o seguinte erro de log:

 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) 

Se eu remover a chamada loadBitmapFromView o desenho normalmente aparece sobre a imagem. Quando tento fazer qualquer interação com a imagem (como aumentar ou diminuir o zoom), o desenho desaparece, permanecendo apenas a imagem de fundo, que é uma imagem.

— EDIT —

Aqui está mais algum código colocado após a chamada loadBitmapFromView . O caso é: Eu tenho um ouvinte de grupo de rádio e quando eu marquei algum radio button, eu tenho que carregar a imagem e desenhar alguns possíveis desenhos sobre ela .. então eu estou tentando converter tudo (a imagem e os desenhos) em apenas um bitmap.

Aqui está a parte mais difícil do código:

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

Depois disso, desenho tudo o que tenho para desenhar e tento converter a exibição em bitmap usando o método loadImageBitmap que mostrei.

o método decodeSampledBitmapFromResource que obtive deste link em desenvolvedores do Android http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

Eu finalmente descobri uma solução para o meu problema.

Estou usando o método post da View, que será executado somente após a medição e o layout da view, desta forma getWidth() e getHeight() retorna a largura e a altura reais.

Aqui está o exemplo de código:

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

Espero que também ajude alguém 🙂

Se tudo o mais estiver correto, você estará executando seu código muito cedo.

O layout da vista ainda não foi medido pelo Android. Tente executar em OnResume apenas para ver se esse é o seu problema.

Felicidades!

java.lang.IllegalArgumentException: width and height must be > 0 é porque na sua chamada v.getLayoutParams().width ou v.getLayoutParams().height é 0. Provavelmente os LayoutParams estão incorretamente definidos em mImage .

Atualização: setLayoutParams() para a mImage antes de usar createBitmap() . Algo assim:

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

No meu caso, esqueci de definir a orientation para vertical para o pai LinearLayout e o valor padrão de horizontal foi definido, então eu configurei e meu problema desapareceu …

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