如何使用android.graphics.Camera.rotateX(角度)在特定点旋转画布

我试图使用Camera( android.graphics.Camera而不是硬件相机)围绕特定点旋转视图画布,在这个实例中是画布的中间.

dispatchDraw(Canvas画布)中 – 为了简洁起见,我将所有非重要部分都省略了.

camera.save();
   camera.rotateX(0);
   camera.rotateY(0);
   camera.rotateZ(angle);
   camera.getMatrix(cameraMatrix);
 camera.restore(); 

 canvas.concat( cameraMatrix );

画布旋转,但始终从左上角开始.

注意:因为画布的构造比显示区域大,我还需要翻译最终结果,使其在显示中居中,我可以用

canvas.translate(xOffset,yOffset) PRIOR to calling the camera methods

要么

cameraMatrix.preTranslate(xOffset,yOffset) AFTER the camera methods

两者都正确地将画布中心放在显示器中,但我似乎无法将旋转点作为camera.rotateZ(角度)调用的中心,尝试使用3D android示例中的方法但是它们似乎适用于它们的X / Y轴似乎不影响Z轴

任何帮助将不胜感激,文档并不完全冗长.

解决方法

解决了这个问题,不确定它是否是最好的方式,但它有效.解决方案是

首先翻译画布,使较大的画布居中显示

然后应用相机旋转

然后在矩阵上使用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,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);

如果有人有更好的方法或看到问题,请发表评论.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...