まず、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 もオーバーライドしてみました。それは良い値を与えますが、後でデコード後に実行されます:(
レイアウト サイズを計算するにはどうすればよいですか?