matrix pre、post和set的区别

Posted by alonealice on 2016-10-10

在使用matrix过程中,我们经常要使用到rotate、scale、translate等变换。Matrix实现这些变换的方法有3个,preXX,postXX和setXX。这个方法单用一次,你会发现实际的效果都是一样的,但是如果你多次使用或者组合使用,所出来的效果可能就完全不同了。那到底这三者有什么不同呢?
pre操作从字面上就可以看到是先执行,post操作是按顺序执行,set操作是清除执行。
很多文章在将这个时也都只是这么说的,但是想我这样理解能力比较差的人看的一头雾水,不是很清除。
其实简单的说,post是按程序语句执行的顺序执行变换,先写的先变,后写的后变;pre是将该操作放到所有的操作的栈顶,后写的先执行;而set最直接,它会将之前所有的操作清除,在执行它。无论是一种单一的操作,还是几种操作混合都是一样的。
也许你还是不是很明白,那我就来举个列子:

1
2
3
4
5
6
7
matrix.postScale(2,2);(1)
matrix.preRotate(60,115,115);(2)
matrix.postRotate(-30,230,230);(3)
matrix.preRotate(-60,115,115);(4)
matrix.preRotate(60,115,115);(5)
matrix.preRotate(-60,115,115);(6)
matrix.postRotate(30,230,230);(7)

这些操作看起来很复杂,但其实你只要按照上面的原则,就非常清晰。所有的pre操作都会把该操作放到最前执行,越后面越靠前执行,所以先不用看post操作,这样执行顺序是6->5->4->2,执行完pre后才会执行post,而post是按顺序执行,所以最终的是6->5->4->2->1->3->7。