内推
【长期有效】欢迎加入字节跳动我的团队:内推链接
Android中使用Matrix中心缩放时,经常看到这段代码.
matrix.setScale(interpolatedTime, interpolatedTime);
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
preTranslate是指在setScale前,平移,postTranslate是指在setScale后平移
注意他们参数是平移的距离,而不是平移目的地的坐标!
由于缩放是以(0,0)为中心的,所以为了把界面的中心与(0,0)对齐,就要preTranslate(-centerX, -centerY),
setScale完成后,调用postTranslate(centerX, centerY),再把图片移回来,这样看到的动画效果就是activity的界面图片从中心不停的缩放了。
注:centerX和centerY是界面中心的坐标
矩阵不满足交换率,先乘与后乘的区别。如:
矩阵:
kMScaleX, kMSkewX, kMTransX,
kMSkewY, kMScaleY, kMTransY,
kMPersp0, kMPersp1, kMPersp2
1.matrix.preScale(0.5f, 1);
2.matrix.preTranslate(10, 0);
3.matrix.postScale(0.7f, 1);
4.matrix.postTranslate(15, 0);
等价于:
translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0)
注意:后调用的pre操作先执行,而后调用的post操作则后执行。
set方法一旦调用即会清空之前matrix中的所有变换,例如:
1.matrix.preScale(0.5f, 1);
2.matrix.setScale(1, 0.6f);
3.matrix.postScale(0.7f, 1);
4.matrix.preTranslate(15, 0);
等价于
translate(15, 0) -> scale(1, 0.6f) -> scale(0.7f, 1)
matrix.preScale (0.5f, 1)将不起作用。
再如:
Matrix的初始值:
[sx, k1, 0]
[k2, sy, 0]
[0, 0, 1]
setTranslate(2, 3)后:
[sx, k1, 2]
[k2, sy, 3]
[0, 0, 1]
上面set后,再preTranslate(4, 5):
[sx, k1, 2][1, 0, 4] [sx, k1, sx*4+k1*5+2]
[k2, sy, 3][0, 1, 5]= [k2, sy, k2*4+sy*5+3]
[0, 0, 1][0, 0, 1] [0, 0, 1]
上面set后,再postTranslate(4, 5)后:
[1, 0, 4][sx, k1, 2] [sx, k1, 2+4]
[0, 1, 5][k2, sy, 3]= [k2, sy, 5+3]
[0, 0, 1][0, 0, 1] [0, 0, 1]
在此推荐blog:
http://geek.csdn.net/news/detail/89873