Решил это, не уверен, что это лучший способ, но он работает. Решение было
Сначала переведите холст, чтобы центрировать больший холст на дисплее
Затем примените поворот камеры
Затем, чтобы использовать методы pre и post translate на матрице, чтобы изменить точку вращения, аналогично тому, что делал образец Android.
Недостающие биты должны были сначала выполнить перевод холста, и я также не использовал больший размер холста для вычисления смещений для методов до и после перевода.
Вот модифицированный код, если он кому-нибудь поможет.
// Center larger canvas in display (was made larger so
// corners will not show when rotated)
canvas.translate(-translateX, -translateY);
// Use the camera to rotate a view on any axis
camera.save();
camera.rotateX(0);
camera.rotateY(0);
camera.rotateZ(angle); // Rotate around Z access (similar to canvas.rotate)
camera.getMatrix(cameraMatrix);
// This moves the center of the view into the upper left corner (0,0)
// which is necessary because Matrix always uses 0,0, as it's transform point
cameraMatrix.preTranslate(-centerScaled, -centerScaled);
// NOTE: Camera Rotations logically happens here when the canvas has the
// matrix applied in the canvas.concat method
// This happens after the camera rotations are applied, moving the view
// back to where it belongs, allowing us to rotate around the center or
// any point we choose
cameraMatrix.postTranslate(centerScaled, centerScaled);
camera.restore();
canvas.concat(cameraMatrix);
Если у кого-то есть способ лучше или он видит проблему, пожалуйста, оставьте комментарий.