【问题标题】:Simultaneous rotation, translation, and scaling of bitmap in android canvasandroid画布中位图的同时旋转、平移和缩放
【发布时间】:2012-05-04 09:24:48
【问题描述】:

我正在尝试展示一张图片,该图片可以缩放和平移,并且可以根据指南针读数进行旋转。使用下面的代码,所有三个操作都可以工作,但它们会相互影响。

这是我想要实现的目标:
1. 围绕屏幕中心旋转
2. 缩放使图片的同一部分居中
3.平移到图片中想要的位置

以下是以下代码实际发生的情况:
1. 旋转按预期工作,围绕屏幕中心
2. 缩放有效,但它围绕图片的中心进行缩放
3. 只有当angle 为零时,翻译才会按预期工作,否则会朝着错误的方向移动

// the center of the view port
float centerX = screen.right/2;
float centerY = screen.bottom/2;

Matrix m = new Matrix();
m.preRotate(angle, centerX, centerY);
m.preScale(mScaleFactor, mScaleFactor, centerX, centerY);

// scaling the amount of translation, 
// rotating the translation here gave crazy results
float x = mPosX / mScaleFactor;
float y = mPosY / mScaleFactor;
m.preTranslate(x, y);

canvas.drawBitmap(pic, m, null);

如果我先平移,然后再旋转,则平移会按预期进行,但旋转不再围绕视口中心。

我怎样才能应用所有三个转换而不相互影响?

【问题讨论】:

    标签: android matrix android-canvas


    【解决方案1】:

    我不确定图像中心周围的缩放比例,但至于平移方向错误,这不是因为您旋转图像而不是平移造成的吗?也许尝试这样的事情:

    float x = (mPosX*(cos(angle) + sin(angle)) / mScaleFactor;
    float y = (mPosY*(cos(angle) - sin(angle)) / mScaleFactor;
    m.preTranslate(x, y);
    

    矩阵对象也有直接应用affine transformation的方法吗?因为这样你就不需要考虑操作的顺序了。

    仿射变换可能如下所示:

    M = |mScaleFactor*cos(angle)       sin(angle)            x|
        |     -sin(angle)          mScaleFactor*cos(angle)   y|
        |          0                         0               1|
    

    但这将围绕图像的角落旋转,因此您需要先使用 preTranslate() 函数,如下所示:

    Mt.preTranslate(-centerX,-centerY);
    

    并在应用 M 之前将 Mt 应用于 pic,然后在您需要应用 -Mt 之后

    【讨论】:

    • 旋转平移似乎只是抵消了旋转,但我也觉得这就是我需要的。 Android 矩阵是 3x3,所以我猜它们已经是仿射变换了?
    • 所以也许尝试直接设置矩阵而不是使用那些 preRotate、preScale 方法?所以你的矩阵应该类似于上面帖子中的编辑
    • 使用这个矩阵,平移工作,但缩放也旋转图片,旋转也缩放图片,旋转发生在图片的一角。这就像 whac-a-mole,但感谢您的意见。
    • 缩放和旋转def不应该互相干扰,这很奇怪,你尝试过角度为0吗?还是有一个角度但 mScaleFactor = 1?至于拐角处的旋转,有道理,我再编辑一下。
    • 只有在 mScaleFactor=1 或 angle=0 的情况下,缩放和旋转才会不受干扰。否则我认为具有正确值的单个矩阵是解决此问题的正确方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 2011-10-22
    • 2015-03-17
    • 2018-11-10
    • 2014-02-24
    相关资源
    最近更新 更多