ImageViewの幅をmatch_parentにしてもアスペクト比を保つ方法

  • Android
  • ImageView
  • Layout

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

ImageViewの幅を親いっぱいに広げつつ、画像のアスペクト比を崩さずに高さを合わせたいことがある。結論から言うと adjustViewBounds="true" を付ければいい。

実装

<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/image"
android:adjustViewBounds="true" />

layout_width="match_parent" で幅を親要素に合わせ、layout_height="wrap_content" で高さは自動、そして adjustViewBounds="true" を付けることで、その自動計算が画像本来のアスペクト比に基づいて行われるようになる。

adjustViewBoundsが無いとどうなるか

adjustViewBounds を付けずに wrap_content を指定すると、高さは画像そのもののサイズを基準に決まる。幅だけ match_parent で引き伸ばした場合、高さは画像本来の縦横比とは無関係な値になり、結果的に見た目が縦横比の崩れた表示になる。

adjustViewBounds="true" にすると、ImageViewは「幅が決まったら、それに合わせて高さを再計算する」という挙動に変わる。これが今回欲しかった動きそのもの。

scaleTypeとの関係

scaleType を明示していない場合、デフォルトは fitCenter になる。これも中央寄せでアスペクト比を維持する設定なので、adjustViewBounds と組み合わせても矛盾は起きない。

maxWidth / maxHeightを使う場合の注意

android:maxWidth や android:maxHeight でサイズに上限を設けたい場合は、adjustViewBounds="true" とセットで指定しないと、これらの制限が効かないらしい(未確認、実機で試していない)。今回のケースでは maxWidth / maxHeight を使っていないので影響はない。