# http://fchiba.blog114.fc2.com/blog-entry-35.html をもう少しわかりやすく書きなおした。
# レイアウト計算の詳細を知らなくても読めるようになったはず。


ImageViewの表示サイズは、以下の要素によって決まります。

  1. layout_width / layout_heightのパラメータ
  2. Drawableの画像サイズ(IntrinsicWidth/Height)
  3. minWidth / minHeight
  4. maxWidth / maxHeight
  5. BackgroundDrawable の画像サイズ(IntrinsicWidth/Height)
  6. adjustViewBounds
  7. padding
  8. matrix
  9. scaleType
  10. cropToPadding

    このうち、1.~7.によってImageViewの大きさが決まります。
    8.~10.は、ImageViewの大きさが所与のものとして、その中でDrawableがどのように描画されるかを決めるパラメータです。

    以下では話を簡単にするために、
    ・親ViewGroupがLinearLayoutで、orientaion=vertical, layout_width=fill_parent, layout_height=fill_parent
    ・ImageViewは、layout_width/layout_height に wrap_content か fill_parent のどちらかを指定(ピクセル指定しない)、padding=0
    を仮定しています。


    ■View自体の大きさの決まり方

    A. adjustViewBounds = true かつ layout_width/layout_height のどちらかにwrap_content が指定されている場合、
     A-1) width/heightをDrawableのIntrinsicWidth/Heightで仮ぎめ
     A-2) layout_width/layout_heightに、fill_parentが指定されていれば、親Viewの値で上書き
     A-3) layout_width/layout_heightに、wrap_contentが指定されていれば、親Viewより小さくなるようにする
        (ここで決めた値以上になることはない)
     A-4) layout_width が wrap_content の場合、layout_heightを固定のまま、Drawableのアスペクト比とおなじになるように layout_width を変更。
        (変更の結果 layout_width が元の値より大きくなってしまう場合はそのまま)
     A-5) A-4) で調整ができず layout_height が wrap_content の場合、
        layout_widthを固定のまま、Drawableのアスペクト比とおなじになるように layout_height を変更。
        (変更の結果 layout_height が元の値より大きくなってしまう場合はそのまま)

     注: A. の場合、minWidth / minHeight と BackgroundDrawableのIntrinsicWidth/Height は考慮されません。

    B. A.以外の場合、
     B-1) fill_parent が指定されていれば、その値
     B-2) fill_parent が指定されていない場合、Drawableのwidth/heightを下記の順で調整する
        (i) minWidth / minHeight 以上
        (ii) BackgroundDrawableのIntrinsicWidth/Height 以上
        (iii) maxWidth / maxHeight 以下


    ■描画のされ方
    scaleTypeの値によってDrawableが表示される位置と拡大率が決まります。

    ・fitXY
     ImageViewの大きさにぴったりあうように表示
    ・matrix
     setImageMatrixで指定したMatrixをそのまま使う
    ・center
     Drawableを中央に配置する。拡大率は1(オリジナル画像のまま)
    ・center_crop
     Drawableを、アスペクト比を維持しつつ隙間がなくなるように拡大・縮小して中央に配置するように描画
    ・center_inside
     Drawableを、アスペクト比を維持しつつ全てが収まるように拡大・縮小して中央に配置するように描画
    ・fitStart, fitEnd, fitCenter
     Matrix.ScaleToFit(http://developer.android.com/intl/ja/reference/android/graphics/Matrix.ScaleToFit.html)におまかせ

    Drawableの描画がImageViewの大きさからはみ出す場合、cropToPaddingの値により、paddingの処理が変わります。
    具体的には、CropToPaddingがfalse(デフォルト)の場合は、はみ出した箇所にはpaddingが表示されません(paddingの領域にもDrawableが描画される)が、
    trueだと常にpaddingが表示されます。