Android 图形处理特效 Matrix 的set 、 pre、post方法的区别和使用
2016-07-09 20:52
567 查看
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); 不起作用)
三、
![](https://oscdn.geek-share.com/Uploads/Images/Content/201607/ab1379dc54bd6d5148712ffb66b0802e)
解释:
放大是pre,移动是post。先放大,然后移动到(200,200)。
四、
![](https://oscdn.geek-share.com/Uploads/Images/Content/201607/4c7dc8571cba5bdedcd7d900ff996f2f)
解释: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轴翻转
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轴翻转
相关文章推荐
- set 命令特殊用法
- C#模拟http 发送post或get请求的简单实例
- You must SET PASSWORD before executing this statement的解决方法
- 批处理 Set 命令详解 让你理解set命令第1/2页
- 在Ajax中使用get和post所遇到的问题及解决办法
- ASP中set与dim的区别(自己的理解)
- 深入C#中get与set的详解
- POST与GET方法的区别简要分析
- 简单谈谈GET和POST有什么区别
- sql Set IDENTITY_INSERT的用法
- C#使用post发送和接收数据的方法
- C#使用Matrix执行缩放的方法
- PHP响应post请求上传文件的方法
- VB使用XMLHTTP实现Post与Get的方法
- 分享下GET和POST的真正区别
- php采用ajax数据提交post与post常见方法总结
- ajax 的post方法实例(带循环)
- set_include_path在win和linux下的区别
- C#实现的三种模拟自动登录和提交POST信息的方法