Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在绕X轴旋转的画布上绘制位图时出现问题_Android_Canvas_Bitmap - Fatal编程技术网

Android 在绕X轴旋转的画布上绘制位图时出现问题

Android 在绕X轴旋转的画布上绘制位图时出现问题,android,canvas,bitmap,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度,最后一张图片的角度更大。

你好

我在画图像方面有奇怪的问题。代码和图片比文字更能说明问题

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

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

// here I draw images
...

canvas.restore();
结果见下图。第一张图片的角度为0,第二张大约为45度,最后一张图片的角度更大。它取决于我想要绘制的区域大小(位图的数量)。我注意到,当我绘制完全符合画布边界的位图时,效果很好。但问题主要是当我用类似的东西(比如画布外的部分)绘制图像时

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

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

所以问题是,是否有任何有效的解决方案或至少有任何提示。另外,如果有经验的人可以告诉我,使用OpenGL绘图是否可以帮助解决这个问题,如果可以,请告诉我任何可以帮助我绘制变化很大的位图的信息源(这是地图应用程序,因此用户可以使用地图进行移动),因为我仍然找不到任何简单而清晰的信息源


非常感谢大家

这是2D绘图API的一个限制。要实现真正的3D,您应该使用OpenGL。

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

有助于实现相机矩阵的旋转是在左上角执行的

所以你应该变换到适当的位置(取决于旋转轴和你的预期结果),然后再返回,类似于。。。你得到的效果和我读文档之前的效果非常相似

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/post翻译可以得到一些有趣的结果

至于移动位图,我不太清楚为什么要这样做,可能是平移,但只要画布被填满,这就不重要了

更新

下面是我如何加大画布的尺寸,我尝试使用LayoutParams来实现这一点,但没有太多的运气,所以测量是我的方法

@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);
}

嗯,我担心我会得到这个答案。第二个问题也是如此。关于示例解决方案的任何提示都可以帮助我更好地理解如何在OpenGL中显示动态加载的位图?我知道有很多教程,但每一个节目都只展示如何显示已经预装的位图或一些向量。经过一年多的积极发展,感谢您接受这个答案。似乎普通的“画布”方式对于这个任务来说还不够强大,使用OpenGL是唯一的解决方案。谢谢你们的帮助,谢谢你们的回复。通过你的代码,我可以看出我做的每件事都是一样的(或者几乎一样)。正如你们在我的第一篇文章中所附的图片上看到的,我正在以正确的方式(围绕中心)旋转画布。此外,尺寸过大也已完成。例如,当屏幕为800x480时,我将地图绘制区域设置为2000x2000,并对矩阵应用有效转换,以将地图放置在正确的位置。即使这样,图像也非常相似。。。显示上的行无效。正如Romain menioned所说,我将不得不使用一些OpenGL方法,但经过半天的搜索,我仍然不知道如何简单地将canvas更改为OpenGLWell它对我来说工作正常,我没有任何实际问题,我将倾斜限制为45度,因为我不需要更多,但作为测试,我已经上升到60度,仍然没有问题。你是如何将画布尺寸过大的?你也在做后期翻译吗?嗯,该死的。。。是的,我使用的是完全相同的机制。但在centerX,Y使用预Translate的地方,我使用预Translate来定制定义的大小。这个尺寸也定义了绘制瓷砖的区域。嗯,但看起来它必须以某种方式起作用。请问您是否可以直接更改画布的大小(如果可能的话)?因为我不是。我只是“对我的地图说”,画布大小是2000x2000(即使它只有480x800),我只是在“这个”(面积2000x2000)上画画。所以我先翻译(-1000,-1000)然后再翻译(240400)。当我只绕Z旋转时,它工作得很好。在X附近会引起麻烦。嗯,很有趣!!我得试试,我会让你知道的。非常感谢。我相信,你的解决方案没有成功。完全相同的问题。我创建了一个示例和一个非常简单的应用程序(),这要归功于SeekBar,它使用我的方法旋转了一些矩形,在那里您可以简单地看到哪里出了问题。所以,如果你有一点时间,看看它。也许你会明白我做错了什么。还想,我该如何报答你的时间:)。非常感谢。
@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);
}