Matrix的preXxx,setXxx,postXxx方法执行顺序的区分
大家在android开发时,免不了用到Matrix这个类,其实就是一个操作矩阵的类。
其中包括pre系列方法:preScale,preTranslate,preRotate,preSkew,set系列方法:setScale,setTranslate,setRotate,setSkew,post系列方法:postScale,postTranslate,postRotate,postSkew,注意这些变换的原点都是(0,,0),就是左上角,(而我们一般希望的是以中心点为原点,这就需要一些setXxx,preXxx,postXxx组合操作)
调用里面的方法preXxx,setXxx,postXxx时,有时会发生混淆,分不清哪个会先执行,而且调用的顺序不对时,有时不会执行。下面来区分一下。
Matrix里面就好比维护者一个双端队列,当调用preXxx方法时,将该方法放入队列的顶端,(即每来一个preXxx方法就按照代码的书写顺序依次放入队列的顶端)
当调用setXxx方法时,清空当前队列,(如此说来,在setXxx之前调用的preXxx,postXxx都是无效的)
当调用postXxx方法时,将方法放入队列的末端,(即每来一个postXxx方法就按照代码的书写顺序依次放入队列的顶端)
因此大家一般使用时的代码是:先调用setXxx,再调用 preXxx,postXxx,(这里preXxx方法与postXxx的代码书写的先后顺序无所谓,但是setXxx必须是在两个方法之前调用)
其实,大家如果了解线性代数的话,preXxx就相当于左乘的矩阵,postXxxx就相当于右乘的矩阵。setXxx就相当于中间的源矩阵
举个例子:A*B*C,
代码: setXxx(x,y); | 这里的B:设置Matrix矩阵的值,
preXxx(x,y); | 这里的A:左乘矩阵
postXxx(x,y); | 这里的C:右乘矩阵
从矩阵的理论来讲,先计算B左乘A(即A*B),然后再将计算结果右乘C(即(A*B)*C)与先计算B右乘C(即B*C),然后再将计算结果左乘A(即A*(B*C))的结果是一样的。
从代码角度讲,先设置setXxx,然后不管先,再调用postXxx(右乘)效果为(A*B)*C,还是先调用postXxx(右乘),再调用preXxx(左乘),效果为A*(B*C),结果都是一样的。
(意思是说在setXxx之后,然后preXxx,postXxx的调用顺序是无关紧要的,)