0

まず、Web からの画像を表示するカスタム コンポーネントがあります。シンプルなレイアウトで、円形のプログレスバーと ImageView が含まれています。デフォルトの状態ではプログレスバーが表示され、画像のダウンロード中に表示され、終了するとプログレスバーを非表示にしてImageViewに画像を表示します。非常にうまく機能していますが、エミュレーターと HTC Hero でjava.lang.OutOfMemoryError: bitmap size exceeded VM Budgetエラーが発生しました。ここで解決策を見つけました。しかし、私の問題は、TARGET_WIDTH と TARGET_HEIGHT が修正されず、60x90 の場合もあれば、fill_parent x fill_parent の場合もあり、デコード関数でこの値を計算できないことです。たとえば、xml に自分のビューを layout_width="fill_parent" で追加し、Activity で使用します

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

ImageLoader picture = (ImageLoader) findViewById(R.id.picture);
picture.load("http://winportal.net/images/galleries/wallpapers/Earth.jpg");

load メソッドでは、ソリューションからデコード関数を呼び出し、ここでサイズを計算してみます。

...
this.onMeasure(0, 0);
Log.d("Log", "Layout width: " + this.getMeasuredWidth());

TARGET_WIDTH =  this.getMeasuredWidth();
...

結果は次のとおりです。「レイアウト幅: 24

プログレスバーの幅が 24 になった理由がわかりませんが、それを含むレイアウトは fill_parent 幅です。onMeasure メソッドをオーバーライドしようとしましたが、0 になりました。

@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
    this.setMeasuredDimension(parentWidth, parentHeight);
} 

onSizeChanged もオーバーライドしてみました。それは良い値を与えますが、後でデコード後に実行されます:(

レイアウト サイズを計算するにはどうすればよいですか?

4

1 に答える 1

0

「this.onMeasure(0, 0);」を呼び出すと、ビューに次のルールで測定を強制します - UNSPECIFIED。ビューには次の状態があります: ProgressBar が表示され、ImageView が非表示になっているため、結果は 24 になります。

最初は、FrameLayoutを ProgressBar と ImageView で使用してみてください。そのシナリオでは、測定を気にする必要はありません。画像が大きすぎないことだけを確認してください (OutOfMemory の場合)。画像ファイルを一時ファイルにダウンロードし、これでサイズを確認し、適切なサンプリング サイズを計算してデコードし、ImageView にビットマップを設定し、ImageView にスケールタイプを設定します。

于 2011-04-07T08:48:51.733 に答える