【问题标题】:Android canvas rotation: need to rotate *by* x degrees not *to* x degreesAndroid 画布旋转:需要旋转 *by* x 度而不是 *to* x 度
【发布时间】:2011-05-18 23:12:52
【问题描述】:

Canvas 中旋转方法的文档指出,degrees 参数是“旋转量,以度为单位”。但是,根据我的经验,这是具有误导性的。例如,如果我在位图处于规范直立方向(即 theta = 0,即 12:00)时调用 rotate(45),则位图会尽职地相对于 0 旋转 45 度。如果我再次调用要旋转(45),图像不会[似乎]移动。如果我随后调用 rotate(-45),则位图不会返回其原始方向,而是相对于 0 旋转 -45 度。换句话说,degrees 参数是绝对的(“旋转到 45 度” ),而不是文档所暗示的相对(“旋转 45 度”)。这正是我不想要的。

从给定的方向,我希望能够旋转我的位图 BY +/- x 度,其中 + 当然是顺时针旋转。我想,伪造这个的一种方法是在我旋转到“新 0”(即它有效地占据 12:00)的任何地方进行下一次旋转。我的问题是:我该怎么做,或者,有没有更好的方法来完成我想要的?

非常感谢。

【问题讨论】:

    标签: android rotation android-canvas


    【解决方案1】:

    一种简单的方法是将最后一个旋转存储为一个变量,并对其进行 +/- 下一个旋转 - 当然你不会超过 360 度。

    【讨论】:

    • 您可以使用简单的模数 360 运算符检查上限;)
    • @eric - 是的,非常好。没想到。
    • @dbryson:是的,这就是我已经在做的一种黑客行为。问题是我可能不得不超过 +/- 360。
    • @Urthas 我认为 canvas.rotate 以这种方式工作的一个原因是因为传感器服务为您提供了绝对旋转度数。至于您的问题的解决方案,我总是从最简单的事情开始:-)。这不一定是“黑客”。但我不明白你将如何超越 360。
    • 另一件事是我总是想要连续旋转之间的最小角度。所以,如果第一次旋转到 -170,第二次旋转到 170,我想逆时针旋转 20 度(即到 -190)而不是 |240|。你可能会认为它是无限多的度数。新职位仅在与旧职位的差异最小的情况下才重要。
    【解决方案2】:

    我认为canvas.setMatrix(canvas.getMatrix()) 将“保存”您所做的所有更改,从而在您旋转“新 0”的任何位置进行更改。但是 dbryson 的建议对于您提到的目的来说是经济的。

    【讨论】:

    • 这很有趣,我将不得不玩它。在对每个 dbryson &co 的缓存旋转进行了几个小时的黑客攻击之后,我仍然很难遇到我接近 +-360 然后超出的情况。要么我会解决这个问题,要么我会决定它比它绝对需要的更复杂。感谢大家的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2015-07-04
    相关资源
    最近更新 更多