web-dev-qa-db-ja.com

Android ImageViewサイズがソース画像に合わせてスケーリングされない

LinearLayout内にいくつかのImageViewがあります。 ImageLayoutを縮小して、縦横比を維持しながら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の高さを取得させるにはどうすればよいですか?

ここまで読んでくれてありがとう。ソリューションの方向性を教えていただければさらに感謝します!

72
Rok

ImageViewsを変更してAndroid:layout_height="fill_parent"を使用するのはどうですか?

Edit-見つけるのに少し時間がかかりましたが、ソースを見るとピンポイント adjustViewBounds がわかりました。 ImageViewsにAndroid:adjustViewBounds="true"を追加してみてください。驚いたことに、これはデフォルトでfalseです。

261
Matthew Willis

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

11
user754657

同様の問題があり、私の解決策はAndroid:scaleType="fitEnd" XMLレイアウトファイルのImageViewの属性。

6
MichK