Locked History Actions

Diff for "Android/ImageView"

Differences between revisions 8 and 9
Deletions are marked like this. Additions are marked like this.
Line 6: Line 6:

== 不必要に複雑なクラス ==

このクラスはとにかく不必要に複雑すぎる。
やりたいことは単にDrawable等をセットして描画したいだけであるのに、異様に複雑で訳がわからない。
Line 27: Line 33:
ImageViewに指定されたpadding値は無視され、イメージはImageViewの横一杯、縦一杯に広がって描画されるらしい。 イメージはImageViewの横一杯、縦一杯に広がって描画されるらしい。
ただし、paddingとして指定した領域には描画されない。
Line 33: Line 40:
==== padding値を無視する場合 ====

※と最初に記述したのだが、実験してみるとpaddingはちゃんと加味されていた。もはや何が何だかわからない。

FIT_CENTER, FIT_END, FIT_STARTはpadding値を無視して、ImageView一杯に描画する。
FIT_CENTER, FIT_END, FIT_STARTは、ImageView一杯(padding部を除く)に描画する。
Line 45: Line 48:
==== paddingを無視しない場合 ==== CENTER_INSIDE, CENTER_CROPは使いものにならない。
Line 47: Line 50:
paddingを無視しない場合は、ImageViewの領域から上下左右のpadding部分を除いた部分が実際の描画領域になる。
この領域について、

* CENTER_INSIDEは、この描画領域につFIT_CENTERと同じ処理する。つまり、描画領域に伸縮したイメージが含まれるようにして中央に置く。
※となるはずな
のだが、実際にはCENTER(後述)と同じ機能しかないように思うの。。。。バグのような気がする。
 * CENTER_CROPは、上とは逆に伸縮したイメージが描画領域を含むようにする。この場合、イメージのすべてを描画することはできず、上下あるいは左右がカットされる。
 * CENTER_INSIDEは、説明を読むとっけんFIT_CENTERと同じ処理のような気がするのだが、実際にはCENTER(後述)と同じ機能しかないようだ。。。。バグのような気がする。
 * CENTER_CROPは、伸縮したイメージがpaddingを除く描画領域を含むようにする。この場合、イメージのすべてを描画することはできず、上下あるいは左右がカットされる。
Line 67: Line 66:
 * CENTER_CROPは機能的に使い物にならない。  * CENTER_CROPは機能的に使い物にならない。こんなものが必要な人はいないでしょう。
Line 72: Line 71:

ということで、普通の人はFIT_CENTER一本槍で行くしかないだろう
ということで、普通の人はFIT_CENTERしか必要はないと思われる

ImageView

リンク

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

不必要に複雑なクラス

このクラスはとにかく不必要に複雑すぎる。 やりたいことは単にDrawable等をセットして描画したいだけであるのに、異様に複雑で訳がわからない。

使い方

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

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

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

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

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

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

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

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

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

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

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

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

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

CENTER_INSIDE, CENTER_CROPは使いものにならない。

  • CENTER_INSIDEは、説明を読むといっけんFIT_CENTERと同じ処理のような気がするのだが、実際にはCENTER(後述)と同じ機能しかないようだ。。。。バグのような気がする。
  • CENTER_CROPは、伸縮したイメージがpaddingを除く描画領域を含むようにする。この場合、イメージのすべてを描画することはできず、上下あるいは左右がカットされる。

※実際には描画時にpaddingが無視されてしまう。例えば、ImageViewが正方形であるとして、そこに上下左右のpaddingを設定し、横長のイメージを描画する場合、上下方向のpadding部分には描画されないが、左右方向は平気で描画されてしまう。

その他の描画方法

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

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

使い方のまとめ

  • CENTERはイメージサイズ(って何?)で描画するので使いものにならない。
  • CENTER_INSIDEはバグっている。CENTERと同じ機能しかない。
  • CENTER_CROPは機能的に使い物にならない。こんなものが必要な人はいないでしょう。
  • MATRIXは上級者向け。普通の人は必要ない。
  • FIT_START, FIT_ENDを使うより、ImageView自体のgravityを設定した方がよいでしょう。

  • FIT_XYは普通の人には必要ない。

ということで、普通の人にはFIT_CENTERしか必要はないと思われる。