Martix和Camera
Android动画中经常会用到Camera和Matrix类,下面是我学习中的一些理解
1. Martix
Matrix包含一个3*3的矩阵,专门用于图像变换匹配。Matrix提供了四种操作:
translate(平移)
rotate(旋转)
scale(缩放)
skew(倾斜)
也就是说这4种操作都是对这个3 X 3的矩阵设值来达到变换的效果。下面来看一下pre、post、set的区别
1) preXXX
(左乘)在队列最前面插入,即不管前面有几个操作,都将其插入到第一个
2) setXXX
()先清空队列在添加(这也是上文提到的“Matrix没有结构体,它必须被初始化,通过reset或set方法”的原因)
3) postXXX
(右乘)在队列最后面追加
例如下列代码:
A-> matrix.preScale(2f,1f); 此时的队列为:A
B-> matrix.preTranslate(5f, 0f); 此时的队列为:B A
C-> matrix.postScale(0.2f, 1f); 此时的队列为:B A C
D-> matrix.postTranslate(0.5f, 0f); 此时的队列为:B AC D
执行顺序是:B-> A-> C ->D
再比如:
A-> matrix postTranslate(2f,0f); 此时的队列为:A
B-> matrix.preTranslate(5f, 0f); 此时的队列为:B A
C-> matrix.setScale(0.2f, 1f); 此时的队列为:B(注意set会清除之前的内容)
D-> matrix.postTranslate(0.5f,0f); 此时的队列为:B D
E-> matrix.preTranslate(0.5f, 0f); 此时的队列为:E B D
执行顺序是:E->B->D
2. Camera
Camera在android.graphics包下,与手机的硬件照相机不一样,这个类是一个对图形操作的辅助类,Camera本身并不能对视图产生效果,Camera的作用是产生一个Matrix,让这个Matrix作用于Bitmap或者是Canvas上才能产生相应的效果。
1) Camera与Matrix的比较:
a) Camera的rotate()相关方法是指定某一维度(x、y、z轴)上旋转指定的角度。
b) Matrix的rotate()相关方法实现的效果是顺时针旋转指定的角度;与Camera指定Z轴旋转效果相同,但方向相反。
c) Camera的translate()方法根据某一维度上视点的位移实现图像的缩放,与Matrix的scale()相关方法作用效果相似,只是Matrix的scale()相关方法是直接指定缩放比例。
d) Camera不支持倾斜操作,Matrix可以直接实现倾斜操作。
2) 使用方式:
a) Camera.save()保存当前状态,可以将图像过渡得柔和一些
b) 进行相应的操作并获得相应的Matrix作用到对象上,产生效果
c) Camera.restore()还原状态
参考资料:http://blog.csdn.net/lonelyroamer/article/details/8264189