Android自定义系列——12.Matri详解( 二 )


结果:
before: src=http://www.kingceram.com/post/[0.0, 0.0, 80.0, 100.0, 400.0, 300.0]before: dst=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]after : src=[0.0, 0.0, 80.0, 100.0, 400.0, 300.0]after : dst=[0.0, 0.0, 40.0, 100.0, 200.0, 300.0]
(3) void(float[] dst, int ,float[] src, int , int ) 可以指定只计算一部分数值 。
参数摘要
dst

Android自定义系列——12.Matri详解

文章插图

结果:
before: src=http://www.kingceram.com/post/[0.0, 0.0, 80.0, 100.0, 400.0, 300.0]before: dst=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]after : src=[0.0, 0.0, 80.0, 100.0, 400.0, 300.0]after : dst=[40.0, 100.0, 200.0, 300.0, 0.0, 0.0]
2.
float mapRadius (float radius)
测量半径,由于圆可能会因为画布变换变成椭圆,所以此处测量的是平均半径 。
示例:
float radius = 100;float result = 0;// 构造一个matrix,x坐标缩放0.5Matrix matrix = new Matrix();matrix.setScale(0.5f, 1f);Log.i(TAG, "mapRadius: "+radius);result = matrix.mapRadius(radius);Log.i(TAG, "mapRadius: "+result);
结果:
mapRadius: 100.0mapRadius: 70.71068
3.
boolean mapRect (RectF rect)boolean mapRect (RectF dst, RectF src)
测量矩形变换后位置 。
(1)(RectF rect) 测量rect并将测量结果放入rect中,返回值是判断矩形经过变换后是否仍为矩形 。
示例:
RectF rect = new RectF(400, 400, 1000, 800);// 构造一个matrixMatrix matrix = new Matrix();matrix.setScale(0.5f, 1f);matrix.postSkew(1,0);Log.i(TAG, "mapRadius: "+rect.toString());boolean result = matrix.mapRect(rect);Log.i(TAG, "mapRadius: "+rect.toString());Log.e(TAG, "isRect: "+ result);
结果:
mapRadius: RectF(400.0, 400.0, 1000.0, 800.0)mapRadius: RectF(600.0, 400.0, 1300.0, 800.0)isRect: false
由于使用了错切,所以返回结果为false 。
(2)(RectF dst, RectF src) 测量src并将测量结果放入dst中,返回值是判断矩形经过变换后是否仍为矩形,和之前没有什么太大区别,此处就不啰嗦了 。
4.
测量向量 。
void mapVectors (float[] vecs)void mapVectors (float[] dst, float[] src)void mapVectors (float[] dst, int dstIndex, float[] src, int srcIndex, int vectorCount)
与基本上是相同的,可以直接参照上面的使用方法 。
而两者唯一的区别就是不会受到位移的影响,这符合向量的定律
区别:
float[] src = http://www.kingceram.com/post/new float[]{1000, 800};float[] dst = new float[2];// 构造一个matrixMatrix matrix = new Matrix();matrix.setScale(0.5f, 1f);matrix.postTranslate(100,100);// 计算向量, 不受位移影响matrix.mapVectors(dst, src);Log.i(TAG,"mapVectors: "+Arrays.toString(dst));// 计算点matrix.mapPoints(dst, src);Log.i(TAG, "mapPoints: "+Arrays.toString(dst));
set、pre 与 post
对于四种基本变换 平移()、缩放(scale)、旋转()、 错切(skew) 它们每一种都三种操作方法,分别为 设置(set)、 前乘(pre) 和 后乘 (post) 。而它们的基础是,通过先构造出特殊矩阵然后用原始矩阵特殊矩阵,达到变换的结果 。
方法简介
set
设置,会覆盖掉之前的数值,导致之前的操作失效 。
pre
前乘,相当于矩阵的右乘,M’ = M * S (S指为特殊矩阵)
post
后乘,相当于矩阵的左乘,M’ = S * M (S指为特殊矩阵)
相关的重要知识:
1.一开始从中获取到到并不是初始矩阵,而是经过偏移后到矩阵,且偏移距离就是距离屏幕左上角的位置 。
这个可以用于判定View在屏幕上的绝对位置,View可以根据所处位置做出调整 。
2.构造时使用的是矩阵乘法,前乘(pre)与后乘(post)结果差别很大 。