0

この問題を解決する方法はありますか? 試してみinvalidate()ましたが、それでも同じ問題が表示されます。ページ/アクティビティを開いた後、画像は図 A のように動作します。前後にスクロールした後、目的のレイアウト (図 B) にのみレンダリングされます。ここに画像の説明を入力

私がやろうとしているのは、実行時に画像の幅と高さを設定することです。したがって、これは以前の質問にも関連しています。Horizo​​ntalListViewの画像はサイズがランダムに変更され、ImageView の動的な幅と高さはほとんど助けられませんでした。

この件に関するヒントを教えてください。

編集: ところで、私のクラスは次のとおりです: MyCustomAdapter ( baseadapterを拡張し、これは ImageLoader から displayimage() を呼び出します)、 MyActivityおよび ImageLoader (これは、私の画像 URL が読み込まれ、デコードされ、非同期的に表示される場所です)

imageViewの高さと幅をどこに設定するかについても混乱しています。今のところ、ImageLoader に設定します。悪くなかった。しかし、私が正しいことをしたかどうかはわかりません。

4

1 に答える 1

0

実行時に幅と高さを手動で設定する場合は、ビューがレイアウト システムによって測定された後に、ImageView の LayoutParams への参照を取得します。これをレンダリング フェーズの早い段階で行うと、ビューの幅と高さ、およびその親ビューなどが 0 になります。

オープン ソース ライブラリに役立つコードがいくつかあります。このプロセスは次の 2 つの部分で構成されます。

  1. コントロールの ViewTreeObserver にアタッチされた OnPreDrawListener をセットアップします。私の例ではカスタム コントロール内でこれを行いますが、アクティビティでも同様に行うことができます。
  2. 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);
    }
}
于 2013-04-04T04:11:25.167 に答える