From 81f66e9e37f26840d4efbbe4b5321078dce1fe85 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 30 Aug 2016 03:21:34 +0800 Subject: [PATCH] Update --- CustomView/Advance/[10]Matrix_Method.md | 46 ++++++++++++++++--------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index f59d44b..d227a65 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -410,14 +410,14 @@ boolean setPolyToPoly ( int srcIndex, // 原始数组开始位置 float[] dst, // 目标数组 dst [x,y],存储内容为一组点 int dstIndex, // 目标数组开始位置 - int pointCount) // 要使用点的数量 取值范围是: 0到4 + int pointCount) // 测控点的数量 取值范围是: 0到4 ``` Poly全称是Polygon,多边形的意思,了解了意思大致就能知道这个方法是做什么用的了,应该与PS中自由变换中的扭曲有点类似。 ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f71ppx7q0lg30go0b44ga.gif) -> 从参数我们可以了解到setPolyToPoly最多可以支持4个点,也就是图形的四个角,可以通过这四个角将视图从矩形变换成其他形状。 +> 从参数我们可以了解到setPolyToPoly最多可以支持4个点,这四个点通常为图形的四个角,可以通过这四个角将视图从矩形变换成其他形状。 简单示例: @@ -480,13 +480,13 @@ public class MatrixSetPolyToPolyTest extends View { -| pointCount | 摘要 | -| :--------: | --------------------- | -| 0 | 相当于`reset` | -| 1 | 相当于`translate` | -| 2 | 可以作 缩放、旋转、平移 变换 | -| 3 | 可以作 缩放、旋转、平移、错切 变换 | -| 4 | 可以作 缩放、旋转、平移、错切以及任何形变 | +| pointCount | 摘要 | +| :--------: | ---------------------- | +| 0 | 相当于`reset` | +| 1 | 相当于`translate` | +| 2 | 可以进行 缩放、旋转、平移 变换 | +| 3 | 可以进行 缩放、旋转、平移、错切 变换 | +| 4 | 可以进行 缩放、旋转、平移、错切以及任何形变 | > 从上表我们可以观察出一个规律, 随着`pointCount`数值增大setPolyToPoly的可以操作性也越来越强,这不是废话么,可调整点数多了能干的事情自然也多了。 > @@ -498,17 +498,17 @@ public class MatrixSetPolyToPolyTest extends View { 作为开发人员,写出来的代码出了要让机器"看懂",没有歧义之外,最重要的还是让人看懂,以方便后期的维护修改,从上边的表格中可以看出,前面的几种种情况都可以有更直观的替代方法,只有四个参数的情况下的特殊形变是没有替代方法的。 +**测控点选取位置?** +测控点可以选择任何你认为方便的位置,只要src与dst一一对应即可。不过为了方便,通常会选择一些特殊的点: 图形的四个角,边线的中心点以及图形的中心点等。**不过有一点需要注意,测控点选取都应当是不重复的(src与dst均是如此),如果选取了重复的点会直接导致测量失效,这也意味着,你不允许将一个方形(四个点)映射为三角形(四个点,但其中两个位置重叠),但可以接近于三角形。**。 -**控制点的选取和作用范围:** +**作用范围?** -控制点你可以选择任何位置,不过为了便于理解和使用,一般会选择特殊点,例如:图形的四个角,边线的中心点以及图形的中心点,当然了,只要是你觉得方便的点都可以选取。不过有一点需要注意,**选取点和映射点都应当是不重复的,如果选取了重复的点会直接导致测量失效,这也意味着,你不允许将一个方形映射为三角形(可以接近于三角形)**。 - -关于作用范围当然是设置了Matrix的全部范围,如果你将这个Matrix赋值给了Canvas,它的作用范围就是整个Canvas,如果你赋值给了Bitmap,它的作用范围就是整张图片。但是如果你仅仅测量并改变了图片的一部分,那么剩余的部分也会改变,不过并不推荐这么做,因为这样做你可能会得到一些异常的结果,这是底层逻辑导致的,由于其是根据你选取的映射区域来反向推导构建出来的Matrix,所以在你选取的区域直接结果是没有问题的,但在区域之外的结果可能与你想要的会存在差别。 +作用范围当然是设置了Matrix的全部区域,如果你将这个Matrix赋值给了Canvas,它的作用范围就是整个画布,如果你赋值给了Bitmap,它的作用范围就是整张图片。 ***** -**以下示例的src均为图片大小,dst根据手势变化。** +**一下用示例演示一下,所有示例的src均为图片大小,dst根据手势变化。** **pointCount为0** @@ -521,7 +521,7 @@ if (0 == count) { } ``` - +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f7b7v5z6k3g308c0cxdg6.gif) **pointCount为1** @@ -536,17 +536,29 @@ if (1 == count) { > 平移的距离是dst - src. +当测控点为1的时候,由于你只有一个点可以控制,所以你只能拖拽着它在2D平面上滑动。 +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f7b7vp3id5g308c0cxdyx.gif) **pointCount为2** -当pointCount为2的时候,可以做缩放、平移和旋转,对于这两个控制点 +当pointCount为2的时候,可以做缩放、平移和旋转。 +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f7b7w51e52g308c0cxx2k.gif) +**pointCount为3** -魔力不足,正在蓄力中... +当pointCount为3的时候,可以做缩放、平移、旋转和错切。 +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f7b7x5mxnug308c0cxwnz.gif) +**pointCount为4** + +当pointCount为4的时候,你可以将图像拉伸为任意四边形。 + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f7b7ygigbrg308c0cxaks.gif) + +上面已经用图例比较详细的展示了不同操控点个数的情况,如果你依旧存在疑问,可以获取代码自己试一下。 #### 2.setRectToRect