Matrix类
顾名思义,名字为矩阵。
但是在这里是对自定义View的一个强大工具。
首先在绘制方面,拥有缩放scale
、平移translate
、旋转rotate
、错切skew
操作,主要就是对矩阵的数值进行改变。参考文章:具体概念点这里。
在学习了过后,首先需要知道矩阵是什么?就是一个n*m的行列式(通俗点)。
但是在线性代数里面,它叫:矩阵。
所以,这里我们有用到线性代数的知识。
咳咳,扯远了,关于线性代数的知识详情请找度娘。
方法:讲道理,一般情况都会有set,get方法,但是矩阵这里有一个前乘,后乘的存在。
Matrix方法表
方法类别 | 相关API | 摘要 |
---|---|---|
基本方法 | equals hashCode toString toShortString | 比较、 获取哈希值、 转换为字符串 |
数值操作 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值 |
数值计算 | mapPoints mapRadius mapRect mapVectors | 计算变换后的数值 |
设置(set) | setConcat setRotate setScale setSkew setTranslate | 设置变换 |
前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘变换 |
后乘(post) | postConcat postRotate postScale postSkew postTranslate | 后乘变换 |
特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 |
矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 … |
这里主要讲一下数值计算、特殊方法。
数值计算
mapPoints();
重构方法如下
public void mapPoints(float[] pts); public void mapPoints(float[] dst, float[] src) public void mapPoints(float[] dst, int dstIndex, float[] src, int srcIndex, int pointCount)
第一个是对点进行计算,并且将计算后的值赋给pts;
第二个是对src进行计算,计算后的值赋给dst,src的值不变;
第三个是通过下标进行点的计算,注意是下标,不是第几个点。
例如:float[] src = new float[]{0, 0, 80, 100, 400, 300}; float[] dst = new float[6]; // 调用map方法计算(最后一个2表示两个点,即四个数值,并非两个数值) matrix.mapPoints(dst, 0, src, 2, 2);
每个的计算都是
matrix.preXXX()
ormatrix.postXXX()
操作后进行mapPoints
得到的值。mapRadius();
float mapRadius (float radius)
测量半径,由于圆可能会因为画布变换变成椭圆,所以此处测量的是平均半径。
实例
float radius = 100; float result = 0; // 构造一个matrix,x坐标缩放0.5 Matrix matrix = new Matrix(); matrix.setScale(0.5f, 1f); Log.i(TAG, "mapRadius: "+radius); result = matrix.mapRadius(radius); Log.i(TAG, "mapRadius: "+result);
结果:
mapRadius: 100.0 mapRadius: 70.71068
注意,是平均值,可以想象一下,一个矩形宽缩小了一半,高不变,得到的结果是,圆变成了内切的椭圆。
- mapRect 和 mapVector用用看看值的数值理解。
特殊方法
setPolyToPoly
主要的参数如下:boolean setPolyToPoly ( float[] src, // 原始数组 src [x,y],存储内容为一组点 int srcIndex, // 原始数组开始位置 float[] dst, // 目标数组 dst [x,y],存储内容为一组点 int dstIndex, // 目标数组开始位置 int pointCount) // 测控点的数量 取值范围是: 0到4
这是一个常用的方法,可以实现一些emmm类似于3d(自我感觉)的效果譬如:(搬运工)
主要的概念看这里setPolyToPoly
setRectToRect
boolean setRectToRect (RectF src, // 源区域 RectF dst, // 目标区域 Matrix.ScaleToFit stf) // 缩放适配模式
简单来说就是将源矩形的内容填充到目标矩形中,然而在大多数的情况下,源矩形和目标矩形的长宽比是不一致的,到底该如何填充呢,这个填充的模式就由第三个参数 stf 来确定。
ScaleToFit 是一个枚举类型,共包含了四种模式:
CENTER
居中,对src等比例缩放,将其居中放置在dst中。START
顶部,对src等比例缩放,将其放置在dst的左上角。END
底部,对src等比例缩放,将其放置在dst的右下角。FILL
充满,拉伸src的宽和高,使其完全填充满dst。
-其他方法请自我了解点击