首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >IllegalArgumentException:从视图加载位图时,宽度和高度必须大于0

IllegalArgumentException:从视图加载位图时,宽度和高度必须大于0
EN

Stack Overflow用户
提问于 2013-07-12 08:17:14
回答 5查看 50.7K关注 0票数 33

我正在尝试在ImageViewTouch上绘图,这是一个支持收缩缩放的库。我可以使用画布在图像上绘制,但当我缩放图像时,绘图消失了。

为此,我尝试将视图转换为位图,并为该视图设置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方法将视图转换为位图。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-07-19 19:35:27

我终于想出了解决我的问题的办法。

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

以下是代码示例:

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

希望它也能帮助其他人:)

票数 44
EN

Stack Overflow用户

发布于 2013-07-12 08:29:57

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

这个视图的布局还没有经过Android的测量。试着在OnResume中执行,看看这是不是你的问题。

干杯!

票数 10
EN

Stack Overflow用户

发布于 2018-07-14 19:42:43

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            loadBitmapFromView(mImage);
        }
    }, 1000);
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17605662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档