web-dev-qa-db-ja.com

IllegalArgumentException:ビューからビットマップをロードしている間、幅と高さは> 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呼び出しの後に追加されたコードを次に示します。場合は次のとおりです。ラジオグループリスナがあり、ラジオボタンをチェックするとき、画像を読み込み、その上に可能な図面を描画する必要があります。その後、すべて(画像と図面)のみを変換しようとしています。 1つのビットマップ。

コードのその他の部分は次のとおりです。

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

その後、描画する必要があるものをすべて描画し、表示したloadImageBitmapメソッドを使用してビューをビットマップに変換しようとします。

Android Developers http://developer.Android.com/training/displaying-bitmaps/load-bitmap.htmlでこのリンクから取得したdecodeSampledBitmapFromResourceメソッド

24
Felipe Mosso

私はついに自分の問題の解決策を見つけました。

ビューのpostメソッドを使用しています。これは、ビューの測定とレイアウトの後にのみ実行されます。このようにgetWidth()およびgetHeight()は実際の幅を返し、高さ。

コードサンプルは次のとおりです。

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

それが他の誰かにも役立つことを願っています:)

35
Felipe Mosso

他のすべてが正しければ、コードの実行が早すぎます。

ビューのレイアウトは、Androidによってまだ測定されていません。 OnResumeで実行してみて、これが問題かどうかを確認してください。

乾杯!

5
Sam Aleksov
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            loadBitmapFromView(mImage);
        }
    }, 1000);
3
manas.abrol

_Java.lang.IllegalArgumentException: width and height must be > 0_は、Bitmap.createBitmap()呼び出しでv.getLayoutParams().widthまたはv.getLayoutParams().heightが0であるためです。おそらく、LayoutParamsmImageに誤って設定されています。

更新:setLayoutParams()を使用する前のmImagecreateBitmap()。このようなもの:

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

私の場合、親orientationverticalLinearLayoutに設定するのを忘れており、horizontalのデフォルト値が設定されているので、問題はなくなりました...

Android:orientation="vertical"
0
Mehdi Khademloo