为什么postRotate()方法改变X轴方向

Mou*_*ALI 5 java android matrix android-canvas

我正在尝试反映像这样绘制的贴纸

\n

原创贴纸----------反光贴纸

\n
      \xe2\x86\x93                           \xe2\x86\x93\n
Run Code Online (Sandbox Code Playgroud)\n\n
public void reflectCurrentSticker(int windowWidth) {\n\n    //     Y\n    // ----|----- x\n    //     |\n\n    //creation of the cloned sticker\n    //getWidth() == width of the FrameLayout (where the stickers drawn)\n\n    Matrix originalMatrix = getReflectedMatrix(getWidth(), originalSticker);\n    addSticker(clonedSticker);\n    clonedSticker.setMatrix(originalMatrix);\n    invalidate();\n\n}\n\npublic Matrix getReflectedMatrix(int wrapperWidth, Sticker sticker) {\n    Matrix matrix = sticker.getMatrix();\n    float transX = getMatrixValue(matrix, 2);\n    float transY = getMatrixValue(matrix, 5);\n    float newX = (((float) wrapperWidth) - transX) - ((float) sticker.getCurrentWidth());\n    float currentAngle = sticker.getCurrentAngle();\n    float currentScale = sticker.getCurrentScale();\n    Matrix newMatrix = new Matrix();\n    newMatrix.postRotate(currentAngle);\n    newMatrix.postScale(currentScale, currentScale);\n    newMatrix.postTranslate(newX, transY);\n    return newMatrix;\n}\n\npublic float getMatrixValue(@NonNull Matrix matrix, @IntRange(from = 0, to = 9) int valueIndex) {\n        final float[] matrixValues = new float[9];\n        matrix.getValues(matrixValues);\n        return matrixValues[valueIndex];\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我的代码工作正常,但是当我旋转原始贴纸并尝试从中创建反射贴纸时,问题就开始了,不幸的是,我得到了这个,反射贴纸放置在错误的位置,旋转角度错误。

\n

原创贴纸--反光贴纸

\n
      \xe2\x86\x93                 \xe2\x86\x93\n
Run Code Online (Sandbox Code Playgroud)\n\n

预期输出是:

\n

原创贴纸----------反光贴纸

\n
      \xe2\x86\x93                           \xe2\x86\x93\n
Run Code Online (Sandbox Code Playgroud)\n\n

Dar*_*man 2

为什么postRotate()方法改变X轴方向?

看起来可能是这样,但事实并非如此。首先,你需要明白translate()rotate()操作screw()需要一个枢轴点。枢轴点位于任何图像/位图的最左上角。其次,Android 总是顺时针旋转图像/位图,而不是逆时针旋转。如果你想逆时针旋转它,你可以将角度 ei 取反,90-90不推荐这样做——这可能会导致错误。相当360 - angle - 180。所以,这可能就是您想要的。

newMatrix.postScale(-currentScale, currentScale);
newMatrix.postTranslate(sticker.getCurrentWidth, transY);
newMatrix.postRotate(360 - currentAngle - 180);
Run Code Online (Sandbox Code Playgroud)