IllegalArgumentException:从View加载Bitmap时,width和height必须> 0

我正在尝试使用ImageViewTouch,这是一个可以进行缩放缩放的库。 我可以使用Canvas绘制图像,但是当我缩放图像时,绘图会消失。

为此,我正在尝试将视图转换为位图并为同一视图设置ImageBitmap。 这是代码:

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

当我这样做时,我收到以下日志错误:

 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) 

如果我删除loadBitmapFromView调用,图形通常会出现在图像上。 当我尝试与图像进行任何交互(如放大或缩小)时,绘图消失,仅重新映射背景图像,即图片。

—编辑—

这是在loadBitmapFromView调用之后放置的更多代码。 案例是:我有一个无线电组听众,当我检查一些单选按钮时,我必须加载图像并在其上绘制一些可能的图纸..然后我试图将所有内容(图像和图纸)转换为仅一个位图。

这是代码的一部分:

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

之后,我绘制了我必须绘制的所有内容,并尝试使用我展示的loadImageBitmap方法将视图转换为位图。

我从Android开发人员的这个链接获得的decodeSampledBitmapFromResource方法http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

我终于找到了解决问题的方法。

我正在使用View的post方法,它只在视图测量和布局之后执行,这样getWidth()getHeight()返回实际的宽度和高度。

这是代码示例:

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

希望它也能帮助别人:)

如果其他一切都正确,那么您过早地执行代码。

Android尚未测量视图的布局。 尝试在OnResume中执行,看看这是不是你的问题。

干杯!

java.lang.IllegalArgumentException: width and height must be > 0 ,因为在你的Bitmap.createBitmap()调用v.getLayoutParams().widthv.getLayoutParams().height是0.可能在mImage中错误地设置了LayoutParams

在使用createBitmap()之前更新: mImage setLayoutParams() createBitmap() 。 像这样的东西:

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

在我的情况下,我忘了为父LinearLayout设置vertical ,并设置了horizontal的默认值,所以我设置它,我的问题消失了……

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