美好的一天,
绘图时我有一个奇怪的问题。代码和图片说的多于单词。
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绘图是否可以帮助解决这个问题,如果有的话,请指出任何可以帮助我绘制变化很大的位图的信息源(它的地图应用程序让用户随地图移动),因为我仍然找不到任何简单明了的信息来源。
非常感谢
答案 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);
}