How do you find out the scale of an graphics matrix in Android
Asked Answered
E

2

21

So, it appears to be fairly easy to do pinch zoom in android - but I would also like to be able to snap back the image when it goes out of bounds, and to do that the most reasonable thing seems to be to do things like when the scale < 1, rescale to 1. However, I can't seem to find a good way to retrieve the scale from the the graphics matrix.

One possible solution might be to map a point using the matrix's mapPoints function and see where it ends up, but in addition to being trickly, that just feels ugly and indirect to me. Are there any better solutions for retrieving the scale from an Android graphics matrix?

Edith answered 4/3, 2011 at 19:6 Comment(1)
Note that scale and zoom are very different in Matrices, see this answer #12260760Estevez
R
59
float[] f = new float[9];
matrix.getValues(f);

float scaleX = f[Matrix.MSCALE_X];
float scaleY = f[Matrix.MSCALE_Y];

will probably be what you are looking for. the values given will be as followed:

0 : Scale X

1 : Skew X

2 : Translate X

3 : Scale Y

4 : Skew Y

5 : Translate Y

6 : Perspective 0

7 : Perspective 1

8 : Perspective 2

Retired answered 31/3, 2011 at 0:30 Comment(2)
Thanks, I had also passed over this part of the documentation. If you use this, though, it's probably best to use the constants provided in the Matrix class. For example, use Matrix.MSCALE_X instead of 0 for the 'Scale X' index.Salba
Note that position 3 is Skew-Y, not Scale-Y. Further proof that it's better to use the constants.Wirehaired
W
0

Here's a simple method to log the matrix contents:

private void logMatrix(String label, Matrix matrix) {
    float[] matrixVals = new float[9];
    matrix.getValues(matrixVals);
    Log.e(TAG, String.format("%s: %s\nscale (x,y) = (%f, %f)\ntranslate (x,y) = (%f, %f)\nskew (x,y) "
                             + "= (%f, %f)\nperspective-0 = %f\nperspective-1 = %f\nperspective-2 = %f",
        label, matrix, matrixVals[Matrix.MSCALE_X], matrixVals[Matrix.MSCALE_Y],
        matrixVals[Matrix.MTRANS_X], matrixVals[Matrix.MTRANS_Y],
        matrixVals[Matrix.MSKEW_X], matrixVals[Matrix.MSKEW_Y],
        matrixVals[Matrix.MPERSP_0], matrixVals[Matrix.MPERSP_1], matrixVals[Matrix.MPERSP_2]));
}
Wirehaired answered 4/9, 2019 at 23:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.