寻找有关Matrix对象中post/pre/set Translate的解释以及如何使用它们的说明。

70

这些方法的使用实际上会发生什么,文档并没有很清楚地说明。有人可以解释一下Matrix如何影响设置为其的位图吗?他们在其中使用了连接术语,但我不清楚该术语如何应用于坐标数据(之前只在字符串操作中使用过)。

1个回答

163

set 方法将用新值替换当前矩阵,忽略之前矩阵中包含的内容; pre 和 post 方法将在当前矩阵内容之前或之后应用新变换。

在此示例中,由于使用了 set 方法,因此旋转将被忽略,m 仅包含一个平移:

Matrix m = new Matrix();

m.setRotate(90);

m.setTranslate(100, 100);

在此示例中,最终矩阵将是一次平移后跟随一次旋转:

Matrix m = new Matrix();

m.setTranslate(100, 100);

m.postRotate(90);

在最后一个示例中,最终矩阵将是一次旋转后跟随一次平移:

Matrix m = new Matrix();

m.setTranslate(100, 100);

m.preRotate(90);

此(相当冗长的)文章中还有更多信息:

https://medium.com/a-problem-like-maria/understanding-android-matrix-transformations-25e028f56dc7

希望对您有帮助。


2
这个答案中加入一些关于坐标使用的评论会非常好。例如,“旋转后跟随平移”是相当明显的,但在x和y轴方面如何实现呢?如何围绕物体的中心点而不是坐标原点进行旋转? - RichieHH
2
问题是关于pre/post/set方法之间的区别。API文档对每个转换的不同变体非常清晰。当然,当您以不同的顺序应用转换时,参数值会产生一些影响,但这有点偏离主题。 - Albin
这非常有帮助,我认为安卓开发团队应该将其包含在他们的文档中。 - tim687
3
链接已过时,请使用此链接:https://medium.com/a-problem-like-maria/understanding-android-matrix-transformations-25e028f56dc7。The link is out-dated. Use this one: https://medium.com/a-problem-like-maria/understanding-android-matrix-transformations-25e028f56dc7. - Johann
@Albin 与设置方法不同,前置和后置方法返回布尔值,而文档没有说明它是什么以及其含义,有任何想法吗? - SMMH
@SMMH 不确定,但我猜它表示组合是否成功。我认为相关代码可以在这里找到:https://android.googlesource.com/platform/external/skia/+/76f9e93/src/core/SkMatrix.cpp#634 - Albin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接