围绕X轴旋转画布上绘制位图的问题

时间:2011-07-28 18:02:34

标签: android canvas bitmap

美好的一天,

绘图时我有一个奇怪的问题。代码和图片说的多于单词。

mCamera.save();
mCamera.rotateX(rotateX);
mCamera.getMatrix(mMatrix);
mCamera.restore();

canvas.save();
canvas.setMatrix(mMatrix);

// here I draw images
...

canvas.restore();

结果如下图所示。第一张照片的角度为0度,第二幅度为45度左右,持续时间更长。它取决于我想绘制的区域大小(位图数量)。我注意到当我绘制整个适合画布边界的位图时,它工作正常。但问题主要是当我用类似的东西绘制图像时(所以在画布之外的部分)

canvas.drawBitmap(image, -100, -100, null)

和图片(嗯,因为我是新来的,我不能直接发布图片......)

TTP://locus.asamm.cz/data/_temp/1311873666794.png

http://locus.asamm.cz/data/_temp/1311873695945.png

http://locus.asamm.cz/data/_temp/1311873782054.png

所以问题是,如果有任何工作解决方案或至少任何提示。此外,如果有经验的人可以判断使用OpenGL绘图是否可以帮助解决这个问题,如果有的话,请指出任何可以帮助我绘制变化很大的位图的信息源(它的地图应用程序让用户随地图移动),因为我仍然找不到任何简单明了的信息来源。

非常感谢

2 个答案:

答案 0 :(得分:0)

这是2D绘图API的限制。要做真正的3D,你应该使用OpenGL。

答案 1 :(得分:0)

我希望您正在尝试制作谷歌地图倾斜/旋转效果,我已成功为谷歌地图做了因为他们认为我们不需要更新;-)而且我需要它用于我的应用程序,即使你是使用你自己的瓷砖它基本上是一样的。

有一点有用,就是要意识到Camera Matrix的旋转是在左上角进行的。

所以你应该转换到适当的位置(取决于旋转轴和你期望的结果)然后回来,比如......在我阅读文档之前你得到的效果与我的非常相似并且想出来。

camera.save();
    camera.rotateX(tilt);  // tilt forward or backward
    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
     // use the center of the canvas, or the bottom center dependent on your results 
     cameraMatrix.preTranslate(-centerX, -centerY);

     // NOTE: Camera Rotations logically happen here when the canvas has the matrix applied  
     // 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 

     // Move it back after the rotations are applied
     cameraMatrix.postTranslate(centerX, centerY);

camera.restore();

canvas.concat(cameraMatrix);

另一件事是超大容器,以便在倾斜/旋转操作后没有空的空间(或至少限制它),你可以通过计算所需的超大尺寸,显示器的对角线来做到这一点适用于基本旋转,+基于倾斜的百分比,如果您正在使用它。

使用pre / postTranslate可以为您提供一些有趣的结果。

至于移动位图我不太确定你为什么这样做,可能是平移,但只要画布被填满就应该没关系

更新

这是我如何超大画布,我试图使用LayoutParams来做到这一点,但没有太多的运气,所以在Measure上是我的方式。

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
    if (!isInEditMode())
        super.onMeasure(View.MeasureSpec.makeMeasureSpec(scaledDimensionsW,
        View.MeasureSpec.EXACTLY),
        View.MeasureSpec.makeMeasureSpec(scaledDimensionsH,
        View.MeasureSpec.EXACTLY));
   else
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}