1.简介
Matrix是谷歌提供的可以方便操作3*3放射矩阵的类,矩阵如下图所示:
可以清晰的看到矩阵的各个位置上的元素的作用,最常用的就是1和5的scale 和 3和6的translate,剩下的是2和4的错切,最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1)。
2.Matrix常用方法
2.1赋值相关
1.void set (Matrix src) //将参数Matrix的数值复制到当前Matrix中
2.void reset () //重置当前Matrix(将当前Matrix重置为单位矩阵)
3.boolean invert (Matrix inverse)//求逆矩阵
2.2缩放,平移等操作
public void setTranslate(float dx, float dy)
public void setScale(float sx, float sy, float px, float py)//sx,sy代表了缩放的倍数,px,py代表缩放的中心
public void setScale(float sx, float sy)
public void setRotate(float degrees, float px, float py)
public void setRotate(float degrees)
public void setSkew(float kx, float ky, float px, float py)//错切
public void setSkew(float kx, float ky)
2.3数值计算相关
1.void mapPoints (float[] pts) //方法仅有一个参数,pts数组作为参数传递原始数值,计算结果仍存放在pts中。
2.void mapPoints (float[] dst, float[] src)//src作为参数传递原始数值,计算结果存放在dst中,src不变。
3.boolean mapRect (RectF rect) //测量rect并将测量结果放入rect中,返回值是判断矩形经过变换后是否仍为矩形。
4.boolean mapRect (RectF dst, RectF src) //测量src并将测量结果放入dst中
// 简单使用
//需求1:有原始的数组[1.f,2.f,3.f],在canvas放大3倍,然后沿x轴正方向移动100px,获取该数组映射到canvas上的数值
float[] src = [1f,2f,3f];
//1.创建一个单位矩阵
Matrix matrix = new Matrix();
//2.放大3倍,平移100px
matrix.setScale(3.f,3.f);
matrix.setTanslate(100,0);
//获得[1.f,2.f,3.f]映射到该矩阵的值
matrix.mapPoints(src);
//需求2:使用一下mapRect
mapRect就不写了,使用和上面差不多,在MPAndroidChart中主要就是柱形图会用到
2.4矩阵相乘
数学定律:
矩阵乘法不满足交换律,即 AB ≠ BA
矩阵乘法满足结合律,即 (AB)C = A(BC)
api中包含前乘(prexxx)和后乘(postxxx)两种,使用的时候我们不必去管前乘和后乘,比如我们全用pre或者post,只关注我们是要先缩放还是先平移。
Matrix matrixPre = new Matrix();
matrixPre.preScale(0.5f,0.5f);
matrixPre.preTranslate(100,100);
Log.e("matrixPreResult",matrixPre.toShortString());
Matrix matrixPost = new Matrix();
matrixPost.postScale(0.5f,0.5f);
matrixPost.postTranslate(100,100);
Log.e("matrixPostResult",matrixPost.toShortString());
这两者的结果是不一样的,打印结果如下
matrixPreResult: [0.5, 0.0, 50.0][0.0, 0.5, 50.0][0.0, 0.0, 1.0]
matrixPostResult:[0.5, 0.0, 100.0][0.0, 0.5, 100.0][0.0, 0.0, 1.0]
全用一种乘法,在实际问题中可以根据需求调整顺序,第一种写法影响了平移的距离,第二种没有影响,原因如何写一下公式计算一下就知道了。
其实规律也很简单,因为矩阵中各个位置上的元素代表的含义都是固定的,比如我们我们计算tranX的时候,必然是第一行乘以第三列,如果我们的tanMatrix的第一行是[1,0,100],scaleMatrix第三列中没有位移是[0,0,1],scale因素就不会起作用,如下所示:
[1,0 ,100] [0.5,0 ,0] [0.5, 0.0, 100.0]
[0,1 ,100] * [0,0.5 ,0] = [0.0, 0.5, 100.0]
[0 ,0 ,1] [0 ,0 ,1] [0.0, 0.0, 1.0]
2.5打印矩阵
1.toString() //将Matrix转换为字符串: Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}
2.toShortString() //[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]