结果:
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
文章插图
结果:
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)结果差别很大 。
- 大厂架构师经验分享!Android-性能优化最佳实践
- 【iOS】自定义cell及其复用机制
- 动画:《大前端吊打面试官系列》 之原生 JavaScript 精华篇
- 已经测试过 2018年android融云客服接入流程不清楚的话
- 中东土豪肩上的猎隼值多少钱?一套房子价/奇趣自然 世界之最系列游隼
- 10天拿到字节跳动安卓岗位offer,腾讯Android开发岗
- 长安CS系列的第二大功臣,CS55PLUS贡献了不少销量 吉尼斯记录长安cs55
- Android 开发面试中,面试官最喜欢问那些问题?
- 字节跳动Android研发岗这些知识点内部泄露出来了,帮你突破瓶颈
- Android中 Alertdialog对话框点击消失?