33

我正在尝试在 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 方法将视图转换为位图。

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

4

5 回答 5

45

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

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

这是代码示例:

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

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

于 2013-07-19T11:35:27.263 回答
10

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

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

干杯!

于 2013-07-12T00:29:57.127 回答
8
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            loadBitmapFromView(mImage);
        }
    }, 1000);
于 2018-07-14T11:42:42.607 回答
1

java.lang.IllegalArgumentException: width and height must be > 0是因为在您的Bitmap.createBitmap()通话中v.getLayoutParams().widthorv.getLayoutParams().height是 0。可能LayoutParams错误地设置在mImage.

更新:setLayoutParams()对于使用mImage前的createBitmap(). 像这样的东西:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(30, 30);
mImage.setLayoutParams(layoutParams);
于 2013-07-12T00:24:30.530 回答
1

在我的情况下,我忘记设置orientation为父vertical级并且已经设置LinearLayout了默认值,所以我设置了它并且我的问题消失了......horizontal

android:orientation="vertical"
于 2017-04-11T20:56:23.317 回答