Revision 4 as of 2010-10-29 14:09:08

Clear message
Locked History Actions

Android/ImageView

ImageView

リンク

AndroidのImageViewの表示サイズの決まり方

使い方

※以下の記述は単にマニュアルやその他の資料から想像されたものであって、全く未検証である。

ImageView自体のサイズの決まり方」については、上記リンクを参照のこと。以下ではImageViewの中にDrawableその他がどのように表示されるかについてだけ見ていく。

この表示のされかたの制御はImageView#setScaleType(ScaleType type)メソッドで行うらしい。

まず、必ずしもImageViewのサイズとそこに描画されるイメージのサイズが一致するとは限らない。そもそもイメージの「サイズ」とは何なのかが問題であるが、ビットマップの場合には当然のことながらピクセルサイズであり、これをそのまま1対1でデバイスのピクセルに描画すれば解像度によって大きさが異なってしまうため、ほとんど常に伸縮されて描画されることになる。

この伸縮のタイプには二種類あり、

  • アスペクト比を保持せずに伸縮
  • アスペクト比を保持して伸縮

例えば、ImageViewの領域が横長の大きさのときに、縦長のイメージを描画する場合、アスペクト比を無視してもよいのか、保持したいのかをまず決める必要がある。

アスペクト比を保持せずに伸縮する場合

ScaleTypeとして、FIT_XYを使用する。 ImageViewに指定されたpadding値は無視され、イメージはImageViewの横一杯、縦一杯に広がって描画されるらしい。

アスペクト比を保持して伸縮する場合

ImageViewに指定されたpadding値を無視するかしないかの選択がある。

padding値を無視する場合

FIT_CENTER, FIT_END, FIT_STARTはpadding値を無視して、ImageView一杯に描画する。 もちろん、イメージのアスペクト比は保持されるので、ImageView内に「余った部分」が現れる。 つまり、描画イメージをImageView内のどこに置くかについて選択肢がある。

  • FIT_CENTERはできるだけ中央におく。例えば、余る部分が縦方向であれば、上下の余り部分が等しくなるようにする。
  • FIT_STARTはできるだけ左上におく。例えば、余る部分が縦方向であれば、下側だけに現れるようにする。
  • FIT_ENDはできるだけ右下におく。余る部分が縦方向であれば、上側だけに現れるようにする。

paddingを無視しない場合

paddingを無視しない場合は、ImageViewの領域から上下左右のpadding部分を除いた部分が実際の描画領域になる。 この領域について、

  • CENTER_INSIDEは、この描画領域についてFIT_CENTERと同じ処理をする。つまり、描画領域に伸縮したイメージが含まれるようにして中央に置く。
  • CENTER_CROPは、上とは逆に伸縮したイメージが描画領域を含むようにする。この場合、イメージのすべてを描画することはできず、上下あるいは左右がカットされる。

その他の描画方法

CENTERは単純にイメージのサイズで描画して、それを描画領域の中央におく。とはいっても、スクリーン上のイメージのサイズとは何であるのか定義はない。

MATRIXはsetImageMatrix(Matrix matrix)メソッドで指定したMatrixにより任意のアフィン変換を行って描画することになる。 つまり、イメージは拡大縮小はもちろんだが、回転や押し潰しなどの効果を使って描画されることになる。 Android/Matrix/Matrixを参照のこと。