vxh.viet
5/10/2017 - 2:55 AM

Android image transformation matrix stuff.

Android image transformation matrix stuff.

**Useful image transformation matrix **

Source: Math StackExchange

  • Calculate the difference between 2 matrices. This difference matrix can then be postconcated to another matrix to make that matrix have the same transformation. In the image below, A after some translation, scaling, rotation turns into A'. In order for B to have those same transformation, we calculate the diff matrix between A and A', then we post concat it with B's current matrix.

    /**
     * <pre>
     * Calculate the difference between the old transformation matrix and the new matrix, based on the following formula:
     * Difference = (O) * (N^-1)
     * O: old transformation matrix.
     * N: new matrix.
     * Source: https://math.stackexchange.com/q/1399401
     * Position is very important in matrix operation.
     *
     * This one has been tested with rotate, scale, translation.
     * </pre>
     *
     * @param oldMatrix the matrix to calculate the difference from
     * @param newMatrix the new input matrix.
     * @return a matrix that represent the difference from the old matrix.
     */
    public static Matrix getDifferenceMatrix(Matrix oldMatrix, Matrix newMatrix){
        Matrix diffMatrix = new Matrix();
        newMatrix.invert(diffMatrix);
        diffMatrix.postConcat(oldMatrix);
        diffMatrix.invert(diffMatrix);
        return diffMatrix;
    }

Source: StackOverFlow

  • Convenient method to have a matrix that have a set of scaling and translate value to scale and center one rect to another rect. One note, Rect in android doesn't rotate. After we rotate an image it will only result in a new Rect that can fit all those new corners.
Matrix m = new Matrix();
RectF drawableRect = new RectF(0, 0, imageWidth, imageHeight);
RectF viewRect = new RectF(0, 0, imageView.getWidth(), imageView.getHeight());
m.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER);
imageView.setImageMatrix(m);