Android Matrix

利用Matrix实现了图片的平移(Translate)是将坐标系进行了平移么?不是的。Matrix所操作的是原图的每个像素点,它和坐标系是没有关系的。比如Scale是对每个像素点都进行了缩放,例如:

matrix.postScale(0.5f, 0.5f);

将原图的每个像素点的X的坐标都缩放成了原本的0.5
将原图的每个像素点的Y坐标也都缩放成了原本的0.5

同样的道理在调用matrix.setTranslate( )时是对于原图中的每个像素都执行了位移操作。

在使用Matrix时经常用到一系列的set,pre,post方法。它们有什么区别呢?它们的调用顺序又会对实际效果有什么影响呢?

在此对该问题做一个总结:
在调用set,pre,post时可视为将这些方法插入到一个队列。

pre表示在队头插入一个方法
post表示在队尾插入一个方法
set表示清空队列
队列中只保留该set方法,其余的方法都会清除。
当执行了一次set后pre总是插入到set之前的队列的最前面;post总是插入到set之后的队列的最后面。
也可以这么简单的理解:
set在队列的中间位置,per执行队头插入,post执行队尾插入。
当绘制图像时系统会按照队列中从头至尾的顺序依次调用这些方法。
请看下面的几个小示例:

Matrix m = new Matrix();
m.setRotate(45); 
m.setTranslate(80, 80);

只有m.setTranslate(80, 80)有效,因为m.setRotate(45)被清除.

Matrix m = new Matrix();
m.setTranslate(80, 80);
m.postRotate(45);

先执行m.setTranslate(80, 80)后执行m.postRotate(45)

Matrix m = new Matrix();
m.setTranslate(80, 80);
m.preRotate(45);

先执行m.preRotate(45)后执行m.setTranslate(80, 80)

Matrix m = new Matrix();
m.preScale(2f,2f);    
m.preTranslate(50f, 20f);   
m.postScale(0.2f, 0.5f);    
m.postTranslate(20f, 20f);  

执行顺序:
m.preTranslate(50f, 20f)–>m.preScale(2f,2f)–>m.postScale(0.2f, 0.5f)–>m.postTranslate(20f, 20f)

Matrix m = new Matrix();
m.postTranslate(20, 20);   
m.preScale(0.2f, 0.5f);
m.setScale(0.8f, 0.8f);   
m.postScale(3f, 3f);
m.preTranslate(0.5f, 0.5f); 

执行顺序:
m.preTranslate(0.5f, 0.5f)–>m.setScale(0.8f, 0.8f)–>m.postScale(3f, 3f)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值