Android 图形处理特效 Matrix 的set 、 pre、post方法的区别和使用

Android 图形处理特效 Matrix 的set 、 pre、post方法的区别和使用

Matrix包含一个3 X 3的矩阵,专门用于图像变换匹配。


Matrix提供了四种操作:
translate(平移)
rotate(旋转)
scale(缩放)

skew(错切)

pre是在队列最前面插入,post是在队列最后面追加,而set先清空队列在添加。


下面通过一些例子具体说明:
一、

matrix.preScale(2f,1f); 
matrix.preTranslate(5f, 0f); 
matrix.postScale(0.2f, 1f); 
matrix.postTranslate(0.5f, 0f); 


执行顺序:translate(5, 0) -> scale(2f, 1f) -> scale(0.2f, 1f) -> translate(0.5f, 0f)


二、
matrix.postTranslate(2f, 0f); 
matrix.preScale(0.2f, 1f); 
matrix.setScale(1f, 1f); 
matrix.postScale(5f, 1f); 
matrix.preTranslate(0.5f, 0f); 

执行顺序:translate(0.5f, 0f) -> scale(1f, 1f) -> scale(5f, 1)  执行了setScale后,前面两句设置的矩阵变化就不起作用了。

matrix.postTranslate(2f, 0f);  matrix.preScale(0.2f, 1f); 不起作用



三、

       matrix.preScale(2,2);
       matrix.postTranslate(200, 200);
效果图(图中画了四条线作为参考,200、400线)

解释:

放大是pre,移动是post。先放大,然后移动到(200,200)。


四、

        matrix.postScale(2,2);
        matrix.preTranslate(200, 200);
效果图:

解释:pre 先执行,再执行post 。所以是先平移到(200,200),再放大一倍。 明明跟样例三,一个是先放大,一个是先移动。为啥差距这么大。

可以这么理解。先平移到了(200,200)。’然后进行放大一倍。但是这个放大。是将整个画布,或者是坐标系都放大了,所以到达了(400,400)坐标处。


五、

matrix.setScale(-1, 1);  
matrix.postTranslate(bmp.getWidth(),0); 


这是一种特殊的缩放变换。X为负数,则表示以X轴翻转后,再进行缩放。

注意: 没有Translate,只有matrix.setScale(-1,1)。 图像会翻转到X轴返方向。会看不到图像。

Translate 最好用 postTranslate 。  如果用了setScale  和  preTranslate ,是不会看到图像的。理解:因为是preTranslate,会将图像先平移,距离X轴一段距离。然后再将图像沿X轴翻转。然后再放大(整体放大,包括刚才的平移的距离。)导致图像离X的负半轴更远。


matrix.setScale(1, -1);  
matrix.postTranslate(0, bmp.getHeight());  
沿Y轴翻转



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值