1. ホーム
  2. android

Android ImageViewのサイズがソース画像とスケーリングされない

2023-11-12 21:51:39

質問

私はLinearLayoutの中にいくつかのImageViewsを持っています。 私は、彼らが縦にLinearLayout内に収まる一方で、それらのアスペクト比を維持するようにImageViewsを縮小する必要があります。 水平方向に、私はちょうどそれらが互いに隣接している必要があります。

私は、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 (extends 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の高さを取得するにはどうすればよいですか?

ここまで読んでくださった方、ありがとうございます。 解決策の方向性を示していただけると、さらに感謝します!

どのように解決するのですか?

ImageViewを android:layout_height="fill_parent" ?

編集 - を見つけるのに時間がかかりましたが、ソースを見ることでピンポイントで adjustViewBounds . を追加してみてはいかがでしょうか。 android:adjustViewBounds="true" を追加してみるとよいでしょう。意外なことに、これはデフォルトでfalseになっています。