74

LinearLayout 内にいくつかの ImageViews があります。ImageViews を縮小して、LinearLayout 内に垂直に収まりながら縦横比を維持する必要があります。水平方向には、それらが互いに隣接する必要があります。

ImageViews の幅は広いが、あまり高くない LinearLayout を持つように、重み付けされたレイアウトをネストする単純化されたテスト ベッドを作成しました。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
    <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="5">
        <LinearLayout android:id="@+id/linearLayout3" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1">
            <ImageView android:id="@+id/imageView1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
            <ImageView android:id="@+id/imageView2" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
        </LinearLayout>
        <LinearLayout android:id="@+id/linearLayout4" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1"></LinearLayout>
    </LinearLayout>
    <LinearLayout android:id="@+id/linearLayout2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"></LinearLayout>
</LinearLayout>

(Eclipse レイアウト エディターでは、画像は垂直方向にクリップされ、まったく拡大縮小されません。しかし、これは私たちが愛することを学ぶ特異性の 1 つにすぎません)

ハードウェアで実行すると、画像は縦横比を維持しながら正しい高さにスケーリングされます。私の問題は、それらが隣り合っていないことです。各 ImageView の高さは、LinearLayout の高さと正しく一致します。各 ImageView の幅は、縮小されていない画像の幅です。実際に縮小された画像は、ImageView の左側に表示されます。このため、画像間に大きなギャップが生じています。

理想的には XML を介してこれを管理したいと考えていますが、これが不可能な場合は、カスタム ビューを使用することが最善の解決策であると理解しています。

高さに応じて幅をスケーリングすることで、必要なサイズのイメージ ビューを作成できるように、onMeasure をオーバーライドする IconView (ImageView を拡張する) クラスを作成してみました。ただし、関数に渡されるparentWidthとparentHeightは、LinearLayoutコンテナではなく、画面の寸法でした。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
  int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
  // Calculations followed by calls to setMeasuredDimension, setLayoutParams
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

だから私の質問は -

1) 必要に応じて XML を修正することはできますか?

2)カスタム画像に必要な幅を計算できるように、カスタムクラスにLinearLayoutの高さを取得させるにはどうすればよいですか?

ここまで読んでくれてありがとう。解決策の方向を教えていただければ、さらに感謝します!

4

4 に答える 4

267

ImageViews を使用するように変更するのはandroid:layout_height="fill_parent"どうですか?

編集- 見つけるのに時間がかかりましたが、ソースを見ると、adjustViewBoundsを特定するのに役立ちました。android:adjustViewBounds="true"ImageViews に追加してみてください。驚くべきことに、これはデフォルトで false に設定されています。

于 2011-03-18T16:53:49.833 に答える
12

奇妙なことに、助けにはandroid:layout_height="fill_parent"なりandroid:adjustViewBounds="true"ませんでした。私が抱えていた問題は、画像が表示されていましたが、画像の上にブロック行があり、画像の下に黒い行がありました。スケールタイプを に設定すると"centerCrop"役に立ちました。画像サイズが小さかったのが原因だと思います。

于 2012-03-21T03:30:48.170 に答える