You are not allowed to edit this page.

Clear message
Locked History Actions

Android/Matrix

Matrix

ようするにこれはアフィン変換を表す行列を保持したもの。 Javaにはもともとこの用途としてAffineTransformというクラスが存在するが、なぜわざわざ別のものを作成したのか、例によって説明は全く無し。

また、Matrixという名称は極めて不適当と言えるだろう。本当に英語圏の人間がこのような名前付けをしているのだろうか?不可解である。 AffineTransformがイヤであれば、TransformMatrixなどいくらでも考えられるであろうに。

矩形から矩形へのマッピング

特にImageViewでの描画のされ方に関わりがあるのが、Matrix#setRectToRect(RectF src, RectF dst, ScaleToFit stf)というメソッドであり、 これは要するに(イメージに限らないのだが)、イメージの矩形領域を実際の描画領域にどのように割り当てるかを決めるものであるようだ。 この三番目の引数はenumとして定義されており、

    public enum ScaleToFit {
        /** X, Yをそれぞれスケーリングし、(それぞれの)srcとdstは正確に一致する。
         * これはsrcのアスペクト比を変化させる可能性がある。
         */
        FILL    (0),
        /** srcのアスペクト比を保持しつつ、srcがdst内にフィットするようにスケールを決める
         * つまり、少なくとも一つの軸(xあるいはy)が正確に一致する。
        * そして、結果をleftかtopの辺にアラインする。
         */
        START   (1),
        /** STARTと同じだが、結果はdstの中央にアラインする。
         */
        CENTER  (2),
        /**
         * STARTと同じだが、結果はdstのrightかbottomの辺にアラインする。
         */
        END     (3);
    }

要するに、与えられたsrcをdstいっぱいに引き伸ばしたいのだが、この際

  • アスペクト比を保持しない
  • アスペクト比を保持する

という二つの方法があり、後者の場合には当然dst一杯にはならない可能性があるため、どのようにアラインさせるかということになる。