Matrix学习1、基础的知识
在android.graphics包下面的Matrix(矩阵)类,是Android提供的一个工具类,专门用来进行图像的处理。关于矩阵的基本知识和加减乘除运算这里不再赘述,需要了解的可以看看线性代数有关知识(http://course.tjau.edu.cn/xianxingdaishu/jiao/2.htm)。
下面是Matrix的介绍:
/**
* The Matrix class holds a 3x3 matrix for transforming coordinates. Matrix does
* not have a constructor, so it must be explicitly initialized using either
* reset() - to construct an identity matrix, or one of the set..() functions
* (e.g. setTranslate, setRotate, etc.).
* Matrix类通过一个3*3的矩阵来改变坐标。Matrix并没有矩阵的构造器,因此它必须显示的初始化,使用reset()来构造一个对角的
* 矩阵,或者使用set***()(下面几个函数setTranslate,setRotate等等)
*/
查看Matrix源码,最开始deep部分有9个静态的常量
public static final int MSCALE_X = 0; // !< use with getValues/setValues
public static final int MSKEW_X = 1; // !< use with getValues/setValues
public static final int MTRANS_X = 2; // !< use with getValues/setValues
public static final int MSKEW_Y = 3; // !< use with getValues/setValues
public static final int MSCALE_Y = 4; // !< use with getValues/setValues
public static final int MTRANS_Y = 5; // !< use with getValues/setValues
public static final int MPERSP_0 = 6; // !< use with getValues/setValues
public static final int MPERSP_1 = 7; // !< use with getValues/setValues
public static final int MPERSP_2 = 8; // !< use with getValues/setValues
可以看到,这是一个0-8的9个静态常量,实际上,每个常量就代表他在一个长度为9的一维数组中的位置。更准确的理解,应该说是它们在一个3*3的矩阵中的位置,这也是为什么这个类叫做Matrix的原因。
其中 MSCALE_X和MSCALE_Y分别是控制X轴和Y轴方向的缩放,MSKEW_X和MSKEW_Y是分别控制X坐标和Y坐标的扭曲系数,MTRANS_X和MTRANS_Y则是控制X方向和Y方向的线性平移。MPERSP_0、MPERSP_1和MPERSP_2是关于透视的控制。
所以,对于Matrix的操作,其实都是对这9个值的操作。下面看MAtrix的公共方法
public Matrix()//构造方法,初始化一个对角矩阵
public Matrix(Matrix src)//构造方法
public boolean equals(Object obj)//判断一个对象是不是Matrix,并且和它是不是有相当的值,也就是对9个值的比较
public void getValues(float[] values) //将matrix的9个值复制到这个数组中
public void setValues(float[] values)//将数组中的值复制到matrix中。
public boolean invert(Matrix inverse)//
public boolean isIdentity()//判断这个matrix是不是对角矩阵的
public void mapPoints(float[] pts)//应用这个matrix对这个数组中代表的2D点进行变换,变换的结果的点的信息依旧写入到这个数组中
public void mapPoints(float[] dst, float[] src)//应用这个matrix对这个数组src中代表的2D点进行变换,变换的结果的点的信息写入到dst数组中
public void mapPoints(float[] dst, int dstIndex, float[] src, int srcIndex, int pointCount)//应用这个matrix对这个数组src中代表的2D点进行变换,变换的结果的
点的信息写入到dst数组中
public float mapRadius(float radius)
public boolean mapRect(RectF rect)//将这个matrix应用与一个矩阵,矩阵的信息依旧写入到它自己中。通过设置矩阵的4个顶点来完成设置
public boolean mapRect(RectF dst, RectF src)//将这个matrix应用与一个矩阵src,矩阵的信息依旧写入dts矩阵中。通过设置矩阵的4个顶点来完成设置
public void mapVectors(float[] vecs)//将这个matrix应用与一个代表2D向量的数组,得到的向量依旧写入到这个数组中
public void mapVectors(float[] dst, float[] src)//将这个matrix应用与一个代表2D向量的数组src,得到的向量写入到这个数组dst中
public void mapVectors(float[] dst, int dstIndex, float[] src, int srcIndex, int vectorCount)//将这个matrix应用与一个代表2D向量的数组src,得到的向量写入到
这个数组dst中
public boolean preConcat(Matrix other)//将matrix与指定的另一个matrix组合,M'=other*M
public boolean postRotate(float degrees) //将matrix与指定的另一个rotation(旋转角度)组合,M' = R(degrees) * M
public boolean postRotate(float degrees, float px, float py)//将matrix与指定的另一个rotation(旋转角度)组合,M' = R(degrees, px,py) * M
public boolean postScale(float sx, float sy)//将matrix与指定的另一个scale(缩放比)组合,M' = S(sx, sy) * M
public boolean postScale(float sx, float sy, float px, float py)//将matrix与指定的另一个scale(缩放比)组合,M' = S(sx, sy, px, py) *M
public boolean postSkew(float kx, float ky)//将matrix与指定的另一个skew(扭曲)组合,M' = K(kx, ky) * M
public boolean postSkew(float kx, float ky, float px, float py)//将matrix与指定的另一个skew(扭曲)组合,M' = K(kx, ky, px, py) *M
public boolean postTranslate(float dx, float dy) //将matrix与指定的另一个translation(位移)组合,M' = T(dx, dy) * M
public boolean preSkew(float kx, float ky)//将matrix与指定的另一个skew(扭曲)组合M' = M * K(kx, ky)
public boolean preSkew(float kx, float ky, float px, float py)//将matrix与指定的另一个skew(扭曲)组合,M' = M * K(kx, ky, px, py)
public boolean preRotate(float degrees)//将matrix与指定的另一个rotation(旋转角度)组合,M' = M * R(degrees)
public boolean preRotate(float degrees, float px, float py)//将matrix与指定的另一个rotation(旋转角度)组合,M' = M * R(degrees,px, py)
public boolean preScale(float sx, float sy)//将matrix与指定的另一个scale(缩放比)组合,M' = M * S(sx, sy)
public boolean preScale(float sx, float sy, float py)//将matrix与指定的另一个scale(缩放比)组合,M' = M * S(sx, sy, px,
public boolean preTranslate(float dx, float dy)//将matrix与指定的另一个translation(位移)组合,M' = M * T(dx, dy)
public void set(Matrix src)//将矩阵src复制到当前matrix,如果src代表的矩阵是null,那么就将当前的matrix设置为对角矩阵
public void reset()//重新将一个矩阵设置为对角矩阵
public void setTranslate(float dx, float dy)//设置一个matrix的translation(位移)
public void setScale(float sx, float sy, float px, float py)//设置matrix的scale(缩放比 sx,sy),以点(px,py)为中心
public void setScale(float sx, float sy)//设置matrix的scale(缩放比 sx,sy)
public void setRotate(float degrees) //设置matrix的rotation(旋转度)
public void setRotate(float degrees, float px, float py)//设置matrix的rotation(旋转度),以点(px,py)为中心
public void setSinCos(float sinValue, float cosValue)//以指定的正弦和余弦设置matrix的rotation(旋转度)
public void setSinCos(float sinValue, float cosValue, float px, float py) //以指定的正弦和余弦设置matrix的rotation(旋转度),以点(px,py)为中心
public void setSkew(float kx, float ky)//设置matrix的扭曲度
public void setSkew(float kx, float ky, float px, float py)//设置matrix的扭曲度,以点(px,py)为中心
public boolean setConcat(Matrix a, Matrix b)//设置两个matrix的组合,this=a*b
public boolean rectStaysRect()
public boolean setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex,int pointCount)//设置一个matrix,可以使数组src中的点转换到dst中的点
public boolean setRectToRect(RectF src, RectF dst, ScaleToFit stf) //设置一个matrix,可以使矩阵src转换成dst
可以看到,Android封装好的方法中,一切的操作都是变向的设置3*3矩阵中的9个值,然后,我们间接的利用这些值来进行变换。