Android 安卓:图像围绕中心旋转

Android 安卓:图像围绕中心旋转,android,image,rotation,Android,Image,Rotation,我试着围绕中心旋转一个图像。这通常使用RotateAimation工作,但我想让它快一点。我现在使用带有单独绘图线程的SurfaceView图案 这是正确绘制位图的代码(取决于外部“标题”) 航向=角度,单位为度, 位图=位图, w=位图的宽度, h=位图的高度 Matrix m = new Matrix(); m.preRotate(heading, w/2, h/2); m.setTranslate(50,50); canvas.drawBitmap(bit

我试着围绕中心旋转一个图像。这通常使用RotateAimation工作,但我想让它快一点。我现在使用带有单独绘图线程的SurfaceView图案

这是正确绘制位图的代码(取决于外部“标题”)

航向=角度,单位为度, 位图=位图, w=位图的宽度, h=位图的高度

    Matrix m = new Matrix();
    m.preRotate(heading, w/2, h/2);
    m.setTranslate(50,50);

    canvas.drawBitmap(bitmap, m, null);
缺点:图像是一个圆形,上面的代码会产生可见的锯齿效果

下面的代码也在旋转图像,但在旋转(比如从0度顺时针旋转到45度)时,新图像的中心会向下/向右移动。我想,偏心效应是由于新图像的宽度/高度放大所致??但是,如果设置了filter=true,则此代码不会产生别名。有没有一种方法可以使用代码#1进行某种消除混叠,或者使用代码#2进行消除中心移动

    Matrix m = new Matrix();
    m.preRotate(heading, w/2, h/2);
    m.setTranslate(50,50);

    Bitmap rbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, m, true);
    canvas.drawBitmap(rbmp, 50, 50, null);
更新:根据本线程中的讨论结果,代码#2的正确版本(抗锯齿和正确旋转)如下所示(50,50的偏移量省略):


谢谢。

找到原始图像的中心,对于新图像和中心,请使用:

Matrix minMatrix = new Matrix();
//height and width are set earlier.
Bitmap minBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas minCanvas = new Canvas(minBitmap);

int minwidth = bitmapMin.getWidth();  
int minheight = bitmapMin.getHeight();
int centrex = minwidth/2;
int centrey = minheight/2;

minMatrix.setRotate(mindegrees, centrex, centrey);
Bitmap newmin = Bitmap.createBitmap(minBitmap, 0, 0, (int) minwidth, (int) minheight, minMatrix, true);

minCanvas.drawBitmap(newmin, (centrex - newmin.getWidth()/2), (centrey - newmin.getHeight()/2), null);
minCanvas.setBitmap(minBitmap);

上面代码中setTranslate的用途是什么?我不记得做过简单的旋转。是的,这个可以删除。。。谢谢更正。哦,对不起。恢复了我的更改。setTranslate是将结果偏移到(50,50)所必需的。好的,minCanvas2是什么?bitmapMin是初始位图吗?另外-minBitmap2未声明。请详细说明。不知何故,您的代码没有任何意义-至少作为代码片段:(好的。最后:翻译成我的名称空间,你的答案是这样的。这是解决方案:抗锯齿和正确的旋转。对不起。我应该让我的代码与你的应用程序更相关,甚至尝试使它与你的名称空间相匹配。我也没有说明新画布是在哪里创建的,也没有说明原因。如果我有时间,我会试试看请注明日期。我很高兴它对我有所帮助。是的,非常感谢。您的提示为我指明了正确的方向:)但不幸的是,整个过程并没有很好地执行:(我正在准备一篇新帖子,里面有一些测量数据,之后会在这里放一个链接。你介意也看一下吗?提前谢谢。
Matrix minMatrix = new Matrix();
//height and width are set earlier.
Bitmap minBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas minCanvas = new Canvas(minBitmap);

int minwidth = bitmapMin.getWidth();  
int minheight = bitmapMin.getHeight();
int centrex = minwidth/2;
int centrey = minheight/2;

minMatrix.setRotate(mindegrees, centrex, centrey);
Bitmap newmin = Bitmap.createBitmap(minBitmap, 0, 0, (int) minwidth, (int) minheight, minMatrix, true);

minCanvas.drawBitmap(newmin, (centrex - newmin.getWidth()/2), (centrey - newmin.getHeight()/2), null);
minCanvas.setBitmap(minBitmap);