4

説明のためにListView、項目がImageViews の があります。の行の幅に合わせて画像を拡大縮小し、ListView縦横比を維持します。ListViewのアイテム レイアウトの簡略版を次に示します。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:padding="4dp" >

        <FrameLayout
            android:id="@+id/page_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="visible" >

            <ImageView
                android:id="@+id/image"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:adjustViewBounds="true"
                android:scaleType="fitCenter"
                android:src="@drawable/some_image" />
        </FrameLayout>
    </FrameLayout>

</LinearLayout>

ImageView幅はmatch_parentで、その祖先はすべて同じです。レイアウト デザイナーは、ImageViewの寸法が幅全体に及ぶことを示していますが、内部の画像はそうではありません。

画像は正しくスケーリングされています。問題は、リスト ビューの行の高さが、幅を適切なサイズに調整できないことです。を使用するfitXYと、幅は拡大縮小されますが、縦横比が正しくありません。

何か案は?

4

2 に答える 2

4

カスタム ビューを作成しないと、これを達成する方法が見つかりませんでした。簡単に言うと、カスタム ビューはそれ自身の寸法を、その背後にあるドローアブルの実際の (スケーリングされていない) 寸法に設定します。

public class ResizableImageView extends ImageView {

    public static interface OnSizeChangedListener {

        void onSizeChanged(int width, int height);
    }

    private OnSizeChangedListener onSizeChangedListener = null;

    public ResizableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = width * getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth();
        setMeasuredDimension(width, height);
        if (onSizeChangedListener != null) {
            onSizeChangedListener.onSizeChanged(width, height);
        }
    }

    public void setOnSizeChangedListener(OnSizeChangedListener listener) {
        this.onSizeChangedListener = listener;
    }
}

私の場合、他のビューのサイズを変更するためにサイズ変更された値を取得する必要がありました。したがって、リスナー インターフェイスです。

于 2012-09-05T21:35:26.280 に答える
0

Android API Guideによると、アスペクト比を維持したい場合は、android:scaleType="fitCenter" for android:scaleType="centerInside" または android:scaleType="centerCrop" を次のように変更する必要があると思いますfitCenter はイメージの縦横比を維持しません。

于 2012-09-05T18:26:38.950 に答える