SVG 드로잉을위한 자바 코드가 있습니다. rotate
을 비롯한 변형을 처리하며, Chrome에서의 렌더링과 비교하여 수많은 테스트 그림에서 볼 수있는 한 매우 잘 수행합니다. 다음으로 필요한 것은 변환을 통해 선언 된 많은 이미지에있는 실제 객체 위치를 얻는 것입니다. 그래서 나는 드로잉에 사용 된 매트릭스에서 X와 Y를 읽는 것으로 결정했습니다. 불행히도 rotate
변환에 대한 잘못된 값을 얻습니다. 즉, 이미지의 실제 개체 위치에 해당하지 않습니다.SVG 회전을위한 이상한 매트릭스 변환
다운 박리 코드는 다음과 같다 :
Matrix matrix = new Matrix();
float cx = 1000; // suppose this is an object X coordinate
float cy = 300; // this is its Y coordinate
float angle = -90; // rotate counterclockwise, got from "rotate(-90, 1000, 300)"
// shift to -X,-Y, so object is in the center
matrix.postTranslate(-cx, -cy);
// rotate actually
matrix.postRotate(angle);
// shift back
matrix.postTranslate(cx, cy);
// debug goes here
float[] values = new float[9];
matrix.getValues(values);
Log.v("HELLO", values[Matrix.MTRANS_X] + " " + values[Matrix.MTRANS_Y]);
로그 (700)는 1300의 값을 각각 출력한다. 나는 0과 0을 기대할 것입니다. 왜냐하면 객체가 내 이미지에서 (즉 움직임이 없음) 회전 된 것을 볼 수 있기 때문이며 postTranslate 호출은 서로를 보완해야합니다. 물론이 값이 1000과 300에서 어떻게 형성되는지는 알지만 그 이유는 이해하지 못합니다. 다시 한 번,이 이상한 값을 가진 행렬은 실제 객체 드로잉에 사용되며 올바른 것으로 지적합니다. 누군가 여기서 일어날 일을 설명 할 수 있을까요? 내가 놓친 게 있니? 지금까지 문제의 해결책은 하나만 있습니다. rotate
에서 위치를 얻으려고 시도하지 말고 명시적인 matrix
및 translate
변형에 대해서만 수행하십시오. 그러나이 접근법은 보편성이 부족합니다. 그리고 어쨌든 매트릭스는 모든 변형 유형에 대해 적절한 값 (오프셋 포함)을 가져야한다고 생각했습니다.