Android Matrix

本文详细解析了如何利用Matrix进行图片的平移、缩放等操作,并深入探讨了set、pre、post方法的区别及其调用顺序对图像处理的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用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)

### Android Matrix 类的使用方法和属性介绍 #### 3×3 矩阵结构 在Android图形API中,`Matrix`类提供了一个3×3的矩阵坐标体系。这个矩阵主要用于处理图像的各种几何变换操作,比如旋转、平移以及缩放等[^2]。 #### 常见的操作函数及其功能描述 - **setScale(float sx, float sy)** 设置新的缩放比例因子sx,sy分别代表X轴方向上的拉伸/压缩程度,Y轴同理;当参数小于1表示缩小大于则放大对象尺寸大小不变即保持原样显示[^5]。 ```java Matrix matrix = new Matrix(); matrix.setScale(0.5f, 1f); ``` - **postTranslate(float dx,float dy)** 追加一个沿指定距离dx,dy移动的效果到当前已存在的转换序列之后执行;此过程不会覆盖之前的任何变化而是依次叠加起来形成最终视觉呈现效果. ```java matrix.postTranslate(100, 100); ``` - **mapVectors(float[] dst, float[] src)** 计算源数组中的向量经过变换后的结果并存储于目标数组dst内。注意这里的映射不受到位置偏移的影响只改变方向长度而不涉及具体坐标的变动. ```java float[] src = {1000, 800}; float[] dst = new float[2]; matrix.mapVectors(dst, src); ``` - **mapPoints(float[] dst, float[] src)** 类似于上面提到的方法不过这次是对实际点的位置做同样的线性代数运算从而得出新坐标值存入目的容器之中. ```java matrix.mapPoints(dst, src); ``` 对于`ImageView`组件而言,除了上述通用接口外还特别支持通过调整其`ScaleType`属性配合自定义`Matrix`实例完成更加灵活多样的展示方式尤其是针对那些需要实时响应触摸事件来进行交互式的查看大图场景非常有用处[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值