非法参数异常:从视图加载位图时,宽度和高度必须> 0

2022-09-01 08:20:23

我正在尝试在ImageViewTouch上绘制,这是一个支持收缩缩放的库。我能够使用 Canvas 在图像上绘制,但是当我缩放图像时,绘图会消失。

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

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.htmldecodeSampledBitmapFromResource


答案 1

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

我使用的是视图的方法,该方法仅在视图测量和布局后执行,这样并返回实际的宽度和高度。postgetWidth()getHeight()

下面是代码示例:

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

希望它也能帮助别人:)


答案 2

如果其他一切都是正确的,那么你执行代码太早了。

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

干杯!


推荐