android图片裁剪拼接实现(一):Matrix基本使用

一、前文

  之前有个朋友委托我实现一个图片拼接的组件,感觉挺有意思,于是周末花了些时间去研究了下,其实拼接这一步并不难,但是我在研究中发现了Matrix这个东西,非常好的东西。为此,我竟然拾起了多年没有动过的线性代数。

二、原理

  要彻底搞懂matrix还是需要一定的线性代数上面的理解,不过对于基本使用,了解到矩阵乘法就足够了。

  在android坐标系中,分为x、y和z三个轴,分别代表了长、宽、高三个维度。如下图所示

android坐标系


  在android中,使用三维坐标(x,y,z)组成一个行列式与一个三阶行列式进行矩阵乘法。

矩阵乘法


  图中显示的使用初始坐标组成的矩阵与单位矩阵进行矩阵乘法。矩阵乘法使用可以参考矩阵乘法

  Martix会把输入进来的矩阵带入到其内部的矩阵中进行计算,最终输出新的矩阵,来达到对图形形态的处理。

三、基本方法的使用

  Matrix提供的基本方法有三种模式,

1. setXXX()方法,例如 setRotate(),setScale()
2. preXXX()方法,例如 preRotate(),preScale()
3. postXXX()方法,例如 postRotate(),postScale()


其中,setXXX()会先将矩阵重置为单位矩阵,然后再进行矩阵变幻

preXXX()和postXXX()方法会牵扯到矩阵的前乘和后乘,如果了解了矩阵乘法规则,就会明白矩阵前乘和后乘得出来的结果是不一样的,不过一般情况下都会选择使用post方法,后乘。

其中还有扩展方法比如:

1. mapRect(rect) / mapRect(desRect,orgRect)

  第一个方法即使用原始矩阵代入运算,会将返回的矩阵直接覆盖在传入的矩阵中

  第二个方法则是对于需要保存原始矩阵的情况下,会把原始矩阵的计算结果赋值到指定的矩阵中
2. setRectToRect(src,des,stf)

  这个方法相当于将原始矩阵填充到目标矩阵中,所以也就要求两个矩阵都是有值的。其中填充模式由第三个参数决定。
java
/**
* 独立缩放X和Y,直到和src的rect和目标rect确切的匹配。这可能会改变原始rect的宽高比
*/
FILL(0),
/**
* 在保持原有宽高比的情况下计算出一个合适的缩放比例,但也会确保原始rect合适的填入目标rect,
* 最终会把开始的一个边与目标的开始边左边对齐
*/
START(1),
/**
* 与START类似,不过最终结果会尽可能居中
*/
CENTER(2),
/**
* 与START类似,不过最终结果会尽可能靠右边
*/
END(3);

3. invert(inverse)

  反转矩阵,可以应用到类似倒影一类的实现中
4. setPolyToPoly(src,srcIndex,dst,dstIndex,pointCount)
  这是一个比较神奇的方法。随着pointCount点数量,可以对原始矩阵进行平移、旋转、错切、翻页效果。功能非常强大。



此外,关于Matrix还有颜色变幻等效果,更多扩展用法后面会讲到。

四、实践到自定义view中

  写一个自定义view,最重要的是要了解view的绘制过程。简单的绘制流程如下

view绘制流程


其中不带on的方法都为调度方法,不可被重写,这些方法里面会把前期一些必要的数据准备出来,带on前缀的方法都是实际进行处理的方法。

measure方法是测量控件大小的,layout是用来布局,根据measure测量的结果,把其中每个元素在其内部进行位置的计算。最后会执行的draw方法,draw也分为draw和onDraw,可以根据自己需求来改写对应的方法。

其中,onMeasure的方法如下所示:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值