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ます。ケースは次のとおりです。ラジオグループリスナーがあり、ラジオボタンをチェックすると、画像をロードしてその上にいくつかの可能な図面を描画する必要があります..次に、すべて(画像と図面)をのみに変換しようとしています1 つのビットマップ。

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

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

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

decodeSampledBitmapFromResourceAndroid開発者のこのリンクから取得した方法http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

4

5 に答える 5

45

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

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

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

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

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

于 2013-07-19T11:35:27.263 に答える
1

java.lang.IllegalArgumentException: width and height must be > 0は、あなたのBitmap.createBitmap()呼び出しでv.getLayoutParams().widthまたはv.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 に答える