Unmotivated

やる気はない

Android 4.3 で ImageView#getImageMatrix() の挙動が変わっている

今まで ImageView#getImageMatrix() で取得した Matrix のインスタンスに対して、直接 post*() のメソッドを呼んだりして操作すれば表示に反映されていたが、どうやら 4.3 で挙動が変わったご様子。

結論から言うと、横着せずにちゃんと毎回 setImageMatrix() をしてやるか、はじめに setImageMatrix() してから getImageMatrix() を使うようにすれば想定通りに動作する。

1
2
3
4
5
6
7
ImageView imageView = findViewById(R.id.imageView);

float ratio = 2.0f;
Matrix matrix = imageView.getImageMatrix();
matrix.postScale(ratio, ratio);

matrix.setImageMatrix(matrix);
1
2
3
4
5
6
7
8
ImageView imageView = findViewById(R.id.imageView);

Matrix matrix = new Matrix();
imageView.setImageMatrix();

float ratio = 2.0f;
matrix = imageView.getImageMatrix();
matrix.postScale(ratio, ratio);

どう変わってるのか確認

4.2 以前では mMatrix (initImageView()で初期化されてる)がそのまま返っているのに対して、 4.3 以降では mDrawMatrix が返るようになっている。 (mDrawMatrix は configureBounds() でセットされている)

mDrawMatrix がセットされていない状態だと、その場で Matrix のインスタンスが作られているため、このインスタンスに対して直接操作を行っても反映されないというわけでした。

4.2_r1 android.widget.ImageView#getImageMatrix()link
1
2
3
public Matrix getImageMatrix() {
    return mMatrix;
}
4.3_r1 android.widget.ImageView#getImageMatrix()link
1
2
3
4
5
6
public Matrix getImageMatrix() {
    if (mDrawMatrix == null) {
        return new Matrix(Matrix.IDENTITY_MATRIX);
    }
    return mDrawMatrix;
}

Android はマイナーバージョンアップでも、結構こういう細かい挙動変更が入ってくるので、以前動いていたものが突然動かなくなることが良くあるのだけれど、Android のコードを直接見に行けば答えが書いてあるので安心感がありますね。

Comments