画像はマトリックスによってスケーリングされます。
Matrix matrix = new Matrix();
matrix.postScale(...);
matrix.postTranslate(...);
matrix.postRotate(...);
...
ズームした画像が元の画像の半分を下回らないようにしたいと思います。したがって、ズームの合計は0.5を下回らないようにする必要があります。
しかし、それを行う方法は?チェックする行列の最初の値を取得しようとしました:
float pendingZoom = 0.6f;
float[] values = new float[9];
Matrix.getValues(values);
float scalex = values[Matrix.MSCALE_X];
それで:
if(scalex<0.5) {
pendingZoom = pendingZoom * (0.5f / scalex);
}
残念ながら、動作しない場合があります。画像が回転している場合、はscalex
ネガティブにpendingZoom
なる可能性があり、もネガティブになります。
これを正しく行う方法は?
アップデート
values[Matrix.MSCALE_X]
は、実現可能なズーム値ではないことがわかりました。長方形の新しい幅を計算するために使用しますが、正しくありません。
代わりに、マトリックスによって2つのポイントをマッピングし、2つの距離を計算しようとしました。
PointF newP1 = mapPoint(matrix, new PointF(0, 0));
PointF newP2 = mapPoint(matrix, new PointF(width, 0));
float scale = calcDistance(newP1, newP2) / width;
scale
私は今正しい値を得ることができます。しかし、それが最善の解決策かどうかはわかりません。