【问题标题】:IllegalArgumentException: width and height must be > 0 while loading Bitmap from ViewIllegalArgumentException:从视图加载位图时,宽度和高度必须 > 0
【发布时间】:2013-07-10 10:48:04
【问题描述】:

我正在尝试在 ImageViewTouch 上绘图,这是一个启用捏缩放的库。我可以使用 Canvas 在图像上绘图,但是当我缩放图像时,绘图消失了。

为此,我正在尝试将视图转换为位图并为同一视图设置 theImageBitmap。代码如下:

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开发者http://developer.android.com/training/displaying-bitmaps/load-bitmap.html这个链接得到的decodeSampledBitmapFromResource方法

【问题讨论】:

    标签: java canvas view bitmap imageview


    【解决方案1】:
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                loadBitmapFromView(mImage);
            }
        }, 1000);
    

    【讨论】:

      【解决方案2】:

      在我的例子中,我忘记将父级LinearLayoutorientation 设置为vertical 并且已经设置了horizontal 的默认值,所以我设置了它并且我的问题消失了......

      android:orientation="vertical"
      

      【讨论】:

        【解决方案3】:

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

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

        这是代码示例:

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

        希望它也对其他人有所帮助:)

        【讨论】:

        • 嗨,你能解释一下吗。所以无论你在哪里设置图像位图,你只要把它放在上面的 Runnable 中,你的宽度和高度就没有问题了吗?
        • 代码适用于所有 Android API,而不是 API 21(棒棒糖)。我正在使用三星 S4 设备,但这些代码行也没有帮助我。
        【解决方案4】:

        java.lang.IllegalArgumentException: width and height must be > 0 是因为在您的Bitmap.createBitmap() 调用中v.getLayoutParams().widthv.getLayoutParams().height 为0。可能LayoutParamsmImage 中设置错误。

        更新:setLayoutParams() 用于 mImage,然后再使用 createBitmap()。像这样的:

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

        【讨论】:

        • 是的..我已经检查过了,它们真的是零..但是为什么呢?我只是将之前的视图作为参数传递,但现在这个视图上绘制了画布
        • @FelipeMosso 您是在视图呈现给用户之前还是之后传递视图? IIRC,如果你之前通过了,那么getLayoutParams().heightgetLayoutParams().width 将为0。
        • 我在它呈现给用户之前就通过了。因为我必须向他展示已经绘制的所有图纸。我已经用更多信息编辑了这个问题,看看它,请:)
        • 呈现给用户后如何传递?我真的被困住了:(
        • 请看我的更新。如果没有帮助,请发布所有涉及mImage的代码。
        【解决方案5】:

        如果其他所有内容都正确,则说明您执行代码太早了。

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

        干杯!

        【讨论】:

        • 我可能正在做你所说的,因为在调用这个 setImageBitmap 之前我打电话给另一个。我已经用更多的解释编辑了这个问题!
        • 当你说尝试在 OnResume 中执行时我不明白。我在单选按钮更改侦听器上设置了位图,活动仍然相同 :( 你能否尝试通过显示来说明它给我一些代码?谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多