実行時に幅と高さを手動で設定する場合は、ビューがレイアウト システムによって測定された後に、ImageView の LayoutParams への参照を取得します。これをレンダリング フェーズの早い段階で行うと、ビューの幅と高さ、およびその親ビューなどが 0 になります。
オープン ソース ライブラリに役立つコードがいくつかあります。このプロセスは次の 2 つの部分で構成されます。
- コントロールの ViewTreeObserver にアタッチされた OnPreDrawListener をセットアップします。私の例ではカスタム コントロール内でこれを行いますが、アクティビティでも同様に行うことができます。
- onPreDraw メソッド内で、画像とその親に幅と高さの値が割り当てられます。計算を行ってから、幅や高さをビューの LayoutParams オブジェクトに手動で設定できます (元に戻すことを忘れないでください)。
画面にレンダリングされる直前にカスタム ImageView に縦横比を適用しているこの例を確認してください。これがあなたのユースケースに正確に適合するかどうかはわかりませんが、これは OnPreDrawListener を ViewTreeObserver に追加し、完了したらそれを削除し、実行時にビューに動的なサイズ変更を適用する方法を示します
https://github.com/aguynamedrich/beacon-utils/blob/master/Library/src/us/beacondigital/utils/RemoteImageView.java#L78
これは、特定のサイズ変更ロジックを削除した修正版です。また、imageView から ViewTreeObserver を取得します。これは、カスタム コントロールを実装しておらず、Activity でのみこれを実行したい場合に発生する可能性が高いシナリオです。
private void initResizeLogic() {
final ViewTreeObserver obs = imageView.getViewTreeObserver();
obs.addOnPreDrawListener(new OnPreDrawListener() {
public boolean onPreDraw() {
dynamicResize();
obs.removeOnPreDrawListener(this);
return true;
}
});
}
protected void dynamicResize() {
ViewGroup.LayoutParams lp = imageView.getLayoutParams();
// resize logic goes here...
// imageView.getWidth() and imageView.getHeight() now return
// their initial layout values
lp.height = someCalculatedHeight;
lp.width = someCalculatedWidth;
imageView.setLayoutParams(lp);
}
}