From ea7f03b9567199aa45e4187686fa3e6df1b3c204 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 24 May 2016 00:26:38 +0800 Subject: [PATCH 001/615] Update --- CustomView/README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/CustomView/README.md b/CustomView/README.md index 75060bea..756865c5 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -1,10 +1,9 @@ ## 自定义View系列 -**基础篇** | -:---: | - | - | - | + + + + ====== From 00c702278f7d4cc787450a3f94437b18a92366b1 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 24 May 2016 00:29:25 +0800 Subject: [PATCH 002/615] Update --- CustomView/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CustomView/README.md b/CustomView/README.md index 756865c5..b787638c 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -1,9 +1,9 @@ ## 自定义View系列 - - - + + + ====== From 574dd057f65532eba9d6f3afcfe61035db8d0d1c Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 24 May 2016 00:33:07 +0800 Subject: [PATCH 003/615] Update --- CustomView/README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CustomView/README.md b/CustomView/README.md index b787638c..abbbb217 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -1,9 +1,11 @@ ## 自定义View系列 - - - +

+ + + +

====== From fbe75b6fa0292eb0a7082a96bf04adf4305f0275 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 24 May 2016 00:38:16 +0800 Subject: [PATCH 004/615] Update --- CustomView/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CustomView/README.md b/CustomView/README.md index abbbb217..9630c032 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -1,5 +1,8 @@ ## 自定义View系列 +从零起步,从入门到懵逼的自定义View教程。 + +### 基础篇

@@ -7,7 +10,7 @@

-====== +******* **进阶篇** | :---: | From 34ba6f48ac37d6384a66419ed7c37f9c249f42b6 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 24 May 2016 00:41:54 +0800 Subject: [PATCH 005/615] Update --- CustomView/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/README.md b/CustomView/README.md index 9630c032..9890ff0b 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -4,7 +4,7 @@ ### 基础篇 -

+

From ac5319b0798077c0911981eb21a3b9a1fad09fb7 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 24 May 2016 00:45:56 +0800 Subject: [PATCH 006/615] Update --- CustomView/README.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/CustomView/README.md b/CustomView/README.md index 9890ff0b..23995134 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -4,23 +4,27 @@ ### 基础篇 -

******* +### 进阶篇 +

+ + + +

+ +

+ + + +

-**进阶篇** | -:---: | - | - | - | - | - | - | - | + | ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From 056337b735af255f0c8487c9494178f83ab1b6fa Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 24 May 2016 00:48:05 +0800 Subject: [PATCH 007/615] Update --- CustomView/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CustomView/README.md b/CustomView/README.md index 23995134..8eb24fb7 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -24,7 +24,11 @@

- | +

+ +

+
+

### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From bf8f7a1b5bdc9a73fb995bbdd07d9f78ccf44903 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 24 May 2016 00:48:48 +0800 Subject: [PATCH 008/615] Update --- CustomView/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CustomView/README.md b/CustomView/README.md index 8eb24fb7..e2b220b2 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -26,8 +26,6 @@

-

-

### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From acdffe1845c95fefc088ed426d13ab1658e4c3c3 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 24 May 2016 00:57:21 +0800 Subject: [PATCH 009/615] Update --- CustomView/Advance/Path_Play.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 CustomView/Advance/Path_Play.md diff --git a/CustomView/Advance/Path_Play.md b/CustomView/Advance/Path_Play.md new file mode 100644 index 00000000..2c1def0e --- /dev/null +++ b/CustomView/Advance/Path_Play.md @@ -0,0 +1,3 @@ +# Path之玩出花样 + +这一篇才是Path这一部分真正的完结篇,仍旧是与Path相关的方法。 From f8bef304b90c4adf631fd5c426c5aaa2d88b2c4e Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 24 May 2016 00:58:43 +0800 Subject: [PATCH 010/615] Update --- CustomView/Advance/{Path_Play.md => [8]Path_Play.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename CustomView/Advance/{Path_Play.md => [8]Path_Play.md} (100%) diff --git a/CustomView/Advance/Path_Play.md b/CustomView/Advance/[8]Path_Play.md similarity index 100% rename from CustomView/Advance/Path_Play.md rename to CustomView/Advance/[8]Path_Play.md From 972fd035b6c912ed95a18bb6215024e429445dcd Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 24 May 2016 19:19:35 +0800 Subject: [PATCH 011/615] Update --- CustomView/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/README.md b/CustomView/README.md index e2b220b2..b61f2e64 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -1,4 +1,4 @@ -## 自定义View系列 +# 自定义View系列 从零起步,从入门到懵逼的自定义View教程。 From 6aec1a4aeaffcb2e67d6addf9068819a987b9d1e Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 24 May 2016 19:20:08 +0800 Subject: [PATCH 012/615] Update --- CustomView/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/README.md b/CustomView/README.md index b61f2e64..4fb3dad1 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -2,7 +2,7 @@ 从零起步,从入门到懵逼的自定义View教程。 -### 基础篇 +## 基础篇

@@ -11,7 +11,7 @@

******* -### 进阶篇 +## 进阶篇

From adcb8c8345ea8609d52b78c1c8d9a94a2a6440c2 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 03:40:54 +0800 Subject: [PATCH 013/615] Update --- CustomView/Advance/[8]Path_Play.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 2c1def0e..78362c79 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -1,3 +1,31 @@ # Path之玩出花样 -这一篇才是Path这一部分真正的完结篇,仍旧是与Path相关的方法。 +### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) + + + +可以看到,在经过 +[Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) +[Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) 和 +[Path之完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) 后, Path中各类方法基本上都讲完了,表格中还没有讲解到到方法就是矩阵变换了,难道本篇终于要讲解矩阵变换? + +非也,矩阵这一部分仍在后面单独讲解,本篇主要讲解PathEffect与PathMeasure这两个与Path息息相关的类。 + +****** + + + + +## 总结 + + +## About Me + +### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) + + + +## 参考资料 +[]()
+[]()
From f981cad2a8633a572f6444bf03e8fb356c300cd1 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 04:00:54 +0800 Subject: [PATCH 014/615] Update --- CustomView/Advance/[8]Path_Play.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 78362c79..f46a2b96 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -8,9 +8,11 @@ 可以看到,在经过 [Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) [Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) 和 -[Path之完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) 后, Path中各类方法基本上都讲完了,表格中还没有讲解到到方法就是矩阵变换了,难道本篇终于要讲解矩阵变换? +[Path之完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) 后, Path中各类方法基本上都讲完了,表格中还没有讲解到到方法就是矩阵变换了,难道本篇终于要讲解矩阵了? -非也,矩阵这一部分仍在后面单独讲解,本篇主要讲解PathEffect与PathMeasure这两个与Path息息相关的类。 +非也,矩阵这一部分仍在后面单独讲解,本篇主要讲解PathMeasure这个类与Path的一些使用技巧。 + +> PS:不要问我为什么不讲PathEffect,因为这个方法在后面的Paint系列中。 ****** From b53a7e45fe88dde45b88643e4c93f8de375428a3 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 08:24:47 +0800 Subject: [PATCH 015/615] Update --- QuickChart/Canvas.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/QuickChart/Canvas.md b/QuickChart/Canvas.md index b5b65424..709e5b96 100644 --- a/QuickChart/Canvas.md +++ b/QuickChart/Canvas.md @@ -2,13 +2,13 @@ 操作分类 | 相关API | 备注 ---------|---------|-------------- -绘制颜色 | drawColor, drawRGB, drawARGB | 使用单一颜色填充整个画布
**相关链接:**
[【基础☆颜色】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B3%5DColor.md)
[【Canvas☆颜色与基本形状】](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Canvas(1).md) -绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧
**相关链接 :**
[【Canvas☆颜色与基本形状】](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Canvas(1).md) -绘制图片 | drawBitmap, drawPicture | 绘制位图和图片
**相关链接:**
[【Canvas☆图片与文字】](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Canvas(3).md) -绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字
**相关链接:**
[【Canvas☆图片与文字】](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Canvas(3).md) -绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数
**相关链接:**
[【Path☆常用操作】](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Path/Path(1).md) +绘制颜色 | drawColor, drawRGB, drawARGB | 使用单一颜色填充整个画布
**相关链接:**
[【基础-颜色】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B3%5DColor.md)
[【Canvas-颜色与基本形状】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md) +绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧
**相关链接 :**
[【Canvas-颜色与基本形状】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md) +绘制图片 | drawBitmap, drawPicture | 绘制位图和图片
**相关链接:**
[【Canvas-图片文字】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) +绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字
**相关链接:**
[【Canvas-图片文字】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) +绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数
**相关链接:**
[【Path-基本操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md)
[【Path-贝塞尔曲线】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md)
[【Path-完结篇(伪)】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) 顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 画布剪裁 | clipPath, clipRect | 设置画布的显示区域 -画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 会滚到指定状态、 获取保存次数
**相关链接:**
[【Canvas☆画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Canvas(2).md) -画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、倾斜
**相关链接:**
[【基础☆坐标系】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md)
[【基础☆角度与弧度】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B2%5DAngleAndRadian.md)
[【Canvas☆画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Canvas(2).md) +画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 会滚到指定状态、 获取保存次数
**相关链接:**
[【Canvas-画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) +画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、倾斜
**相关链接:**
[【基础-坐标系】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md)
[【基础-角度弧度】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B2%5DAngleAndRadian.md)
[【Canvas-画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放等操作的都是图像矩阵Matrix,只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 From adf98999075c91dedeb3bb734b6f044d60648691 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 09:20:06 +0800 Subject: [PATCH 016/615] Update --- CustomView/Advance/[8]Path_Play.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index f46a2b96..97fb420a 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -8,7 +8,7 @@ 可以看到,在经过 [Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) [Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) 和 -[Path之完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) 后, Path中各类方法基本上都讲完了,表格中还没有讲解到到方法就是矩阵变换了,难道本篇终于要讲解矩阵了? +[Path之完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) 后, Path中各类方法基本上都讲完了,表格中还没有讲解到到方法就是矩阵变换了,难道本篇终于要讲矩阵了? 非也,矩阵这一部分仍在后面单独讲解,本篇主要讲解PathMeasure这个类与Path的一些使用技巧。 @@ -16,6 +16,32 @@ ****** +## PathMeasure + +顾名思义,PathMeasure是一个用来测量Path的类,主要有以下方法: + +### 构造方法 + +方法名 | 释义 +---|--- +PathMeasure() | 创建一个空的PathMeasure +PathMeasure(Path path, boolean forceClosed) | 创建PathMeasure并关联一个指定的Path(Path需要已经创建完成)。 + +### 公共方法 + +返回值 | 方法名 | 释义 +--------|--------------------------------------------------------------------------|------------------- +void | setPath(Path path, boolean forceClosed) | 关联一个Path +boolean | isClosed() | 是否闭合 +float | getLength() | 获取Path的长度 +boolean | nextContour() | 跳转到下一个轮廓 +boolean | getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo) | 截取片段 +boolean | getPosTan(float distance, float[] pos, float[] tan) | 获取指定长度的位置坐标及该点切线值 +boolean | getMatrix(float distance, Matrix matrix, int flags) | 获取指定长度的位置坐标及该点Matrix + + + + From 149f0d8a09dd193072c691fbb54298ebc5b78ce5 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 10:19:33 +0800 Subject: [PATCH 017/615] Update --- CustomView/Advance/[8]Path_Play.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 97fb420a..790ab566 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -9,7 +9,6 @@ [Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) [Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) 和 [Path之完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) 后, Path中各类方法基本上都讲完了,表格中还没有讲解到到方法就是矩阵变换了,难道本篇终于要讲矩阵了? - 非也,矩阵这一部分仍在后面单独讲解,本篇主要讲解PathMeasure这个类与Path的一些使用技巧。 > PS:不要问我为什么不讲PathEffect,因为这个方法在后面的Paint系列中。 @@ -39,8 +38,25 @@ boolean | getSegment(float startD, float stopD, Path dst, boolean startWithMoveT boolean | getPosTan(float distance, float[] pos, float[] tan) | 获取指定长度的位置坐标及该点切线值 boolean | getMatrix(float distance, Matrix matrix, int flags) | 获取指定长度的位置坐标及该点Matrix +PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 + +#### 构造函数 + +构造函数有两个。 + +**无参构造函数:** + +``` java + PathMeasure () +``` + +用这个构造函数可创建一个空的PathMeasure,但是使用之前需要先调用 setPath 方法来与 Path 进行关联。被关联的 Path 必须是已经创建好的,如果关联之后 Path 内容进行了更改,则需要使用 setPath 方法重新关联。 +**有参构造函数:** +``` java + PathMeasure (Path path, boolean forceClosed) +``` From 23ddc6ad302b40c18fbd16e0268103ab5af68f7e Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 10:24:40 +0800 Subject: [PATCH 018/615] Update --- CustomView/Advance/[8]Path_Play.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 790ab566..4c88f6f7 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -58,7 +58,7 @@ PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 PathMeasure (Path path, boolean forceClosed) ``` - +用这个构造函数是创建一个 PathMeasure 并关联一个 Path, 其实和创建一个空的 PathMeasure 后调用 setPath 进行关联效果是一样的,同样,被关联的 Path 也必须是已经创建好的,如果关联之后 Path 内容进行了更改,则需要使用 setPath 方法重新关联。 ## 总结 From 2507decce4d4e136f914bec898ac366185bb9ee0 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 10:30:55 +0800 Subject: [PATCH 019/615] Update --- CustomView/Advance/[8]Path_Play.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 4c88f6f7..7989adbc 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -60,6 +60,8 @@ PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 用这个构造函数是创建一个 PathMeasure 并关联一个 Path, 其实和创建一个空的 PathMeasure 后调用 setPath 进行关联效果是一样的,同样,被关联的 Path 也必须是已经创建好的,如果关联之后 Path 内容进行了更改,则需要使用 setPath 方法重新关联。 +该方法有两个参数,第一个参数自然就是被关联的Path了,第二个参数是用来确保 Path 闭合,如果设置为 true, 则不论之前Path是否闭合,都会自动闭合该 Path。 + ## 总结 From eb2638ed65caeaeec77f6011223178e33dad82f8 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 17:03:41 +0800 Subject: [PATCH 020/615] Update --- CustomView/Advance/[7]Path_Over.md | 39 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/CustomView/Advance/[7]Path_Over.md b/CustomView/Advance/[7]Path_Over.md index 63535d3f..ed880d2d 100644 --- a/CustomView/Advance/[7]Path_Over.md +++ b/CustomView/Advance/[7]Path_Over.md @@ -10,25 +10,26 @@ ## 一.Path常用方法表 > 为了兼容性(_偷懒_) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法。忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊。宝宝此刻内心也是崩溃的。 -作用 | 相关方法 | 备注 ---- | --- | --- -移动起点 | moveTo | 移动下一次操作的起点位置 -设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 -连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path -闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 -添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) -是否为空 | isEmpty | 判断Path是否为空 -是否为矩形 | isRect | 判断path是否是一个矩形 -替换路径 | set | 用新的路径替换到当前路径所有内容 -偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) -贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 -rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量),rXxx方法是基于当前点坐标系(偏移量)** -填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType| 设置,获取,判断和切换填充模式 -提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** -布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) -计算边界 | computeBounds | 计算Path的边界 -重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** -矩阵操作 | transform | 矩阵变换 +作用 | 相关方法 | 备注 +----------------|-----------------|------------------------------------------ +移动起点 | moveTo | 移动下一次操作的起点位置 +设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 +连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path +闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 +添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) +是否为空 | isEmpty | 判断Path是否为空 +是否为矩形 | isRect | 判断path是否是一个矩形 +是否为凸多边形 | isConvex | 判断path是否是凸多边形 +替换路径 | set | 用新的路径替换到当前路径所有内容 +偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) +贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 +rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量), rXxx方法是基于当前点坐标系(偏移量)** +填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 设置,获取,判断和切换填充模式 +提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** +布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) +计算边界 | computeBounds | 计算Path的边界 +重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** +矩阵操作 | transform | 矩阵变换 ## 二、Path方法详解 From 5084fa6f7ff1015b55c5f8489b3f2e8deedf5289 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 17:04:42 +0800 Subject: [PATCH 021/615] Update --- CustomView/Advance/[6]Path_Bezier.md | 39 ++++++++++++++-------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/CustomView/Advance/[6]Path_Bezier.md b/CustomView/Advance/[6]Path_Bezier.md index d387cdcf..63797bc4 100644 --- a/CustomView/Advance/[6]Path_Bezier.md +++ b/CustomView/Advance/[6]Path_Bezier.md @@ -11,25 +11,26 @@ ## 一.Path常用方法表 > 为了兼容性(_偷懒_) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法。忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊。宝宝此刻内心也是崩溃的。 -作用 | 相关方法 | 备注 ---- | --- | --- -移动起点 | moveTo | 移动下一次操作的起点位置 -设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 -连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path -闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 -添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) -是否为空 | isEmpty | 判断Path是否为空 -是否为矩形 | isRect | 判断path是否是一个矩形 -替换路径 | set | 用新的路径替换到当前路径所有内容 -偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) -贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 -rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量),rXxx方法是基于当前点坐标系(偏移量)** -填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType| 设置,获取,判断和切换填充模式 -提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** -布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) -计算边界 | computeBounds | 计算Path的边界 -重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** -矩阵操作 | transform | 矩阵变换 +作用 | 相关方法 | 备注 +----------------|-----------------|------------------------------------------ +移动起点 | moveTo | 移动下一次操作的起点位置 +设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 +连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path +闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 +添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) +是否为空 | isEmpty | 判断Path是否为空 +是否为矩形 | isRect | 判断path是否是一个矩形 +是否为凸多边形 | isConvex | 判断path是否是凸多边形 +替换路径 | set | 用新的路径替换到当前路径所有内容 +偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) +贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 +rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量), rXxx方法是基于当前点坐标系(偏移量)** +填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 设置,获取,判断和切换填充模式 +提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** +布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) +计算边界 | computeBounds | 计算Path的边界 +重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** +矩阵操作 | transform | 矩阵变换 ## 二.Path详解 From 6216f1324df48cb1bae77200c0c376a3b69483ec Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 17:05:28 +0800 Subject: [PATCH 022/615] Update --- CustomView/Advance/[5]Path_Basic.md | 39 +++++++++++++++-------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/CustomView/Advance/[5]Path_Basic.md b/CustomView/Advance/[5]Path_Basic.md index 7612523b..8fb0bfc4 100644 --- a/CustomView/Advance/[5]Path_Basic.md +++ b/CustomView/Advance/[5]Path_Basic.md @@ -11,25 +11,26 @@ # 一.Path常用方法表 > 为了兼容性(_偷懒_) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法。忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊。宝宝此刻内心也是崩溃的。 -作用 | 相关方法 | 备注 ---- | --- | --- -移动起点 | moveTo | 移动下一次操作的起点位置 -设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 -连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path -闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 -添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) -是否为空 | isEmpty | 判断Path是否为空 -是否为矩形 | isRect | 判断path是否是一个矩形 -替换路径 | set | 用新的路径替换到当前路径所有内容 -偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) -贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 -rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量),rXxx方法是基于当前点坐标系(偏移量)** -填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType| 设置,获取,判断和切换填充模式 -提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** -布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) -计算边界 | computeBounds | 计算Path的边界 -重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** -矩阵操作 | transform | 矩阵变换 +作用 | 相关方法 | 备注 +----------------|-----------------|------------------------------------------ +移动起点 | moveTo | 移动下一次操作的起点位置 +设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 +连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path +闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 +添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) +是否为空 | isEmpty | 判断Path是否为空 +是否为矩形 | isRect | 判断path是否是一个矩形 +是否为凸多边形 | isConvex | 判断path是否是凸多边形 +替换路径 | set | 用新的路径替换到当前路径所有内容 +偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) +贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 +rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量), rXxx方法是基于当前点坐标系(偏移量)** +填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 设置,获取,判断和切换填充模式 +提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** +布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) +计算边界 | computeBounds | 计算Path的边界 +重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** +矩阵操作 | transform | 矩阵变换 # 二.Path详解 From bf8205f33ff8b6766e063f31f5bb01915a351e77 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 17:06:10 +0800 Subject: [PATCH 023/615] Update --- QuickChart/Path.md | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/QuickChart/Path.md b/QuickChart/Path.md index 3e3fe077..97f09ed8 100644 --- a/QuickChart/Path.md +++ b/QuickChart/Path.md @@ -2,23 +2,24 @@ > 为了兼容性(_偷懒_) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法。忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊。宝宝此刻内心也是崩溃的。 -作用 | 相关方法 | 备注 ------------|----------|------------------ -移动起点 | moveTo | 移动下一次操作的起点位置 -设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 -连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path -闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 -添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) -是否为空 | isEmpty | 判断Path是否为空 -是否为矩形 | isRect | 判断path是否是一个矩形 -替换路径 | set | 用新的路径替换到当前路径所有内容 -偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) -贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 -rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量),rXxx方法是基于当前点坐标系(偏移量)** -填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType| 设置,获取,判断和切换填充模式 -提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** -布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) -计算边界 | computeBounds | 计算Path的边界 -重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** -矩阵操作 | transform | 矩阵变换 +作用 | 相关方法 | 备注 +----------------|-----------------|------------------------------------------ +移动起点 | moveTo | 移动下一次操作的起点位置 +设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 +连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path +闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 +添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) +是否为空 | isEmpty | 判断Path是否为空 +是否为矩形 | isRect | 判断path是否是一个矩形 +是否为凸多边形 | isConvex | 判断path是否是凸多边形 +替换路径 | set | 用新的路径替换到当前路径所有内容 +偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) +贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 +rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量), rXxx方法是基于当前点坐标系(偏移量)** +填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 设置,获取,判断和切换填充模式 +提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** +布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) +计算边界 | computeBounds | 计算Path的边界 +重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** +矩阵操作 | transform | 矩阵变换 From 2fd8bf423e9c1ee0865f576f30e05ea90ddcdb66 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 17:13:28 +0800 Subject: [PATCH 024/615] Update --- Question/GenerateJavaDocInAndroidStudio.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Question/GenerateJavaDocInAndroidStudio.md diff --git a/Question/GenerateJavaDocInAndroidStudio.md b/Question/GenerateJavaDocInAndroidStudio.md new file mode 100644 index 00000000..fa9d19a8 --- /dev/null +++ b/Question/GenerateJavaDocInAndroidStudio.md @@ -0,0 +1,3 @@ +# 在 AndroidStudio 中生成 JavaDoc 文档 + + From 4e83783af6aa5c633c3aa84486983f40dede4178 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 17:54:42 +0800 Subject: [PATCH 025/615] Update --- Question/GenerateJavaDocInAndroidStudio.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 Question/GenerateJavaDocInAndroidStudio.md diff --git a/Question/GenerateJavaDocInAndroidStudio.md b/Question/GenerateJavaDocInAndroidStudio.md deleted file mode 100644 index fa9d19a8..00000000 --- a/Question/GenerateJavaDocInAndroidStudio.md +++ /dev/null @@ -1,3 +0,0 @@ -# 在 AndroidStudio 中生成 JavaDoc 文档 - - From e99330834175177f229b2996c9891f409e1ac111 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 18:08:06 +0800 Subject: [PATCH 026/615] Update --- CustomView/Advance/[5]Path_Basic.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[5]Path_Basic.md b/CustomView/Advance/[5]Path_Basic.md index 8fb0bfc4..909bb223 100644 --- a/CustomView/Advance/[5]Path_Basic.md +++ b/CustomView/Advance/[5]Path_Basic.md @@ -9,7 +9,7 @@ ****** # 一.Path常用方法表 -> 为了兼容性(_偷懒_) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法。忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊。宝宝此刻内心也是崩溃的。 +> 为了兼容性(_偷懒_) 本表格中去除了部分API21(即安卓版本5.0)以上才添加的方法。 作用 | 相关方法 | 备注 ----------------|-----------------|------------------------------------------ @@ -20,7 +20,6 @@ 添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) 是否为空 | isEmpty | 判断Path是否为空 是否为矩形 | isRect | 判断path是否是一个矩形 -是否为凸多边形 | isConvex | 判断path是否是凸多边形 替换路径 | set | 用新的路径替换到当前路径所有内容 偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) 贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 @@ -448,7 +447,7 @@ forceMoveTo | 含义 | 等价方法 从上面两张运行效果图可以清晰的看出来两者的区别,我就不再废话了。 -### 第3组:isEmpty、 isRect、 set 和 offset +### 第3组:isEmpty、 isRect、isConvex、 set 和 offset 这一组比较简单,稍微说一下就可以了。 From 32f7317ff6e4cf4afaf2f9f9f98eb0f945ca2349 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 18:08:49 +0800 Subject: [PATCH 027/615] Update --- CustomView/Advance/[6]Path_Bezier.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CustomView/Advance/[6]Path_Bezier.md b/CustomView/Advance/[6]Path_Bezier.md index 63797bc4..cade573c 100644 --- a/CustomView/Advance/[6]Path_Bezier.md +++ b/CustomView/Advance/[6]Path_Bezier.md @@ -20,7 +20,6 @@ 添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) 是否为空 | isEmpty | 判断Path是否为空 是否为矩形 | isRect | 判断path是否是一个矩形 -是否为凸多边形 | isConvex | 判断path是否是凸多边形 替换路径 | set | 用新的路径替换到当前路径所有内容 偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) 贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 From 79becbe41e45ab4910594a40d7d99339206e5e2e Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 18:09:10 +0800 Subject: [PATCH 028/615] Update --- CustomView/Advance/[7]Path_Over.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CustomView/Advance/[7]Path_Over.md b/CustomView/Advance/[7]Path_Over.md index ed880d2d..122c0586 100644 --- a/CustomView/Advance/[7]Path_Over.md +++ b/CustomView/Advance/[7]Path_Over.md @@ -19,7 +19,6 @@ 添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) 是否为空 | isEmpty | 判断Path是否为空 是否为矩形 | isRect | 判断path是否是一个矩形 -是否为凸多边形 | isConvex | 判断path是否是凸多边形 替换路径 | set | 用新的路径替换到当前路径所有内容 偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) 贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 From 718dd6ab6434158b92ab7f6a834ea9cec577a302 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 18:09:51 +0800 Subject: [PATCH 029/615] Update --- QuickChart/Path.md | 1 - 1 file changed, 1 deletion(-) diff --git a/QuickChart/Path.md b/QuickChart/Path.md index 97f09ed8..e55947dd 100644 --- a/QuickChart/Path.md +++ b/QuickChart/Path.md @@ -11,7 +11,6 @@ 添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) 是否为空 | isEmpty | 判断Path是否为空 是否为矩形 | isRect | 判断path是否是一个矩形 -是否为凸多边形 | isConvex | 判断path是否是凸多边形 替换路径 | set | 用新的路径替换到当前路径所有内容 偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) 贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 From 0f20e0ed68d83abf21cd4c50364e57ec247c660e Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 26 May 2016 21:56:57 +0800 Subject: [PATCH 030/615] Update --- CustomView/Advance/[8]Path_Play.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 7989adbc..c7422037 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -62,6 +62,32 @@ PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 该方法有两个参数,第一个参数自然就是被关联的Path了,第二个参数是用来确保 Path 闭合,如果设置为 true, 则不论之前Path是否闭合,都会自动闭合该 Path。 +**在这里有两点需要明确:** + +* 1. 不论 forceClosed 设置为何种状态(true 或者 false), 都不会影响原有Path的状态,**即 Path 与 PathMeasure 关联之后,Path不会有任何改变。** +* 2. forceClosed 的设置状态可能会影响测量结果,**如果 Path 未闭合但在与 PathMeasure 关联的时候设置 forceClosed 为 true 时,测量结果可能会比 Path 实际长度稍长一点。** + +下面我们用一个例子来验证一下: + +``` + canvas.translate(mViewWidth/2,mViewHeight/2); + + Path path = new Path(); + + path.lineTo(0,200); + path.lineTo(200,200); + path.lineTo(200,0); + + PathMeasure measure1 = new PathMeasure(path,false); + PathMeasure measure2 = new PathMeasure(path,true); + + Log.e("TAG", "forceClosed=false---->"+measure1.getLength()); + Log.e("TAG", "forceClosed=true----->"+measure2.getLength()); + + canvas.drawPath(path,mDeafultPaint); +``` + + ## 总结 From 4bd6a69858e2665338186285d6f656748af521dd Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 27 May 2016 01:11:05 +0800 Subject: [PATCH 031/615] Update --- CustomView/Advance/[8]Path_Play.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index c7422037..e440a319 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -64,6 +64,7 @@ PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 **在这里有两点需要明确:** +> * 1. 不论 forceClosed 设置为何种状态(true 或者 false), 都不会影响原有Path的状态,**即 Path 与 PathMeasure 关联之后,Path不会有任何改变。** * 2. forceClosed 的设置状态可能会影响测量结果,**如果 Path 未闭合但在与 PathMeasure 关联的时候设置 forceClosed 为 true 时,测量结果可能会比 Path 实际长度稍长一点。** @@ -87,6 +88,15 @@ PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 canvas.drawPath(path,mDeafultPaint); ``` +log如下: +``` + 25521-25521/com.gcssloop.canvas E/TAG: forceClosed=false---->600.0 + 25521-25521/com.gcssloop.canvas E/TAG: forceClosed=true----->800.0 +``` + +绘制在界面上的效果如下: + + ## 总结 From 47a6ee74698847c2978c0da51d04eb53c9134592 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 27 May 2016 01:49:03 +0800 Subject: [PATCH 032/615] Update --- CustomView/Advance/[8]Path_Play.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index e440a319..7247cd17 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -96,6 +96,24 @@ log如下: 绘制在界面上的效果如下: +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f49allf7gij308c0et3yk.jpg) + +我们所创建的 Path 实际上是一个边长为 200 的正方形的三条边,通过上面的示例就能验证以上两个问题。 + +> +* 1.我们将 Path 与两个的 PathMeasure 进行关联,并给 forceClosed 设置了不同的状态,之后绘制再绘制出来的 Path 没有任何变化,所以与 Path 与 PathMeasure进行关联并不会影响 Path 状态。 +* 2.我们可以看到,设置 forceClosed 为 true 的方法比设置为 false 的方法测量出来的长度要长一点,这是由于 Path 没有闭合的缘故,长处来的距离正是Path最后一个点与最开始一个点之间点距离。**forceClosed 为 false 测量的是当前Path状态的长度, forceClosed 为 true,则不论Path是否闭合测量的都是 Path 的闭合长度。** + +#### setPath isClosed getLength + +这三个方法都如字面意思一样,非常简单,这里就简单是叙述一下,不再过多讲解。 + +setPath 是 PathMeasure 与 Path 关联的重要方法,效果和 构造函数 中两个参数的作用是一样的。 + +isClosed 用于判断 Path 是否闭合,但是如果你在关联 Path 的时候设置 forceClosed 为 true 的话,这个方法的返回值则一定为true。 + +getLength 用于获取 Path 的总长度,在之前的测试中已经用过了。 + From 2e90da76f6e0eee9da09c14bafe48009f3534b87 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 27 May 2016 01:55:29 +0800 Subject: [PATCH 033/615] Update --- CustomView/Advance/[8]Path_Play.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 7247cd17..57f61742 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -104,7 +104,7 @@ log如下: * 1.我们将 Path 与两个的 PathMeasure 进行关联,并给 forceClosed 设置了不同的状态,之后绘制再绘制出来的 Path 没有任何变化,所以与 Path 与 PathMeasure进行关联并不会影响 Path 状态。 * 2.我们可以看到,设置 forceClosed 为 true 的方法比设置为 false 的方法测量出来的长度要长一点,这是由于 Path 没有闭合的缘故,长处来的距离正是Path最后一个点与最开始一个点之间点距离。**forceClosed 为 false 测量的是当前Path状态的长度, forceClosed 为 true,则不论Path是否闭合测量的都是 Path 的闭合长度。** -#### setPath isClosed getLength +#### setPath、 isClosed 和 getLength 这三个方法都如字面意思一样,非常简单,这里就简单是叙述一下,不再过多讲解。 @@ -114,6 +114,16 @@ isClosed 用于判断 Path 是否闭合,但是如果你在关联 Path 的时 getLength 用于获取 Path 的总长度,在之前的测试中已经用过了。 +#### getSegment + +getSegment 用于获取Path的一个片段,方法如下: + +``` java + boolean getSegment (float startD, float stopD, Path dst, boolean startWithMoveTo) +``` + + + From 1d12401700f34d7d9e1b8cef0321bd4824ecd7da Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 27 May 2016 16:23:34 +0800 Subject: [PATCH 034/615] Update --- CustomView/Advance/[8]Path_Play.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 57f61742..6cf6e2aa 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -15,7 +15,7 @@ ****** -## PathMeasure +## Path & PathMeasure 顾名思义,PathMeasure是一个用来测量Path的类,主要有以下方法: @@ -40,7 +40,7 @@ boolean | getMatrix(float distance, Matrix matrix, int flags) PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 -#### 构造函数 +### 1.构造函数 构造函数有两个。 @@ -104,7 +104,7 @@ log如下: * 1.我们将 Path 与两个的 PathMeasure 进行关联,并给 forceClosed 设置了不同的状态,之后绘制再绘制出来的 Path 没有任何变化,所以与 Path 与 PathMeasure进行关联并不会影响 Path 状态。 * 2.我们可以看到,设置 forceClosed 为 true 的方法比设置为 false 的方法测量出来的长度要长一点,这是由于 Path 没有闭合的缘故,长处来的距离正是Path最后一个点与最开始一个点之间点距离。**forceClosed 为 false 测量的是当前Path状态的长度, forceClosed 为 true,则不论Path是否闭合测量的都是 Path 的闭合长度。** -#### setPath、 isClosed 和 getLength +#### 2.setPath、 isClosed 和 getLength 这三个方法都如字面意思一样,非常简单,这里就简单是叙述一下,不再过多讲解。 @@ -114,7 +114,7 @@ isClosed 用于判断 Path 是否闭合,但是如果你在关联 Path 的时 getLength 用于获取 Path 的总长度,在之前的测试中已经用过了。 -#### getSegment +#### 3.getSegment getSegment 用于获取Path的一个片段,方法如下: From cec5b2e37c689e65af60e201f833787d6e24c20d Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 27 May 2016 17:44:38 +0800 Subject: [PATCH 035/615] Update --- CustomView/Advance/[8]Path_Play.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 6cf6e2aa..2582f357 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -102,7 +102,7 @@ log如下: > * 1.我们将 Path 与两个的 PathMeasure 进行关联,并给 forceClosed 设置了不同的状态,之后绘制再绘制出来的 Path 没有任何变化,所以与 Path 与 PathMeasure进行关联并不会影响 Path 状态。 -* 2.我们可以看到,设置 forceClosed 为 true 的方法比设置为 false 的方法测量出来的长度要长一点,这是由于 Path 没有闭合的缘故,长处来的距离正是Path最后一个点与最开始一个点之间点距离。**forceClosed 为 false 测量的是当前Path状态的长度, forceClosed 为 true,则不论Path是否闭合测量的都是 Path 的闭合长度。** +* 2.我们可以看到,设置 forceClosed 为 true 的方法比设置为 false 的方法测量出来的长度要长一点,这是由于 Path 没有闭合的缘故,多出来的距离正是Path最后一个点与最开始一个点之间点距离。**forceClosed 为 false 测量的是当前Path状态的长度, forceClosed 为 true,则不论Path是否闭合测量的都是 Path 的闭合长度。** #### 2.setPath、 isClosed 和 getLength From 6b16b256f938b6df44fe4ccce8e545b60261fbf5 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 27 May 2016 17:48:57 +0800 Subject: [PATCH 036/615] Update --- CustomView/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CustomView/README.md b/CustomView/README.md index 4fb3dad1..28fcc8ab 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -11,6 +11,7 @@

******* + ## 进阶篇

@@ -18,12 +19,16 @@

+******* +

+******* +

From 57c9aa29ed1bbd50d7422c1bb714e866d9c01c6a Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 28 May 2016 02:51:00 +0800 Subject: [PATCH 037/615] Update --- CustomView/Advance/[8]Path_Play.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 2582f357..de89fd1d 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -122,6 +122,14 @@ getSegment 用于获取Path的一个片段,方法如下: boolean getSegment (float startD, float stopD, Path dst, boolean startWithMoveTo) ``` +参数详解: + +参数 | 作用 | 备注 +----------------|----------------------------------|----------------------------------------- +startD | 开始截取位置距离 Path 起点的长度 | 取值范围: 0 < startD < stopD < Path总长度 +stopD | 结束截取位置距离 Path 起点的长度 | 取值范围: 0 < startD < stopD < Path总长度 +dst | 截取的 Path 将会添加到 dst 中 | 注意: 是添加,而不是替换 +startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取的Path第一个点位置不变 From 960361f7cc3ce8c2fe23528e119f374221cbfc3c Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 28 May 2016 02:56:46 +0800 Subject: [PATCH 038/615] Update --- CustomView/Advance/[8]Path_Play.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index de89fd1d..f3a2d4dc 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -9,9 +9,9 @@ [Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) [Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) 和 [Path之完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) 后, Path中各类方法基本上都讲完了,表格中还没有讲解到到方法就是矩阵变换了,难道本篇终于要讲矩阵了? -非也,矩阵这一部分仍在后面单独讲解,本篇主要讲解PathMeasure这个类与Path的一些使用技巧。 +非也,矩阵这一部分仍在后面单独讲解,本篇主要讲解 PathMeasure 这个类与 Path 的一些使用技巧。 -> PS:不要问我为什么不讲PathEffect,因为这个方法在后面的Paint系列中。 +> PS:不要问我为什么不讲 PathEffect,因为这个方法在后面的Paint系列中。 ****** @@ -24,7 +24,7 @@ 方法名 | 释义 ---|--- PathMeasure() | 创建一个空的PathMeasure -PathMeasure(Path path, boolean forceClosed) | 创建PathMeasure并关联一个指定的Path(Path需要已经创建完成)。 +PathMeasure(Path path, boolean forceClosed) | 创建 PathMeasure 并关联一个指定的Path(Path需要已经创建完成)。 ### 公共方法 @@ -50,7 +50,7 @@ PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 PathMeasure () ``` -用这个构造函数可创建一个空的PathMeasure,但是使用之前需要先调用 setPath 方法来与 Path 进行关联。被关联的 Path 必须是已经创建好的,如果关联之后 Path 内容进行了更改,则需要使用 setPath 方法重新关联。 +用这个构造函数可创建一个空的 PathMeasure,但是使用之前需要先调用 setPath 方法来与 Path 进行关联。被关联的 Path 必须是已经创建好的,如果关联之后 Path 内容进行了更改,则需要使用 setPath 方法重新关联。 **有参构造函数:** @@ -60,12 +60,12 @@ PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 用这个构造函数是创建一个 PathMeasure 并关联一个 Path, 其实和创建一个空的 PathMeasure 后调用 setPath 进行关联效果是一样的,同样,被关联的 Path 也必须是已经创建好的,如果关联之后 Path 内容进行了更改,则需要使用 setPath 方法重新关联。 -该方法有两个参数,第一个参数自然就是被关联的Path了,第二个参数是用来确保 Path 闭合,如果设置为 true, 则不论之前Path是否闭合,都会自动闭合该 Path。 +该方法有两个参数,第一个参数自然就是被关联的 Path 了,第二个参数是用来确保 Path 闭合,如果设置为 true, 则不论之前Path是否闭合,都会自动闭合该 Path。 **在这里有两点需要明确:** > -* 1. 不论 forceClosed 设置为何种状态(true 或者 false), 都不会影响原有Path的状态,**即 Path 与 PathMeasure 关联之后,Path不会有任何改变。** +* 1. 不论 forceClosed 设置为何种状态(true 或者 false), 都不会影响原有Path的状态,**即 Path 与 PathMeasure 关联之后,Path不会有任何改变。** * 2. forceClosed 的设置状态可能会影响测量结果,**如果 Path 未闭合但在与 PathMeasure 关联的时候设置 forceClosed 为 true 时,测量结果可能会比 Path 实际长度稍长一点。** 下面我们用一个例子来验证一下: @@ -102,7 +102,7 @@ log如下: > * 1.我们将 Path 与两个的 PathMeasure 进行关联,并给 forceClosed 设置了不同的状态,之后绘制再绘制出来的 Path 没有任何变化,所以与 Path 与 PathMeasure进行关联并不会影响 Path 状态。 -* 2.我们可以看到,设置 forceClosed 为 true 的方法比设置为 false 的方法测量出来的长度要长一点,这是由于 Path 没有闭合的缘故,多出来的距离正是Path最后一个点与最开始一个点之间点距离。**forceClosed 为 false 测量的是当前Path状态的长度, forceClosed 为 true,则不论Path是否闭合测量的都是 Path 的闭合长度。** +* 2.我们可以看到,设置 forceClosed 为 true 的方法比设置为 false 的方法测量出来的长度要长一点,这是由于 Path 没有闭合的缘故,多出来的距离正是 Path 最后一个点与最开始一个点之间点距离。**forceClosed 为 false 测量的是当前 Path 状态的长度, forceClosed 为 true,则不论Path是否闭合测量的都是 Path 的闭合长度。** #### 2.setPath、 isClosed 和 getLength @@ -131,6 +131,7 @@ stopD | 结束截取位置距离 Path 起点的长度 | 取值范围: dst | 截取的 Path 将会添加到 dst 中 | 注意: 是添加,而不是替换 startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取的Path第一个点位置不变 +我们先看看这个方法如何使用 From 88ac4f0d857770bdf8fefe3034c9304ffccab4e9 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 28 May 2016 12:47:42 +0800 Subject: [PATCH 039/615] Update --- CustomView/Advance/[8]Path_Play.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index f3a2d4dc..c7e48f94 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -122,14 +122,20 @@ getSegment 用于获取Path的一个片段,方法如下: boolean getSegment (float startD, float stopD, Path dst, boolean startWithMoveTo) ``` -参数详解: +方法各个参数释义: 参数 | 作用 | 备注 -----------------|----------------------------------|----------------------------------------- -startD | 开始截取位置距离 Path 起点的长度 | 取值范围: 0 < startD < stopD < Path总长度 -stopD | 结束截取位置距离 Path 起点的长度 | 取值范围: 0 < startD < stopD < Path总长度 +----------------|----------------------------------|-------------------------------------------- +返回值(boolean) | 判断截取是否成功 | 如果返回值为 false 表示截取失败,不会改变dst中内容 +startD | 开始截取位置距离 Path 起点的长度 | 取值范围: 0 <= startD < stopD <= Path总长度 +stopD | 结束截取位置距离 Path 起点的长度 | 取值范围: 0 <= startD < stopD <= Path总长度 dst | 截取的 Path 将会添加到 dst 中 | 注意: 是添加,而不是替换 -startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取的Path第一个点位置不变 +startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取的 Path 第一个点位置不变 + +> +* 如果 startD 或 stopD 的数值不在取值范围内,或者 startD == stopD 则返回值为 false,不会改变dst内容。 +* 如果在安卓4.4或者之前的版本,在默认开启硬件加速的情况下,更改 dst 的内容后可能绘制会出现问题,请关闭硬件加速,或者给 dst 添加一个单个操作,例如: dst.rLineTo(0, 0) + 我们先看看这个方法如何使用 From 369fd43f9d92a5f9e83a11fd5c24294decb75bf5 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 28 May 2016 12:55:43 +0800 Subject: [PATCH 040/615] Update --- CustomView/Advance/[8]Path_Play.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index c7e48f94..60ac13b3 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -133,10 +133,9 @@ dst | 截取的 Path 将会添加到 dst 中 | 注意: 是添加 startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取的 Path 第一个点位置不变 > -* 如果 startD 或 stopD 的数值不在取值范围内,或者 startD == stopD 则返回值为 false,不会改变dst内容。 +* 如果 startD、stopD 的数值不在取值范围 [0, getLength] 内,或者 startD == stopD 则返回值为 false,不会改变dst内容。 * 如果在安卓4.4或者之前的版本,在默认开启硬件加速的情况下,更改 dst 的内容后可能绘制会出现问题,请关闭硬件加速,或者给 dst 添加一个单个操作,例如: dst.rLineTo(0, 0) - 我们先看看这个方法如何使用 From e58240125ebee33e6da2fafa8e639c54181a05a6 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 28 May 2016 17:18:02 +0800 Subject: [PATCH 041/615] Update --- CustomView/Advance/[8]Path_Play.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 60ac13b3..a41f5775 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -133,11 +133,12 @@ dst | 截取的 Path 将会添加到 dst 中 | 注意: 是添加 startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取的 Path 第一个点位置不变 > -* 如果 startD、stopD 的数值不在取值范围 [0, getLength] 内,或者 startD == stopD 则返回值为 false,不会改变dst内容。 -* 如果在安卓4.4或者之前的版本,在默认开启硬件加速的情况下,更改 dst 的内容后可能绘制会出现问题,请关闭硬件加速,或者给 dst 添加一个单个操作,例如: dst.rLineTo(0, 0) +* 如果 startD、stopD 的数值不在取值范围 [0, getLength] 内,或者 startD == stopD 则返回值为 false,不会改变 dst 内容。 +* 如果在安卓4.4或者之前的版本,在默认开启硬件加速的情况下,更改 dst 的内容后可能绘制会出现问题,请关闭硬件加速或者给 dst 添加一个单个操作,例如: dst.rLineTo(0, 0) -我们先看看这个方法如何使用 +我们先看看这个方法如何使用: +我们创建了一个 Path, 并在其中添加了一个矩形,现在我们想截取矩形中的一部分,就是下图中红色的部分。 From 4b3e52e90860f60e78cb57dc8b4c3a3d26207505 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 28 May 2016 21:48:46 +0800 Subject: [PATCH 042/615] Update --- CustomView/Advance/[8]Path_Play.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index a41f5775..5b121496 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -140,7 +140,7 @@ startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取 我们创建了一个 Path, 并在其中添加了一个矩形,现在我们想截取矩形中的一部分,就是下图中红色的部分。 - +> 矩形边长400dp,起始点在左上角 ## 总结 From 7771afd3439bd4d81b89db80d334c1fccb4466d7 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 28 May 2016 22:26:19 +0800 Subject: [PATCH 043/615] Update --- CustomView/Advance/[5]Path_Basic.md | 31 ++++++++++------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/CustomView/Advance/[5]Path_Basic.md b/CustomView/Advance/[5]Path_Basic.md index 909bb223..a20865f2 100644 --- a/CustomView/Advance/[5]Path_Basic.md +++ b/CustomView/Advance/[5]Path_Basic.md @@ -243,19 +243,19 @@ close方法用于连接当前最后一个点和最初的一个点(如果两个 Direction的意思是 方向,趋势。 点进去看一下会发现Direction是一个枚举(Enum)类型,里面只有两个枚举常量,如下: -类型 | 解释 | 翻译 ---- | --- | --- -CW | clockwise | 顺时针 -CCW | counter-clockwise | 逆时针 +类型 | 解释 | 翻译 +-----|-------------------|------- +CW | clockwise | 顺时针 +CCW | counter-clockwise | 逆时针 > **瞬间懵逼,我只是想添加一个基本的形状啊,搞什么顺时针和逆时针, (╯‵□′)╯︵┻━┻** **稍安勿躁,┬─┬ ノ( ' - 'ノ) {摆好摆好) 既然存在肯定是有用的,先偷偷剧透一下这个顺时针和逆时针的作用。** 序号 | 作用 ---- | --- - 1 | 在添加图形时确定闭合顺序(各个点的记录顺序) - 2 | 对图形的渲染结果有影响(是判断图形渲染的重要条件) +-----|--------------------------------------------------- + 1 | 在添加图形时确定闭合顺序(各个点的记录顺序) + 2 | 对图形的渲染结果有影响(是判断图形渲染的重要条件) 这个先剧透这么多,至于对闭合顺序有啥影响,自相交图形的渲染等问题等请慢慢看下去 @@ -281,7 +281,6 @@ CCW | counter-clockwise | 逆时针 ``` canvas.translate(mWidth / 2, mHeight / 2); // 移动坐标系到屏幕中心 - canvas.scale(1,-1); // <-- 注意 scale特殊运用:翻转y坐标轴 Path path = new Path(); @@ -292,12 +291,7 @@ CCW | counter-clockwise | 逆时针 canvas.drawPath(path,mPaint); ``` - - -**请注意:为了演示方便,本次将坐标系调整到了和我们常见的数学坐标系相同,请留意代码的变动,否则效果刚好是反着的,会更加难以理解。** - -> 如果你对坐标系有疑问,请参考之前文章 [坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/%E5%9D%90%E6%A0%87%E7%B3%BB/%E5%9D%90%E6%A0%87%E7%B3%BB.md)
->如果你对翻转坐标轴有疑问,请参考之前文章 [Canvas(2)画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Canvas(2).md) + 可以明显看到,图形发生了奇怪的变化。为何会如此呢? @@ -317,7 +311,6 @@ CCW | counter-clockwise | 逆时针 ``` java canvas.translate(mWidth / 2, mHeight / 2); // 移动坐标系到屏幕中心 - canvas.scale(1,-1); // <-- 注意 翻转y坐标轴 Path path = new Path(); @@ -328,13 +321,11 @@ CCW | counter-clockwise | 逆时针 canvas.drawPath(path,mPaint); ``` - - -通过验证发现,发现结果和我们猜想的一样,但是还有一个潜藏的问题不晓得大家可否注意到。**为啥A点总是排在第一个呢?长得漂亮还是咋地?** + -我们前面说过,确定一个矩形只需要知道对角线的两个点就足够了,我们实际上是通过 C(-200,-200) 和 A(200,200) 来确定这个矩形的,A点就是我们参数中的第二个点,经过测试可以发现参数中指定的第二个点始终是记录中的第一个点。至于为啥参数中第二个点作为记录的第一个点,可能就是当时设计这个的工程师一拍脑门决定的,也可能是这样设计算法比较简单。这个我们无需深究。 +通过验证发现,发现结果和我们猜想的一样,但是还有一个潜藏的问题不晓得大家可否注意到。**我们用两个点的坐标确定了一个矩形,矩形起始点(A)就是我们指定的第一个点的坐标。** -**不过,需要注意的是,交换坐标点的顺序可能就会影响到某些绘制内容哦,例如上面的例子,你可以尝试交换两个坐标点,或者指定另外两个点来作为参数,虽然指定的是同一个矩形,但实际绘制出来是不同的哦。** +**需要注意的是,交换坐标点的顺序可能就会影响到某些绘制内容哦,例如上面的例子,你可以尝试交换两个坐标点,或者指定另外两个点来作为参数,虽然指定的是同一个矩形,但实际绘制出来是不同的哦。** **参数中点的顺序很重要!
参数中点的顺序很重要!
参数中点的顺序很重要!
** From 23e43f98661ac79bd4f3047fac886bc61fa51006 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 29 May 2016 03:20:07 +0800 Subject: [PATCH 044/615] Update --- CustomView/Advance/[8]Path_Play.md | 40 ++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 5b121496..6ad38729 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -142,6 +142,46 @@ startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取 > 矩形边长400dp,起始点在左上角 +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f4bohcxzhqj308c0etwej.jpg) + +代码: + +``` java + canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 + + Path path = new Path(); // 创建Path并添加了一个矩形 + path.addRect(-200, -200, 200, 200, Path.Direction.CW); + + Path dst = new Path(); // 创建用于存储截取后内容的 Path + + PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 + + // 截取一部分存入dst中,并使用 moveTo 保持截取得到的 Path 第一个点的位置不变 + measure.getSegment(200, 600, dst, true); + + canvas.drawPath(dst, mDeafultPaint); // 绘制 dst +``` + + +从上图可以看到我们成功到将需要到片段截取了出来,然而当 dst 中有内容时会怎样呢? + +``` java + +``` + +从上面的示例可以得到结论:**被截取的 Path 片段会添加到 dst 中,而不是替换 dst 中到内容。** + +前面两个例子中 startWithMoveTo 均为 true, 如果设置为false会怎样呢? + +从该示例我们又可以得到一条结论:**如果 startWithMoveTo 为 true, 则被截取出来到Path片段保持原状,如果 startWithMoveTo 为 false,则会将截取出来的 Path 片段的起始点移动到 dst 的最后一个点,以保证 dst 的连续性。** + +从而我们可以用以下规则来判断 startWithMoveTo 的取值: + +取值 | 主要功用 +------|------------------ +true | 保证截取得到的 Path 片段不会发生形变 +false | 保证存储截取片段的 Path(dst) 的连续性 + ## 总结 From eecbd4cf02123a10259c83677b3a76d66da6b587 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 29 May 2016 03:30:44 +0800 Subject: [PATCH 045/615] Update --- CustomView/Advance/[8]Path_Play.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 6ad38729..c67e4e5e 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -140,7 +140,7 @@ startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取 我们创建了一个 Path, 并在其中添加了一个矩形,现在我们想截取矩形中的一部分,就是下图中红色的部分。 -> 矩形边长400dp,起始点在左上角 +> 矩形边长400dp,起始点在左上角,顺时针 ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f4bohcxzhqj308c0etwej.jpg) @@ -162,6 +162,9 @@ startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取 canvas.drawPath(dst, mDeafultPaint); // 绘制 dst ``` +结果如下: + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f4bpmetj7wj308c0etdfu.jpg) 从上图可以看到我们成功到将需要到片段截取了出来,然而当 dst 中有内容时会怎样呢? From ffe114f1ebf068900a13190c5477c41612e066c4 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 29 May 2016 16:02:49 +0800 Subject: [PATCH 046/615] Update --- CustomView/Advance/[8]Path_Play.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index c67e4e5e..2d43d9aa 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -169,10 +169,22 @@ startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取 从上图可以看到我们成功到将需要到片段截取了出来,然而当 dst 中有内容时会怎样呢? ``` java + canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 + + Path path = new Path(); // 创建Path并添加了一个矩形 + path.addRect(-200, -200, 200, 200, Path.Direction.CW); + + Path dst = new Path(); // 创建用于存储截取后内容的 Path + dst.lineTo(-300, -300); // 在 dst 中添加一条线段 + + PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 + + measure.getSegment(200, 600, dst, true); // 截取一部分 并使用 moveTo 保持截取得到的 Path 第一个点的位置不变 + canvas.drawPath(dst, mDeafultPaint); // 绘制 Path ``` -从上面的示例可以得到结论:**被截取的 Path 片段会添加到 dst 中,而不是替换 dst 中到内容。** +从上面的示例可以看到 dst 中的线段保留了下来,可以得到结论:**被截取的 Path 片段会添加到 dst 中,而不是替换 dst 中到内容。** 前面两个例子中 startWithMoveTo 均为 true, 如果设置为false会怎样呢? From 003e65741f0cc3aeddc4205a07893a454ff09328 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 29 May 2016 18:57:14 +0800 Subject: [PATCH 047/615] Update --- CustomView/Advance/[8]Path_Play.md | 56 +++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 2d43d9aa..ac9d8117 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -147,19 +147,19 @@ startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取 代码: ``` java - canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 + canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 - Path path = new Path(); // 创建Path并添加了一个矩形 - path.addRect(-200, -200, 200, 200, Path.Direction.CW); + Path path = new Path(); // 创建Path并添加了一个矩形 + path.addRect(-200, -200, 200, 200, Path.Direction.CW); - Path dst = new Path(); // 创建用于存储截取后内容的 Path + Path dst = new Path(); // 创建用于存储截取后内容的 Path - PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 + PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 - // 截取一部分存入dst中,并使用 moveTo 保持截取得到的 Path 第一个点的位置不变 - measure.getSegment(200, 600, dst, true); + // 截取一部分存入dst中,并使用 moveTo 保持截取得到的 Path 第一个点的位置不变 + measure.getSegment(200, 600, dst, true); - canvas.drawPath(dst, mDeafultPaint); // 绘制 dst + canvas.drawPath(dst, mDeafultPaint); // 绘制 dst ``` 结果如下: @@ -169,25 +169,49 @@ startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取 从上图可以看到我们成功到将需要到片段截取了出来,然而当 dst 中有内容时会怎样呢? ``` java - canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 + canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 - Path path = new Path(); // 创建Path并添加了一个矩形 - path.addRect(-200, -200, 200, 200, Path.Direction.CW); + Path path = new Path(); // 创建Path并添加了一个矩形 + path.addRect(-200, -200, 200, 200, Path.Direction.CW); - Path dst = new Path(); // 创建用于存储截取后内容的 Path - dst.lineTo(-300, -300); // 在 dst 中添加一条线段 + Path dst = new Path(); // 创建用于存储截取后内容的 Path + dst.lineTo(-300, -300); // <--- 在 dst 中添加一条线段 - PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 + PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 - measure.getSegment(200, 600, dst, true); // 截取一部分 并使用 moveTo 保持截取得到的 Path 第一个点的位置不变 + measure.getSegment(200, 600, dst, true); // 截取一部分 并使用 moveTo 保持截取得到的 Path 第一个点的位置不变 - canvas.drawPath(dst, mDeafultPaint); // 绘制 Path + canvas.drawPath(dst, mDeafultPaint); // 绘制 Path ``` +结果如下: + +![](http://ww3.sinaimg.cn/large/005Xtdi2gw1f4cg8rl0wmj308c0et74b.jpg) + 从上面的示例可以看到 dst 中的线段保留了下来,可以得到结论:**被截取的 Path 片段会添加到 dst 中,而不是替换 dst 中到内容。** 前面两个例子中 startWithMoveTo 均为 true, 如果设置为false会怎样呢? +``` java + canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 + + Path path = new Path(); // 创建Path并添加了一个矩形 + path.addRect(-200, -200, 200, 200, Path.Direction.CW); + + Path dst = new Path(); // 创建用于存储截取后内容的 Path + dst.lineTo(-300, -300); // 在 dst 中添加一条线段 + + PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 + + measure.getSegment(200, 600, dst, false); // <--- 截取一部分 不使用 startMoveTo, 保持 dst 的连续性 + + canvas.drawPath(dst, mDeafultPaint); // 绘制 Path +``` + +结果如下: + +![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f4cgdgc7etj308c0et3yk.jpg) + 从该示例我们又可以得到一条结论:**如果 startWithMoveTo 为 true, 则被截取出来到Path片段保持原状,如果 startWithMoveTo 为 false,则会将截取出来的 Path 片段的起始点移动到 dst 的最后一个点,以保证 dst 的连续性。** 从而我们可以用以下规则来判断 startWithMoveTo 的取值: From d292e9865d2d08c47c644e02dc91ac9feb419d64 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 29 May 2016 22:03:34 +0800 Subject: [PATCH 048/615] Update --- CustomView/Advance/[8]Path_Play.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index ac9d8117..da5dc8ec 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -4,7 +4,6 @@ ### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) - 可以看到,在经过 [Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) [Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) 和 @@ -220,7 +219,19 @@ startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取 ------|------------------ true | 保证截取得到的 Path 片段不会发生形变 false | 保证存储截取片段的 Path(dst) 的连续性 - + + +#### 4.nextContour + +我们知道 Path 可以由多条曲线构成,但不论是 getLength , getgetSegment 或者是其它方法,都只会在其中第一条线段上运行,而这个 `nextContour` 就是用于跳转到下一条曲线到方法,_如果跳转成功,则返回 true, 如果跳转失败,则返回 false。_ + + + + + + + + ## 总结 From e66c6e32cf673660087c1b087d706ffd10515f4e Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 30 May 2016 02:44:05 +0800 Subject: [PATCH 049/615] Update --- CustomView/Advance/[8]Path_Play.md | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index da5dc8ec..768a070b 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -225,7 +225,48 @@ false | 保证存储截取片段的 Path(dst) 的连续性 我们知道 Path 可以由多条曲线构成,但不论是 getLength , getgetSegment 或者是其它方法,都只会在其中第一条线段上运行,而这个 `nextContour` 就是用于跳转到下一条曲线到方法,_如果跳转成功,则返回 true, 如果跳转失败,则返回 false。_ +如下,我们创建了一个 Path 并使其中包含了两个闭合的曲线,外面的边长是400,内部的边长是200,现在我们使用 PathMeasure 分别测量两条曲线的总长度。 +代码: + +``` java + canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 + + Path path = new Path(); + + path.addRect(-100, -100, 100, 100, Path.Direction.CW); // 添加小矩形 + path.addRect(-200, -200, 200, 200, Path.Direction.CW); // 添加大矩形 + + canvas.drawPath(path,mDeafultPaint); // 绘制 Path + + PathMeasure measure = new PathMeasure(path, false); // 将Path与PathMeasure关联 + + float len1 = measure.getLength(); // 获得第一条路径的长度 + + measure.nextContour(); // 跳转到下一条路径 + + float len2 = measure.getLength(); // 获得第二条路径的长度 + + Log.i("LEN","len1="+len1); // 输出两条路径的长度 + Log.i("LEN","len2="+len2); +``` + +log输出结果: +``` +05-30 02:00:33.899 19879-19879/com.gcssloop.canvas I/LEN: len1=800.0 +05-30 02:00:33.899 19879-19879/com.gcssloop.canvas I/LEN: len2=1600.0 +``` + +通过测试,我们可以得到以下内容: + +* 1.使用图形中线的顺序与在 Path 中添加的顺序有关。 +* 2.getLength 获取到到是当前一条曲线分长度,而不是整个 Path 到长度。 +* 3.getLength 等方法是针对当前的曲线(其它方法请自行验证)。 + + +#### getPosTan + +这个方法是用于得到路径上某一长度的位置以及该位置的正切值。 From ccbfe90a2949d4caffb9094f7b3e623ea3224e5b Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 30 May 2016 02:47:47 +0800 Subject: [PATCH 050/615] Update --- CustomView/Advance/[8]Path_Play.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 768a070b..9603d86d 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -227,6 +227,8 @@ false | 保证存储截取片段的 Path(dst) 的连续性 如下,我们创建了一个 Path 并使其中包含了两个闭合的曲线,外面的边长是400,内部的边长是200,现在我们使用 PathMeasure 分别测量两条曲线的总长度。 +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f4ctzjr08dj308c0et74c.jpg) + 代码: ``` java From 1dbedb70d365a6a952fe75a4ad5c5e5a6e1bd643 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 30 May 2016 19:03:47 +0800 Subject: [PATCH 051/615] Update --- CustomView/Advance/[8]Path_Play.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 9603d86d..949da556 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -268,8 +268,19 @@ log输出结果: #### getPosTan -这个方法是用于得到路径上某一长度的位置以及该位置的正切值。 +这个方法是用于得到路径上某一长度的位置以及该位置的正切值: +``` java + boolean getPosTan (float distance, float[] pos, float[] tan) +``` + +方法各个参数释义: +参数 | 作用 | 备注 +----------------|----------------------------------|-------------------------------------------- +返回值(boolean) | 判断获取是否成功 | 如果返回值为 false 表示获取失败,pos 和 tan 都不会改变 +distance | 距离 Path 起点的长度 | 取值范围: 0 <= distance <= getLength +pos | 该点的坐标值 | 坐标值: (x==[0], y==[1]) +tan | 该点的正切值 | 正切值: (x==[0], y==[1]) From 4ab8ab9c158892c931f383c8371d86238da0f5a2 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 30 May 2016 23:15:38 +0800 Subject: [PATCH 052/615] Update --- CustomView/Advance/[8]Path_Play.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 949da556..1623ad7e 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -282,6 +282,9 @@ distance | 距离 Path 起点的长度 | 取值范围: 0 <= d pos | 该点的坐标值 | 坐标值: (x==[0], y==[1]) tan | 该点的正切值 | 正切值: (x==[0], y==[1]) +这个方法也不难理解,除了其中 `tan` 这个东东,这个东西是干什么的呢? + +这个是用来判断 Path 的趋势的,即在这一个点的方向。 From 5e615334e4730f0bbbe0dc88178b01ca0523b866 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 30 May 2016 23:28:30 +0800 Subject: [PATCH 053/615] Update --- CustomView/Advance/[8]Path_Play.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 1623ad7e..a6098bbf 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -284,7 +284,10 @@ tan | 该点的正切值 | 正切值: (x==[0], y 这个方法也不难理解,除了其中 `tan` 这个东东,这个东西是干什么的呢? -这个是用来判断 Path 的趋势的,即在这一个点的方向。 +这个是用来判断 Path 的趋势的,即在这个位置上曲线的走向,请看下图示例,注意箭头的方向: + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f4dtufydm4g308c0etmyl.gif) + From 72ff9bfce2549bf7114e3fecb2f37032023636c7 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 31 May 2016 01:39:23 +0800 Subject: [PATCH 054/615] Update --- CustomView/Advance/[8]Path_Play.md | 65 +++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index a6098bbf..15c91bd0 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -284,10 +284,73 @@ tan | 该点的正切值 | 正切值: (x==[0], y 这个方法也不难理解,除了其中 `tan` 这个东东,这个东西是干什么的呢? -这个是用来判断 Path 的趋势的,即在这个位置上曲线的走向,请看下图示例,注意箭头的方向: +`tan` 是用来判断 Path 的趋势的,即在这个位置上曲线的走向,请看下图示例,注意箭头的方向: ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f4dtufydm4g308c0etmyl.gif) +可以看到 上图中箭头在沿着 Path 运动时,方向始终与 Path 走向保持一致,下面我们来看看代码是如何实现的: + +首先我们需要定义几个必要的变量: + +``` java + private float currentValue = 0; // 用于纪录当前的位置,取值范围[0,1]映射Path的整个长度 + + private float[] pos; // 当前点的实际位置 + private float[] tan; // 当前点的tangent值,用于计算图片所需旋转的角度 + private Bitmap mBitmap; // 箭头图片 + private Matrix mMatrix; // 矩阵,用于对图片进行一些操作 +``` + +初始化这些变量(在构造函数中调用这个方法): + +``` java + private void init(Context context) { + pos = new float[2]; + tan = new float[2]; + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inSampleSize = 2; // 缩放图片 + mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.arrow, options); + mMatrix = new Matrix(); + } +``` + +具体绘制: + +``` java + + canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 + + Path path = new Path(); // 创建 Path + + path.addCircle(0, 0, 200, Path.Direction.CW); // 添加一个圆形 + + PathMeasure measure = new PathMeasure(path, false); // 创建 PathMeasure + + currentValue += 0.005; // 计算当前的位置在总长度上的比例[0,1] + if (currentValue >= 1) { + currentValue = 0; + } + + measure.getPosTan(measure.getLength() * currentValue, pos, tan); // 获取当前位置的坐标以及趋势 + + mMatrix.reset(); // 重置Matrix + float degrees = (float) (Math.atan2(tan[1], tan[0]) * 180.0 / Math.PI); // 计算图片旋转角度 + + mMatrix.postRotate(degrees, mBitmap.getWidth() / 2, mBitmap.getHeight() / 2); // 旋转图片 + mMatrix.postTranslate(pos[0] - mBitmap.getWidth() / 2, pos[1] - mBitmap.getHeight() / 2); // 将图片绘制中心调整到与当前点重合 + + canvas.drawPath(path, mDeafultPaint); // 绘制 Path + canvas.drawBitmap(mBitmap, mMatrix, mDeafultPaint); // 绘制箭头 + + invalidate(); // 重绘页面 +``` + +**核心要点:** + +* 1.**通过 `tan` 得值计算出图片旋转的角度**,tan 是 tangent 的缩写,即中学中常见的正切, 其中tan[0](x)是邻边边长,tan[1](y)是对边边长,而Math中 `atan2` 方法是根据正切是数值计算出该角度的大小,得到的单位是弧度,所以上面又将弧度转为了角度。 +* 2.**通过 `Matrix` 来设置图片对旋转角度和位移**,这里使用的方法与前面讲解过对 canvas操作 有些类似,对于 `Matrix` 会在后面专一进行讲解,敬请期待。 +* 3.**页面刷新**,页面刷新此处是在 onDraw 里面调用了 invalidate 方法来保持界面不断刷新,但并不提倡这么做,正确对做法应该是使用 线程 或者 ValueAnimator 来控制界面的刷新,关于控制页面刷新这一部分会在后续的 动画部分 详细讲解,同样敬请期待。 + From fdb4d9cff32487c5f8dee05be54bff6a08b29a80 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 31 May 2016 02:58:00 +0800 Subject: [PATCH 055/615] Update [8]Path_Play.md --- CustomView/Advance/[8]Path_Play.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 15c91bd0..b11a1c17 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -352,7 +352,14 @@ tan | 该点的正切值 | 正切值: (x==[0], y * 3.**页面刷新**,页面刷新此处是在 onDraw 里面调用了 invalidate 方法来保持界面不断刷新,但并不提倡这么做,正确对做法应该是使用 线程 或者 ValueAnimator 来控制界面的刷新,关于控制页面刷新这一部分会在后续的 动画部分 详细讲解,同样敬请期待。 +#### getMatrix +这个方法是用于得到路径上某一长度的位置以及该位置的正切值的矩阵: +``` java +boolean getMatrix (float distance, Matrix matrix, int flags) +``` + +其实这个方法就相当于我们在前一个例子中封装矩阵的过程 ## 总结 From 18d31e1d5fb85d051e5c9062842796a08535acd2 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 31 May 2016 03:08:50 +0800 Subject: [PATCH 056/615] Update --- CustomView/Advance/[8]Path_Play.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index b11a1c17..e6c24047 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -277,7 +277,7 @@ log输出结果: 参数 | 作用 | 备注 ----------------|----------------------------------|-------------------------------------------- -返回值(boolean) | 判断获取是否成功 | 如果返回值为 false 表示获取失败,pos 和 tan 都不会改变 +返回值(boolean) | 判断获取是否成功 | true表示成功,数据会存入 pos 和 tan 中,
false 表示失败,pos 和 tan 不会改变 distance | 距离 Path 起点的长度 | 取值范围: 0 <= distance <= getLength pos | 该点的坐标值 | 坐标值: (x==[0], y==[1]) tan | 该点的正切值 | 正切值: (x==[0], y==[1]) @@ -359,6 +359,15 @@ tan | 该点的正切值 | 正切值: (x==[0], y boolean getMatrix (float distance, Matrix matrix, int flags) ``` +方法各个参数释义: + +参数 | 作用 | 备注 +----------------|----------------------------------|-------------------------------------------- +返回值(boolean) | 判断获取是否成功 | true表示成功,数据会存入matrix中,false 失败,matrix内容不会改变 +distance | 距离 Path 起点的长度 | 取值范围: 0 <= distance <= getLength +matrix | 根据 falgs 封装好的matrix | 会根据 flags 的设置而存入不同的内容 +flags | 规定哪些内容会存入到matrix中 | 可选择
POSITION_MATRIX_FLAG(位置)
ANGENT_MATRIX_FLAG(正切) + 其实这个方法就相当于我们在前一个例子中封装矩阵的过程 From f13800f9ccf9d055a2f0f3b503160279b78b534a Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 31 May 2016 03:28:33 +0800 Subject: [PATCH 057/615] Update --- CustomView/Advance/[8]Path_Play.md | 49 ++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index e6c24047..824b3590 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -347,12 +347,13 @@ tan | 该点的正切值 | 正切值: (x==[0], y **核心要点:** +> * 1.**通过 `tan` 得值计算出图片旋转的角度**,tan 是 tangent 的缩写,即中学中常见的正切, 其中tan[0](x)是邻边边长,tan[1](y)是对边边长,而Math中 `atan2` 方法是根据正切是数值计算出该角度的大小,得到的单位是弧度,所以上面又将弧度转为了角度。 * 2.**通过 `Matrix` 来设置图片对旋转角度和位移**,这里使用的方法与前面讲解过对 canvas操作 有些类似,对于 `Matrix` 会在后面专一进行讲解,敬请期待。 * 3.**页面刷新**,页面刷新此处是在 onDraw 里面调用了 invalidate 方法来保持界面不断刷新,但并不提倡这么做,正确对做法应该是使用 线程 或者 ValueAnimator 来控制界面的刷新,关于控制页面刷新这一部分会在后续的 动画部分 详细讲解,同样敬请期待。 -#### getMatrix +#### 5.getMatrix 这个方法是用于得到路径上某一长度的位置以及该位置的正切值的矩阵: ``` java @@ -368,7 +369,51 @@ distance | 距离 Path 起点的长度 | 取值范围: 0 <= d matrix | 根据 falgs 封装好的matrix | 会根据 flags 的设置而存入不同的内容 flags | 规定哪些内容会存入到matrix中 | 可选择
POSITION_MATRIX_FLAG(位置)
ANGENT_MATRIX_FLAG(正切) -其实这个方法就相当于我们在前一个例子中封装矩阵的过程 +其实这个方法就相当于我们在前一个例子中封装 `matrix` 的过程由 `getMatrix` 替我们做了,我们可以直接得到一个封装好到 `matrix`,岂不快哉。 + +但是我们看到最后到 `flags` 选项可以选择 `位置` 或者 `正切` ,如果我们两个选项都想选择怎么办? + +如果两个选项都想选择,可以将两个选项之间用 `|` 连接起来,如下: +``` +measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasure.POSITION_MATRIX_FLAG); +``` + +我们可以将上面都例子中 `getPosTan` 替换为 `getMatrix`, 看看是不是会显得简单很多: + +具体绘制: + +``` java + Path path = new Path(); // 创建 Path + + path.addCircle(0, 0, 200, Path.Direction.CW); // 添加一个圆形 + + PathMeasure measure = new PathMeasure(path, false); // 创建 PathMeasure + + currentValue += 0.005; // 计算当前的位置在总长度上的比例[0,1] + if (currentValue >= 1) { + currentValue = 0; + } + + // 获取当前位置的坐标以及趋势的矩阵 + measure.getMatrix(measure.getLength() * currentValue, mMatrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasure.POSITION_MATRIX_FLAG); + + mMatrix.preTranslate(-mBitmap.getWidth() / 2, -mBitmap.getHeight() / 2); // <-- 将图片绘制中心调整到与当前点重合(注意:此处是前乘pre) + + canvas.drawPath(path, mDeafultPaint); // 绘制 Path + canvas.drawBitmap(mBitmap, mMatrix, mDeafultPaint); // 绘制箭头 + + invalidate(); // 重绘页面 +``` + +> 由于此处代码运行结果与上面一样,便不再贴图片了,请参照上面一个示例的效果图。 + +可以看到使用 getMatrix 方法的确可以节省一些代码,不过这里依旧需要注意一些内容: + +> +* 1.对 `matrix` 的操作必须要在 `getMatrix` 之后进行,否则会被 `getMatrix` 重置而导致无效。 +* 2.矩阵对旋转角度默认为图片的左上角,我们此处需要使用 `preTranslate` 调整为图片中心。 +* 3.pre(矩阵前乘) 与 post(矩阵后乘) 的区别,此处请等待后续的文章或者自行搜索。 + ## 总结 From 9ff4c2be31c98cfbc531e7557fcdf05fff53299b Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 31 May 2016 03:33:21 +0800 Subject: [PATCH 058/615] Update --- CustomView/Advance/[8]Path_Play.md | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 824b3590..052d3002 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -39,6 +39,9 @@ boolean | getMatrix(float distance, Matrix matrix, int flags) PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 +****** + + ### 1.构造函数 构造函数有两个。 @@ -103,7 +106,11 @@ log如下: * 1.我们将 Path 与两个的 PathMeasure 进行关联,并给 forceClosed 设置了不同的状态,之后绘制再绘制出来的 Path 没有任何变化,所以与 Path 与 PathMeasure进行关联并不会影响 Path 状态。 * 2.我们可以看到,设置 forceClosed 为 true 的方法比设置为 false 的方法测量出来的长度要长一点,这是由于 Path 没有闭合的缘故,多出来的距离正是 Path 最后一个点与最开始一个点之间点距离。**forceClosed 为 false 测量的是当前 Path 状态的长度, forceClosed 为 true,则不论Path是否闭合测量的都是 Path 的闭合长度。** -#### 2.setPath、 isClosed 和 getLength + + + + +### 2.setPath、 isClosed 和 getLength 这三个方法都如字面意思一样,非常简单,这里就简单是叙述一下,不再过多讲解。 @@ -113,7 +120,11 @@ isClosed 用于判断 Path 是否闭合,但是如果你在关联 Path 的时 getLength 用于获取 Path 的总长度,在之前的测试中已经用过了。 -#### 3.getSegment + + + + +### 3.getSegment getSegment 用于获取Path的一个片段,方法如下: @@ -221,7 +232,10 @@ true | 保证截取得到的 Path 片段不会发生形变 false | 保证存储截取片段的 Path(dst) 的连续性 -#### 4.nextContour + + + +### 4.nextContour 我们知道 Path 可以由多条曲线构成,但不论是 getLength , getgetSegment 或者是其它方法,都只会在其中第一条线段上运行,而这个 `nextContour` 就是用于跳转到下一条曲线到方法,_如果跳转成功,则返回 true, 如果跳转失败,则返回 false。_ @@ -266,7 +280,10 @@ log输出结果: * 3.getLength 等方法是针对当前的曲线(其它方法请自行验证)。 -#### getPosTan + + + +#### 5.getPosTan 这个方法是用于得到路径上某一长度的位置以及该位置的正切值: ``` java @@ -353,7 +370,9 @@ tan | 该点的正切值 | 正切值: (x==[0], y * 3.**页面刷新**,页面刷新此处是在 onDraw 里面调用了 invalidate 方法来保持界面不断刷新,但并不提倡这么做,正确对做法应该是使用 线程 或者 ValueAnimator 来控制界面的刷新,关于控制页面刷新这一部分会在后续的 动画部分 详细讲解,同样敬请期待。 -#### 5.getMatrix + + +### 6.getMatrix 这个方法是用于得到路径上某一长度的位置以及该位置的正切值的矩阵: ``` java From 42ffa25f95bd716cd9d3e5274254a8dce8ff13a6 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 31 May 2016 03:42:00 +0800 Subject: [PATCH 059/615] Update --- CustomView/Advance/[8]Path_Play.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 052d3002..ed43078f 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -433,6 +433,14 @@ measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasur * 2.矩阵对旋转角度默认为图片的左上角,我们此处需要使用 `preTranslate` 调整为图片中心。 * 3.pre(矩阵前乘) 与 post(矩阵后乘) 的区别,此处请等待后续的文章或者自行搜索。 +## Path使用技巧 + +**话说本篇文章的名字不是叫 玩出花样?怎么只见前面啰啰嗦嗦的扯了一大堆不明所以的东西?花样在哪里呢?** + +> +**前面的内容虽然啰嗦繁杂,但却是重中之重的基础,如果在修仙界,这叫根基,而下面讲述的内容的是招式,有了根基才能演化出千变万化的招式,而没有根基只学招式则是徒有其表,只能学一样会一样,很难适应千变万化的需求。** + + ## 总结 From d0341e3f11290b95df660c5180c20fb2406555a2 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 1 Jun 2016 16:54:07 +0800 Subject: [PATCH 060/615] Update --- CustomView/Advance/[8]Path_Play.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index ed43078f..cafcd9fd 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -435,11 +435,14 @@ measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasur ## Path使用技巧 -**话说本篇文章的名字不是叫 玩出花样?怎么只见前面啰啰嗦嗦的扯了一大堆不明所以的东西?花样在哪里呢?** +**话说本篇文章的名字不是叫 玩出花样么?怎么只见前面啰啰嗦嗦的扯了一大堆不明所以的东西,花样在哪里?** > **前面的内容虽然啰嗦繁杂,但却是重中之重的基础,如果在修仙界,这叫根基,而下面讲述的内容的是招式,有了根基才能演化出千变万化的招式,而没有根基只学招式则是徒有其表,只能学一样会一样,很难适应千变万化的需求。** +先放一个效果图,然后分析一下实现过程: + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f4fp2myqo4g308c05k75k.gif) From 45d7174a24e2556f298876f8d7bc94f9829a6dc9 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 1 Jun 2016 18:23:19 +0800 Subject: [PATCH 061/615] Update --- CustomView/Advance/[8]Path_Play.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index cafcd9fd..7b2c8101 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -444,6 +444,15 @@ measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasur ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f4fp2myqo4g308c05k75k.gif) +这是一个搜索的动效图,通过分析可以得到它应该有四种状态,分别如下: + +状态 |概述 +---------|-------------------------------------------------- +无动作 | 初始状态,没有任何动效,只显示一个搜索标志 :mag: +准备搜索 | 放大镜图标逐渐变化为一个点 +搜索中 | 围绕这一个圆环运动,并且线段长度会周期性变化 +准备结束 | 从一个点逐渐变化成为放大镜图标 + ## 总结 From 2991c6b4beb29b77bac59fdb604c6d5c7ca03786 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 1 Jun 2016 23:22:45 +0800 Subject: [PATCH 062/615] Update --- CustomView/Advance/[8]Path_Play.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 7b2c8101..d8c230fa 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -453,6 +453,14 @@ measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasur 搜索中 | 围绕这一个圆环运动,并且线段长度会周期性变化 准备结束 | 从一个点逐渐变化成为放大镜图标 +这些状态是有序转换的,转换流程以及转换条件如下: + +> 其中 `正在搜索` 这个状态持续时间长度是不确定的,在没有搜索完成前,应该一直处于搜索状态。 + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f4g4i3c06cj30a60gb3yt.jpg) + + + ## 总结 From 41f8855ecfc4340b3ab21c5957f3da1a46aba122 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 00:59:35 +0800 Subject: [PATCH 063/615] Update --- CustomView/Advance/[8]Path_Play.md | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index d8c230fa..8ad6883f 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -448,9 +448,9 @@ measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasur 状态 |概述 ---------|-------------------------------------------------- -无动作 | 初始状态,没有任何动效,只显示一个搜索标志 :mag: +初始状态 | 初始状态,没有任何动效,只显示一个搜索标志 :mag: 准备搜索 | 放大镜图标逐渐变化为一个点 -搜索中 | 围绕这一个圆环运动,并且线段长度会周期性变化 +正在搜索 | 围绕这一个圆环运动,并且线段长度会周期性变化 准备结束 | 从一个点逐渐变化成为放大镜图标 这些状态是有序转换的,转换流程以及转换条件如下: @@ -459,6 +459,32 @@ measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasur ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f4g4i3c06cj30a60gb3yt.jpg) +简单的分析了其大致的流程之后,就到了制作的重点:对细节对把握。 + +### Path 划分 + +为了制作对方便,此处整个动效用了两个 Path, 一个是中间对放大镜, 另一个则是外侧的圆环,将两者全部画出来是这样子的。 + + +其中 Path 的走向要把握好,如下: + +其中圆形上面的点可以用 PathMeasure 测量,无需计算。 + +### 动画状态与时间关联 + +此处使用的是 ValueAnimator,它可以将一段时间映射到一段数值上,随着时间变化不断的更新数值,并且可以使用插值器开控制数值变化规律(此处使用的是默认插值器)。 + +> PS: 本来不想提前暴露这个的,准备偷偷留到动画部分(。-_-。) 但实在是没有优雅的替代方案了。 + +### 具体绘制 + +绘制部分是根据 当前状态以及从 ValueAnimator 获得的数值来截取 Path 中合适的部分绘制出来。 + +### 源码 + +上面的内容是为了帮助大家从把控全局流程以及理解某些细节的设计思路,而更多的内容都藏在代码中,代码总体也不算长,感兴趣的可以自己敲一遍。 + +#### [戳这里查看源码]() From 9ddc3d4aba9a1b3226681131555789afb290f66c Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 01:15:25 +0800 Subject: [PATCH 064/615] Update --- CustomView/Advance/[8]Path_Play.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 8ad6883f..3126a682 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -433,6 +433,23 @@ measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasur * 2.矩阵对旋转角度默认为图片的左上角,我们此处需要使用 `preTranslate` 调整为图片中心。 * 3.pre(矩阵前乘) 与 post(矩阵后乘) 的区别,此处请等待后续的文章或者自行搜索。 +***** + + +## Path & SVG + +我们知道,用Path可以创建出各种个样的图形,但如果图形过于复杂时,用代码写就不现实了,不仅麻烦,而且容易出错,所以在绘制复杂的图形时我们一般是将 SVG 图像转换为 Path。 + +你说什么是 SVG? + SVG 是一种矢量图,内部用的是 xml 格式化存储方式存储这操作和数据,你完全可以将 SVG 看作是 Path 的各项操作简化书写后的存储格式。 + + Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: + + + + +***** + ## Path使用技巧 **话说本篇文章的名字不是叫 玩出花样么?怎么只见前面啰啰嗦嗦的扯了一大堆不明所以的东西,花样在哪里?** @@ -480,12 +497,16 @@ measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasur 绘制部分是根据 当前状态以及从 ValueAnimator 获得的数值来截取 Path 中合适的部分绘制出来。 +### 最终效果 + + ### 源码 上面的内容是为了帮助大家从把控全局流程以及理解某些细节的设计思路,而更多的内容都藏在代码中,代码总体也不算长,感兴趣的可以自己敲一遍。 #### [戳这里查看源码]() +> PS: 本代码仅作为示例使用,还有诸多不足,如 自定义属性,视图大小, 点击事件, 监听回调 等,并不适合直接使用,有需要的可以自行补足相关内容。 From ef59a57f1dd3ca28ef5b28edf7c94cb869d8d21f Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 01:28:22 +0800 Subject: [PATCH 065/615] Update --- CustomView/Advance/[8]Path_Play.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 3126a682..8d4223a8 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -440,13 +440,20 @@ measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasur 我们知道,用Path可以创建出各种个样的图形,但如果图形过于复杂时,用代码写就不现实了,不仅麻烦,而且容易出错,所以在绘制复杂的图形时我们一般是将 SVG 图像转换为 Path。 -你说什么是 SVG? - SVG 是一种矢量图,内部用的是 xml 格式化存储方式存储这操作和数据,你完全可以将 SVG 看作是 Path 的各项操作简化书写后的存储格式。 - - Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: +**你说什么是 SVG?** +SVG 是一种矢量图,内部用的是 xml 格式化存储方式存储这操作和数据,你完全可以将 SVG 看作是 Path 的各项操作简化书写后的存储格式。 +Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f4g87vfjbeg30690b4go8.gif) +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f4g89vqhqwg30690b4mzu.gif) + +> +**该图片来自这个开源库 ->[PathView](https://github.com/geftimov/android-pathview)**
+**SVG 转 Path 的解析可以用这个库 -> [AndroidSVG](https://bigbadaboom.github.io/androidsvg/)** +限于篇幅以及本人精力,这一部分就暂不详解了,感兴趣的可以直接看源码,或者搜索一些相关的解析文章。 ***** From e61ec17e8794d4da4735b2ce5697dd9240f253b4 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 02:33:00 +0800 Subject: [PATCH 066/615] Update --- CustomView/Advance/Code/SearchView.md | 249 ++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 CustomView/Advance/Code/SearchView.md diff --git a/CustomView/Advance/Code/SearchView.md b/CustomView/Advance/Code/SearchView.md new file mode 100644 index 00000000..ffcb9305 --- /dev/null +++ b/CustomView/Advance/Code/SearchView.md @@ -0,0 +1,249 @@ +## SearchView 源代码 + +``` +/** + * Author: GcsSloop + *

+ * Created Date: 16/5/31 + *

+ * Copyright (C) 2016 GcsSloop. + *

+ * GitHub: https://github.com/GcsSloop + */ +public class SearchView extends View { + + // 画笔 + private Paint mPaint; + + // View 宽高 + private int mViewWidth; + private int mViewHeight; + + // 这个视图拥有的状态 + public static enum State { + NONE, + STARTING, + SEARCHING, + ENDING + } + + // 当前的状态(非常重要) + private State mCurrentState = State.NONE; + + // 放大镜与外部圆环 + private Path path_srarch; + private Path path_circle; + + // 测量Path 并截取部分的工具 + private PathMeasure mMeasure; + + // 默认的动效周期 2s + private int defaultDuration = 2000; + + // 控制各个过程的动画 + private ValueAnimator mStartingAnimator; + private ValueAnimator mSearchingAnimator; + private ValueAnimator mEndingAnimator; + + // 动画数值(用于控制动画状态,因为同一时间内只允许有一种状态出现,具体数值处理取决于当前状态) + private float mAnimatorValue = 0; + + // 动效过程监听器 + private ValueAnimator.AnimatorUpdateListener mUpdateListener; + private Animator.AnimatorListener mAnimatorListener; + + // 用于控制动画状态转换 + private Handler mAnimatorHandler; + + // 判断是否已经搜索结束 + private boolean isOver = false; + + private int count = 0; + + public SearchView(Context context) { + super(context); + + initPaint(); + + initPath(); + + initListener(); + + initHandler(); + + initAnimator(); + + // 进入开始动画 + mCurrentState = State.STARTING; + mStartingAnimator.start(); + + } + + private void initPaint() { + mPaint = new Paint(); + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setColor(Color.WHITE); + mPaint.setStrokeWidth(15); + mPaint.setStrokeCap(Paint.Cap.ROUND); + mPaint.setAntiAlias(true); + } + + private void initPath() { + path_srarch = new Path(); + path_circle = new Path(); + + mMeasure = new PathMeasure(); + + // 注意,不要到360度,否则内部会自动优化,测量不能取到需要的数值 + RectF oval1 = new RectF(-50, -50, 50, 50); // 放大镜圆环 + path_srarch.addArc(oval1, 45, 359.9f); + + RectF oval2 = new RectF(-100, -100, 100, 100); // 外部圆环 + path_circle.addArc(oval2, 45, -359.9f); + + float[] pos = new float[2]; + + mMeasure.setPath(path_circle, false); // 放大镜把手的位置 + mMeasure.getPosTan(0, pos, null); + + path_srarch.lineTo(pos[0], pos[1]); // 放大镜把手 + + Log.i("TAG", "pos=" + pos[0] + ":" + pos[1]); + } + + private void initListener() { + mUpdateListener = new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + mAnimatorValue = (float) animation.getAnimatedValue(); + invalidate(); + } + }; + + mAnimatorListener = new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + + } + + @Override + public void onAnimationEnd(Animator animation) { + // getHandle发消息通知动画状态更新 + mAnimatorHandler.sendEmptyMessage(0); + } + + @Override + public void onAnimationCancel(Animator animation) { + + } + + @Override + public void onAnimationRepeat(Animator animation) { + + } + }; + } + + private void initHandler() { + mAnimatorHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + switch (mCurrentState) { + case STARTING: + // 从开始动画转换好搜索动画 + isOver = false; + mCurrentState = State.SEARCHING; + mStartingAnimator.removeAllListeners(); + mSearchingAnimator.start(); + break; + case SEARCHING: + if (!isOver) { // 如果搜索未结束 则继续执行搜索动画 + mSearchingAnimator.start(); + Log.e("Update", "RESTART"); + + count++; + if (count>2){ // count大于2则进入结束状态 + isOver = true; + } + } else { // 如果搜索已经结束 则进入结束动画 + mCurrentState = State.ENDING; + mEndingAnimator.start(); + } + break; + case ENDING: + // 从结束动画转变为无状态 + mCurrentState = State.NONE; + break; + } + } + }; + } + + private void initAnimator() { + mStartingAnimator = ValueAnimator.ofFloat(0, 1).setDuration(defaultDuration); + mSearchingAnimator = ValueAnimator.ofFloat(0, 1).setDuration(defaultDuration); + mEndingAnimator = ValueAnimator.ofFloat(1, 0).setDuration(defaultDuration); + + mStartingAnimator.addUpdateListener(mUpdateListener); + mSearchingAnimator.addUpdateListener(mUpdateListener); + mEndingAnimator.addUpdateListener(mUpdateListener); + + mStartingAnimator.addListener(mAnimatorListener); + mSearchingAnimator.addListener(mAnimatorListener); + mEndingAnimator.addListener(mAnimatorListener); + } + + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mViewWidth = w; + mViewHeight = h; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + drawSearch(canvas); + } + + private void drawSearch(Canvas canvas) { + + mPaint.setColor(Color.WHITE); + + + canvas.translate(mViewWidth / 2, mViewHeight / 2); + + canvas.drawColor(Color.parseColor("#0082D7")); + + switch (mCurrentState) { + case NONE: + canvas.drawPath(path_srarch, mPaint); + break; + case STARTING: + mMeasure.setPath(path_srarch, false); + Path dst = new Path(); + mMeasure.getSegment(mMeasure.getLength() * mAnimatorValue, mMeasure.getLength(), dst, true); + canvas.drawPath(dst, mPaint); + break; + case SEARCHING: + mMeasure.setPath(path_circle, false); + Path dst2 = new Path(); + float stop = mMeasure.getLength() * mAnimatorValue; + float start = (float) (stop - ((0.5 - Math.abs(mAnimatorValue - 0.5)) * 200f)); + mMeasure.getSegment(start, stop, dst2, true); + canvas.drawPath(dst2, mPaint); + break; + case ENDING: + mMeasure.setPath(path_srarch, false); + Path dst3 = new Path(); + mMeasure.getSegment(mMeasure.getLength() * mAnimatorValue, mMeasure.getLength(), dst3, true); + canvas.drawPath(dst3, mPaint); + break; + } + } +} + +``` From 80811f85a75ff6161f14d24da8ef27ad7cf2d280 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 02:33:37 +0800 Subject: [PATCH 067/615] Update --- CustomView/Advance/Code/SearchView.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/Code/SearchView.md b/CustomView/Advance/Code/SearchView.md index ffcb9305..13af1f7c 100644 --- a/CustomView/Advance/Code/SearchView.md +++ b/CustomView/Advance/Code/SearchView.md @@ -1,6 +1,6 @@ ## SearchView 源代码 -``` +``` java /** * Author: GcsSloop *

From 08530d0267a38958c5a11f55f90867538a52543c Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 02:43:30 +0800 Subject: [PATCH 068/615] Update --- CustomView/Advance/[8]Path_Play.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 8d4223a8..756ee7eb 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -305,6 +305,8 @@ tan | 该点的正切值 | 正切值: (x==[0], y ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f4dtufydm4g308c0etmyl.gif) +**[点击这里下载箭头图片](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4gam21ktoj3069069jre.jpg)** + 可以看到 上图中箭头在沿着 Path 运动时,方向始终与 Path 走向保持一致,下面我们来看看代码是如何实现的: 首先我们需要定义几个必要的变量: From 92350eb7ec253eeadc4fd11910032433abf44dc4 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 03:13:03 +0800 Subject: [PATCH 069/615] Update --- CustomView/Advance/[8]Path_Play.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 756ee7eb..b2ad8b5a 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -490,9 +490,12 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: ### Path 划分 为了制作对方便,此处整个动效用了两个 Path, 一个是中间对放大镜, 另一个则是外侧的圆环,将两者全部画出来是这样子的。 - -其中 Path 的走向要把握好,如下: +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f4gbhxuuktj308c0etwej.jpg) + +其中 Path 的走向要把握好,如下(只是一个放大镜,并不是♂): + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4gbjj3fd1j308c05kt8i.jpg) 其中圆形上面的点可以用 PathMeasure 测量,无需计算。 From 87919022f80527381504ec2c233f28201fe41692 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 03:14:44 +0800 Subject: [PATCH 070/615] Update --- CustomView/Advance/[8]Path_Play.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index b2ad8b5a..daf31d49 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -511,17 +511,17 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: ### 最终效果 +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f4gbmtj0mvg308c0etq58.gif) ### 源码 上面的内容是为了帮助大家从把控全局流程以及理解某些细节的设计思路,而更多的内容都藏在代码中,代码总体也不算长,感兴趣的可以自己敲一遍。 -#### [戳这里查看源码]() +#### [戳这里查看源码](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/Code/SearchView.md) > PS: 本代码仅作为示例使用,还有诸多不足,如 自定义属性,视图大小, 点击事件, 监听回调 等,并不适合直接使用,有需要的可以自行补足相关内容。 - ## 总结 From abbeaf1f23feccd09f172bb31b63d7d9b5537f7f Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 03:31:52 +0800 Subject: [PATCH 071/615] Update --- CustomView/Advance/[8]Path_Play.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index daf31d49..154fcdde 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -12,6 +12,10 @@ > PS:不要问我为什么不讲 PathEffect,因为这个方法在后面的Paint系列中。 +先放一个图镇楼,省的下面无聊的内容把你们都吓跑了Σ( ̄。 ̄ノ)ノ + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f4fp2myqo4g308c05k75k.gif) + ****** ## Path & PathMeasure @@ -524,6 +528,9 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: ## 总结 +本文中虽然后面点内容看起来比较高大上,但前面看起来啰嗦的废话才是真正的干货,把前面的东西学会了,以后各种效果基本上都是信手拈来,如果忽略的前面而只研究后面的东西,则只能取其形,难以会其意。 + +### PS: 由于本人水平有限,某些地方可能存在误解或不准确,如果你对此有疑问可以提交Issues进行反馈。 ## About Me @@ -532,5 +539,14 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: ## 参考资料 +[PathMeasure](https://developer.android.com/reference/android/graphics/PathMeasure.html)
+[AndroidSVG](https://bigbadaboom.github.io/androidsvg/)
+[android-pathview](https://github.com/geftimov/android-pathview)
+[android Path 和 PathMeasure 进阶](http://blog.csdn.net/cquwentao/article/details/51436852)
[]()
-[]()
+ + + + + + From afc59bf2719868d82cd871d34ddbcbe125ce0063 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 03:33:21 +0800 Subject: [PATCH 072/615] Update --- CustomView/Advance/[8]Path_Play.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 154fcdde..2a0c34ad 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -530,7 +530,7 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: 本文中虽然后面点内容看起来比较高大上,但前面看起来啰嗦的废话才是真正的干货,把前面的东西学会了,以后各种效果基本上都是信手拈来,如果忽略的前面而只研究后面的东西,则只能取其形,难以会其意。 -### PS: 由于本人水平有限,某些地方可能存在误解或不准确,如果你对此有疑问可以提交Issues进行反馈。 +#### PS: 由于本人水平有限,某些地方可能存在误解或不准确,如果你对此有疑问可以提交Issues进行反馈。 ## About Me From 933011cafd641a6f5a7bbf1273e824bba2d4e2e4 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 03:36:32 +0800 Subject: [PATCH 073/615] Update --- CustomView/Advance/[8]Path_Play.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 2a0c34ad..4935dcdc 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -528,7 +528,7 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: ## 总结 -本文中虽然后面点内容看起来比较高大上,但前面看起来啰嗦的废话才是真正的干货,把前面的东西学会了,以后各种效果基本上都是信手拈来,如果忽略的前面而只研究后面的东西,则只能取其形,难以会其意。 +**本文中虽然后面点内容看起来比较高大上,但前面看起来啰嗦的废话才是真正的干货,把前面的东西学会了,以后各种效果基本上都是信手拈来,如果忽略的前面而只研究后面的东西,则只能取其形,难以会其意。** #### PS: 由于本人水平有限,某些地方可能存在误解或不准确,如果你对此有疑问可以提交Issues进行反馈。 From 2a8600db8e5a750dea2cd7f8d6ee81986abb14c0 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 12:31:04 +0800 Subject: [PATCH 074/615] Update --- CustomView/Advance/[8]Path_Play.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 4935dcdc..01a2021c 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -66,13 +66,13 @@ PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 用这个构造函数是创建一个 PathMeasure 并关联一个 Path, 其实和创建一个空的 PathMeasure 后调用 setPath 进行关联效果是一样的,同样,被关联的 Path 也必须是已经创建好的,如果关联之后 Path 内容进行了更改,则需要使用 setPath 方法重新关联。 -该方法有两个参数,第一个参数自然就是被关联的 Path 了,第二个参数是用来确保 Path 闭合,如果设置为 true, 则不论之前Path是否闭合,都会自动闭合该 Path。 +该方法有两个参数,第一个参数自然就是被关联的 Path 了,第二个参数是用来确保 Path 闭合,如果设置为 true, 则不论之前Path是否闭合,都会自动闭合该 Path(如果Path可以闭合的话)。 **在这里有两点需要明确:** > -* 1. 不论 forceClosed 设置为何种状态(true 或者 false), 都不会影响原有Path的状态,**即 Path 与 PathMeasure 关联之后,Path不会有任何改变。** -* 2. forceClosed 的设置状态可能会影响测量结果,**如果 Path 未闭合但在与 PathMeasure 关联的时候设置 forceClosed 为 true 时,测量结果可能会比 Path 实际长度稍长一点。** +* 1. 不论 forceClosed 设置为何种状态(true 或者 false), 都不会影响原有Path的状态,**即 Path 与 PathMeasure 关联之后,之前的的 Path 不会有任何改变。** +* 2. forceClosed 的设置状态可能会影响测量结果,**如果 Path 未闭合但在与 PathMeasure 关联的时候设置 forceClosed 为 true 时,测量结果可能会比 Path 实际长度稍长一点,获取到到是该 Path 闭合时的状态。** 下面我们用一个例子来验证一下: @@ -140,7 +140,7 @@ getSegment 用于获取Path的一个片段,方法如下: 参数 | 作用 | 备注 ----------------|----------------------------------|-------------------------------------------- -返回值(boolean) | 判断截取是否成功 | 如果返回值为 false 表示截取失败,不会改变dst中内容 +返回值(boolean) | 判断截取是否成功 | true 表示截取成功,结果存入dst中,false 截取失败,不会改变dst中内容 startD | 开始截取位置距离 Path 起点的长度 | 取值范围: 0 <= startD < stopD <= Path总长度 stopD | 结束截取位置距离 Path 起点的长度 | 取值范围: 0 <= startD < stopD <= Path总长度 dst | 截取的 Path 将会添加到 dst 中 | 注意: 是添加,而不是替换 @@ -243,7 +243,7 @@ false | 保证存储截取片段的 Path(dst) 的连续性 我们知道 Path 可以由多条曲线构成,但不论是 getLength , getgetSegment 或者是其它方法,都只会在其中第一条线段上运行,而这个 `nextContour` 就是用于跳转到下一条曲线到方法,_如果跳转成功,则返回 true, 如果跳转失败,则返回 false。_ -如下,我们创建了一个 Path 并使其中包含了两个闭合的曲线,外面的边长是400,内部的边长是200,现在我们使用 PathMeasure 分别测量两条曲线的总长度。 +如下,我们创建了一个 Path 并使其中包含了两个闭合的曲线,内部的边长是200,外面的边长是400,现在我们使用 PathMeasure 分别测量两条曲线的总长度。 ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f4ctzjr08dj308c0et74c.jpg) @@ -279,8 +279,8 @@ log输出结果: 通过测试,我们可以得到以下内容: -* 1.使用图形中线的顺序与在 Path 中添加的顺序有关。 -* 2.getLength 获取到到是当前一条曲线分长度,而不是整个 Path 到长度。 +* 1.曲线的顺序与 Path 中添加的顺序有关。 +* 2.getLength 获取到到是当前一条曲线分长度,而不是整个 Path 的长度。 * 3.getLength 等方法是针对当前的曲线(其它方法请自行验证)。 From 06acfc3f481d3f8d58febbdd718cf6ab02c7af61 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 12:38:39 +0800 Subject: [PATCH 075/615] Update --- CustomView/Advance/[8]Path_Play.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 01a2021c..06f185b7 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -528,7 +528,7 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: ## 总结 -**本文中虽然后面点内容看起来比较高大上,但前面看起来啰嗦的废话才是真正的干货,把前面的东西学会了,以后各种效果基本上都是信手拈来,如果忽略的前面而只研究后面的东西,则只能取其形,难以会其意。** +**本文中虽然后面的内容看起来比较高大上一点,但前面"啰嗦"的废话才是真正的干货,把前面的东西学会了,后面的各种效果都能信手拈来,如果只研究后面的东西,则是取其形,而难以会其意。** #### PS: 由于本人水平有限,某些地方可能存在误解或不准确,如果你对此有疑问可以提交Issues进行反馈。 From d67136c57787e98f3931bbfb060879c72bd205f0 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 12:50:02 +0800 Subject: [PATCH 076/615] Update --- CustomView/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CustomView/README.md b/CustomView/README.md index 28fcc8ab..485bd509 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -31,6 +31,7 @@

+

### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From b7381a429749021397fd45eb9cebb795296e6169 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 2 Jun 2016 12:52:42 +0800 Subject: [PATCH 077/615] Update --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 498d1c4a..9e2226bf 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,9 @@ 08 | [安卓自定义View进阶 - Path基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) 09 | [安卓自定义View进阶 - 贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) 10 | [安卓自定义View进阶 - Path完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) - + 11 | [安卓自定义View进阶 - Path玩出花样](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B8%5DPath_Play.md) + + ****** ## [教程类](https://github.com/GcsSloop/AndroidNote/tree/master/Course) From 8a4ba8c0fb83d661bece0c5e89fbd280cc27d3de Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 3 Jun 2016 02:23:15 +0800 Subject: [PATCH 078/615] Update --- CustomView/Advance/[8]Path_Play.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index 06f185b7..eeca557b 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -1,4 +1,4 @@ -# Path之玩出花样 +# Path之玩出花样(PathMeasure) ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) From dafd65bcab64baec26804bb7bd64b715fc465089 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 3 Jun 2016 10:56:35 +0800 Subject: [PATCH 079/615] Update --- CustomView/Advance/[7]Path_Over.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[7]Path_Over.md b/CustomView/Advance/[7]Path_Over.md index 122c0586..b8c3afde 100644 --- a/CustomView/Advance/[7]Path_Over.md +++ b/CustomView/Advance/[7]Path_Over.md @@ -82,7 +82,7 @@ rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是 方法 | 判定条件 | 解释 ---------------|-----------------------------------------------|---------------- 奇偶规则 | 奇数表示在图形内,偶数表示在图形外 | 从任意位置p作一条射线, 若与该射线相交的图形边的数目为奇数,则p是图形内部点,否则是外部点。 -非零环绕数规则 | 若环绕数为0表示在图形内,非零表示在图形外 | 首先使图形的边变为矢量。将环绕数初始化为零。再从任意位置p作一条射线。当从p点沿射线方向移动时,对在每个方向上穿过射线的边计数,每当图形的边从右到左穿过射线时,环绕数加1,从左到右时,环绕数减1。处理完图形的所有相关边之后,若环绕数为非零,则p为内部点,否则,p是外部点。 +非零环绕数规则 | 若环绕数为0表示在图形外,非零表示在图形内 | 首先使图形的边变为矢量。将环绕数初始化为零。再从任意位置p作一条射线。当从p点沿射线方向移动时,对在每个方向上穿过射线的边计数,每当图形的边从右到左穿过射线时,环绕数加1,从左到右时,环绕数减1。处理完图形的所有相关边之后,若环绕数为非零,则p为内部点,否则,p是外部点。 接下来我们先了解一下两种判断方法是如何工作的。 From 1709949bd340ac2058064ab2483166576f52a79a Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 4 Jun 2016 09:32:34 +0800 Subject: [PATCH 080/615] Update --- CustomView/Advance/[4]Canvas_PictureText.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[4]Canvas_PictureText.md b/CustomView/Advance/[4]Canvas_PictureText.md index 2203ff86..a4a74dd3 100644 --- a/CustomView/Advance/[4]Canvas_PictureText.md +++ b/CustomView/Advance/[4]Canvas_PictureText.md @@ -266,7 +266,7 @@ PS:图片左上角位置默认为坐标原点。 > 关于Matrix和Paint暂时略过吧,一展开又是啰啰嗦嗦一大段,反正挖坑已经是常态了,大家应该也习惯了(PAP). - + 第二种方法就是在绘制时指定了图片左上角的坐标(距离坐标原点的距离): @@ -276,7 +276,7 @@ PS:图片左上角位置默认为坐标原点。 canvas.drawBitmap(bitmap,200,500,new Paint()); ``` - + 第三种方法比较有意思,上面多了两个矩形区域(src,dst),这两个矩形选区是干什么用的? @@ -299,7 +299,7 @@ Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域 // 绘制图片 canvas.drawBitmap(bitmap,src,dst,null); ``` - + **详解:** @@ -309,7 +309,7 @@ Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域 然后用dst指定了绘制在屏幕上的绘制,即下图中蓝色方框标注的区域,图片宽高会根据指定的区域自动进行缩放。 - + 从上面可知,第三种方法可以绘制图片的一部分到画布上,这有什么用呢? From cdf6f3b33fa6533f577bd3d46a07bbe2960f79e3 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 4 Jun 2016 10:01:20 +0800 Subject: [PATCH 081/615] Update --- CustomView/Advance/[5]Path_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[5]Path_Basic.md b/CustomView/Advance/[5]Path_Basic.md index a20865f2..acd7df0c 100644 --- a/CustomView/Advance/[5]Path_Basic.md +++ b/CustomView/Advance/[5]Path_Basic.md @@ -367,7 +367,7 @@ CCW | counter-clockwise | 逆时针 canvas.drawPath(path,mPaint); ``` - + 首先我们新建地方两个Path(矩形和圆形)中心都是坐标原点,我们在将包含圆形的path添加到包含矩形的path之前将其进行移动了一段距离,最终绘制出来的效果就如上面所示。 From 08c7617371dfc88cf92fb10f0af370cd50cc88aa Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 6 Jun 2016 08:41:43 +0800 Subject: [PATCH 082/615] Update --- CustomView/Advance/[9]Matrix.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 CustomView/Advance/[9]Matrix.md diff --git a/CustomView/Advance/[9]Matrix.md b/CustomView/Advance/[9]Matrix.md new file mode 100644 index 00000000..f417dac9 --- /dev/null +++ b/CustomView/Advance/[9]Matrix.md @@ -0,0 +1 @@ +# Matrix From 5ab850e3f030bd318451c36b5aceb2b57d7a3b07 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 6 Jun 2016 17:39:12 +0800 Subject: [PATCH 083/615] Update --- CustomView/Advance/[9]Matrix.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CustomView/Advance/[9]Matrix.md b/CustomView/Advance/[9]Matrix.md index f417dac9..91f286f5 100644 --- a/CustomView/Advance/[9]Matrix.md +++ b/CustomView/Advance/[9]Matrix.md @@ -1 +1,8 @@ # Matrix + +前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix,没错,就是传说中的黑客帝国: + + + + + From 36bbb9061d257143ae4053970811fb8cd6edb7bf Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 9 Jun 2016 14:44:10 +0800 Subject: [PATCH 084/615] Update --- CustomView/Advance/[9]Matrix.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CustomView/Advance/[9]Matrix.md b/CustomView/Advance/[9]Matrix.md index 91f286f5..b5df9dab 100644 --- a/CustomView/Advance/[9]Matrix.md +++ b/CustomView/Advance/[9]Matrix.md @@ -2,6 +2,7 @@ 前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix,没错,就是传说中的黑客帝国: +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) From ee9474645ac44218ba31eed3be9f4becaacff137 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 10 Jun 2016 02:41:55 +0800 Subject: [PATCH 085/615] Update --- CustomView/Advance/[9]Matrix.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CustomView/Advance/[9]Matrix.md b/CustomView/Advance/[9]Matrix.md index b5df9dab..0ec7e7e6 100644 --- a/CustomView/Advance/[9]Matrix.md +++ b/CustomView/Advance/[9]Matrix.md @@ -4,6 +4,14 @@ ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) +勇敢的骚年啊,你是选择红药丸还是选择蓝药丸呢? + +> +我选蓝色的,不要问我为什么。 + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4pji1l0lej308c04pwer.jpg) + +好了,言止于此,不能说更多了,下面开始我们本篇的正题。 From 96d469802c6c3b255d3de7fbd1d5174cd54ed877 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 10 Jun 2016 13:55:01 +0800 Subject: [PATCH 086/615] Update --- CustomView/Advance/[9]Matrix.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CustomView/Advance/[9]Matrix.md b/CustomView/Advance/[9]Matrix.md index 0ec7e7e6..5de34568 100644 --- a/CustomView/Advance/[9]Matrix.md +++ b/CustomView/Advance/[9]Matrix.md @@ -13,5 +13,8 @@ 好了,言止于此,不能说更多了,下面开始我们本篇的正题。 +## 前言 + +如题,本篇的主角是 matrix,先回想一下,我们之前在哪些文章中见过 matrix? From b8ba86cec7b652af1052a8273ae069dcf6b7d48c Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 11 Jun 2016 01:27:44 +0800 Subject: [PATCH 087/615] Update --- CustomView/Advance/[9]Matrix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix.md b/CustomView/Advance/[9]Matrix.md index 5de34568..e5837802 100644 --- a/CustomView/Advance/[9]Matrix.md +++ b/CustomView/Advance/[9]Matrix.md @@ -15,6 +15,6 @@ ## 前言 -如题,本篇的主角是 matrix,先回想一下,我们之前在哪些文章中见过 matrix? +如题,本篇的主角是 matrix(矩阵),先回想一下,我们之前在哪些文章中见过 matrix? From 83f329c16954cac24d0240b30c23f3a6fa6e0ae9 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 11 Jun 2016 19:27:17 +0800 Subject: [PATCH 088/615] Update --- CustomView/Advance/[9]Matrix.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix.md b/CustomView/Advance/[9]Matrix.md index e5837802..de427932 100644 --- a/CustomView/Advance/[9]Matrix.md +++ b/CustomView/Advance/[9]Matrix.md @@ -15,6 +15,8 @@ ## 前言 -如题,本篇的主角是 matrix(矩阵),先回想一下,我们之前在哪些文章中见过 matrix? +如题,本篇的主角是 Matrix,在 Canvas 中很多地方都有 Matrix 的身影,如: 画布操作,drawBitmap,path 等。几乎无处不在,那么 Matrix 到底是干什么的呢? +> +**Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。** From fda16bb37eb26edeabf98bf10321a62d51c5cefd Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 11 Jun 2016 21:33:47 +0800 Subject: [PATCH 089/615] Update --- CustomView/Advance/{[9]Matrix.md => [9]Matrix_basic.md} | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename CustomView/Advance/{[9]Matrix.md => [9]Matrix_basic.md} (97%) diff --git a/CustomView/Advance/[9]Matrix.md b/CustomView/Advance/[9]Matrix_basic.md similarity index 97% rename from CustomView/Advance/[9]Matrix.md rename to CustomView/Advance/[9]Matrix_basic.md index de427932..761eeb5d 100644 --- a/CustomView/Advance/[9]Matrix.md +++ b/CustomView/Advance/[9]Matrix_basic.md @@ -1,4 +1,4 @@ -# Matrix +# Matrix基础 前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix,没错,就是传说中的黑客帝国: @@ -20,3 +20,4 @@ > **Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。** +## From 6d45eb3db2087dc90b1ab350a11eef0e8e0ea5c7 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 11 Jun 2016 21:46:30 +0800 Subject: [PATCH 090/615] Update --- .../Advance/{[9]Matrix_basic.md => [9]Matrix_Basic.md} | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) rename CustomView/Advance/{[9]Matrix_basic.md => [9]Matrix_Basic.md} (77%) diff --git a/CustomView/Advance/[9]Matrix_basic.md b/CustomView/Advance/[9]Matrix_Basic.md similarity index 77% rename from CustomView/Advance/[9]Matrix_basic.md rename to CustomView/Advance/[9]Matrix_Basic.md index 761eeb5d..251aae8e 100644 --- a/CustomView/Advance/[9]Matrix_basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -20,4 +20,8 @@ > **Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。** -## +我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过不少画布相关操作,这些操作的核心就是是在操作 Matrix + +## Matrix方法表 + + From 0497f4964b6f104d60f44a733ccf5063ca27b04e Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 12 Jun 2016 21:49:32 +0800 Subject: [PATCH 091/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 251aae8e..6f0fc897 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -24,4 +24,6 @@ ## Matrix方法表 +方法类别 | 相关API | 摘要 +---|---|--- From e2c2042cea75c0f6e3aba67172cc2c13836268c1 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 13 Jun 2016 17:01:01 +0800 Subject: [PATCH 092/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 6f0fc897..95616104 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -20,10 +20,30 @@ > **Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。** -我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过不少画布相关操作,这些操作的核心就是是在操作 Matrix +我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过不少画布相关操作,这些操作的核心就是是操作 Matrix ## Matrix方法表 +Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 + 方法类别 | 相关API | 摘要 ---|---|--- +比较 | equals | 比较两个矩阵是否相同 +获取数值 | getValues | 获取矩阵的数值 +获取哈希值 | hashCode | 获取矩阵的哈希值 +获取逆矩阵 | invert | 如果矩阵可逆,获取其逆矩阵 +是否是仿射矩阵 | isAffine |判断是否是仿射矩阵 +是否是单位矩阵 | isIdentity | 判断是否是单位矩阵 +获取变换后位置 | mapPoints | 计算一个点在变换后的位置 + + + + + + + + + + + From 8b213f64b8dbcebcb53337adfbe71c29b5c780e5 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 14 Jun 2016 04:10:46 +0800 Subject: [PATCH 093/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 95616104..19534e6c 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -34,7 +34,8 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 获取逆矩阵 | invert | 如果矩阵可逆,获取其逆矩阵 是否是仿射矩阵 | isAffine |判断是否是仿射矩阵 是否是单位矩阵 | isIdentity | 判断是否是单位矩阵 -获取变换后位置 | mapPoints | 计算一个点在变换后的位置 +获取变换后位置 | mapPoints | 计算一个点在变换后点的位置 +获取变换后位置 | mapRect | 计算一个矩形变换后点位置 From 5885182064d24257da53867ef38f1eb724859991 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 14 Jun 2016 17:11:26 +0800 Subject: [PATCH 094/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 19534e6c..58085b49 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -36,6 +36,9 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 是否是单位矩阵 | isIdentity | 判断是否是单位矩阵 获取变换后位置 | mapPoints | 计算一个点在变换后点的位置 获取变换后位置 | mapRect | 计算一个矩形变换后点位置 +获取变换后位置 | mapVectors | 计算一个向量阵列变换后点位置 + + From 6390806acffae4f683e6b1f513578424a958aca1 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 22 Jun 2016 13:05:02 +0800 Subject: [PATCH 095/615] Update --- CustomView/Advance/Res/Checkmark.png | Bin 0 -> 9067 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 CustomView/Advance/Res/Checkmark.png diff --git a/CustomView/Advance/Res/Checkmark.png b/CustomView/Advance/Res/Checkmark.png new file mode 100755 index 0000000000000000000000000000000000000000..b8b881ce540cf69c06d88a9072210a5992078895 GIT binary patch literal 9067 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 QF$lYgx{fSTzZLwy0He!$YybcN literal 0 HcmV?d00001 From 5c3db916b437cab7757fcc87b9be0f082ee69398 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 22 Jun 2016 13:07:44 +0800 Subject: [PATCH 096/615] Update --- CustomView/Advance/[4]Canvas_PictureText.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[4]Canvas_PictureText.md b/CustomView/Advance/[4]Canvas_PictureText.md index a4a74dd3..401d21a4 100644 --- a/CustomView/Advance/[4]Canvas_PictureText.md +++ b/CustomView/Advance/[4]Canvas_PictureText.md @@ -327,7 +327,7 @@ Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域 资源文件如下: -![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f2kytmbjrnj310402s3yo.jpg) +![](https://raw.githubusercontent.com/GcsSloop/AndroidNote/master/CustomView/Advance/Res/Checkmark.png) 最终效果如下: From 81cfb68fc252a61c20e8c14aadd27fae35775f40 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 01:32:34 +0800 Subject: [PATCH 097/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 58085b49..cdc8940f 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -37,8 +37,7 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 获取变换后位置 | mapPoints | 计算一个点在变换后点的位置 获取变换后位置 | mapRect | 计算一个矩形变换后点位置 获取变换后位置 | mapVectors | 计算一个向量阵列变换后点位置 - - +后乘 | postConcat | 原始矩阵后乘一个新的矩阵 From 595fb7a4fb824be545e875605f339d6e42475305 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 20:49:05 +0800 Subject: [PATCH 098/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index cdc8940f..4369dff0 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -26,18 +26,18 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 -方法类别 | 相关API | 摘要 ----|---|--- -比较 | equals | 比较两个矩阵是否相同 -获取数值 | getValues | 获取矩阵的数值 -获取哈希值 | hashCode | 获取矩阵的哈希值 -获取逆矩阵 | invert | 如果矩阵可逆,获取其逆矩阵 -是否是仿射矩阵 | isAffine |判断是否是仿射矩阵 -是否是单位矩阵 | isIdentity | 判断是否是单位矩阵 -获取变换后位置 | mapPoints | 计算一个点在变换后点的位置 -获取变换后位置 | mapRect | 计算一个矩形变换后点位置 -获取变换后位置 | mapVectors | 计算一个向量阵列变换后点位置 -后乘 | postConcat | 原始矩阵后乘一个新的矩阵 +方法类别 | 相关API | 摘要 +-----------|---------------------------------------------------------|------------------------------------- +比较方法 | equals hashCode | 比较、 获取哈希值 +基本方法 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值 +矩阵相关 | invert isAffine isIdentity | 计算逆矩阵、 是否是仿射矩阵、 是否是单位矩阵 +数值计算 | mapPoints mapRect mapVectors | 计算 点、 矩形、 阵列 经过变换后点位置 +设置(set) | setConcat setRotate setScale setSkew setTranslate | 设置变换 +前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘变换 +后乘(post) | postConcat postRotate postScale postSkew postTranslate | 后乘变换 + + + From f20ff451c96ab243a1f85b3d2813aa6225537fb3 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 20:55:15 +0800 Subject: [PATCH 099/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 4369dff0..647ebb0d 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -3,7 +3,7 @@ 前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix,没错,就是传说中的黑客帝国: ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) - +

勇敢的骚年啊,你是选择红药丸还是选择蓝药丸呢? > @@ -12,7 +12,7 @@ ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4pji1l0lej308c04pwer.jpg) 好了,言止于此,不能说更多了,下面开始我们本篇的正题。 - +

## 前言 如题,本篇的主角是 Matrix,在 Canvas 中很多地方都有 Matrix 的身影,如: 画布操作,drawBitmap,path 等。几乎无处不在,那么 Matrix 到底是干什么的呢? From 7e638fdb49442ef57f0d88e7187c57aeb9264a6e Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 21:00:31 +0800 Subject: [PATCH 100/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 647ebb0d..5c8603b6 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -2,17 +2,20 @@ 前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix,没错,就是传说中的黑客帝国: -![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) -

+

+ +

+

勇敢的骚年啊,你是选择红药丸还是选择蓝药丸呢? -> +

我选蓝色的,不要问我为什么。 +
-![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4pji1l0lej308c04pwer.jpg) +
好了,言止于此,不能说更多了,下面开始我们本篇的正题。 -

+

## 前言 如题,本篇的主角是 Matrix,在 Canvas 中很多地方都有 Matrix 的身影,如: 画布操作,drawBitmap,path 等。几乎无处不在,那么 Matrix 到底是干什么的呢? From 75f7a1f6cd8580143960a28ecc47b9afd596e7bb Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 21:08:19 +0800 Subject: [PATCH 101/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 5c8603b6..f98935f0 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -2,10 +2,11 @@ 前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix,没错,就是传说中的黑客帝国: -

+

-

+ +

勇敢的骚年啊,你是选择红药丸还是选择蓝药丸呢?

@@ -16,6 +17,7 @@ 好了,言止于此,不能说更多了,下面开始我们本篇的正题。

+ ## 前言 如题,本篇的主角是 Matrix,在 Canvas 中很多地方都有 Matrix 的身影,如: 画布操作,drawBitmap,path 等。几乎无处不在,那么 Matrix 到底是干什么的呢? From 10d91d6a0177e5ffdb7f35793688247e8bbfb9b4 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 21:09:51 +0800 Subject: [PATCH 102/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index f98935f0..259feb3c 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -2,11 +2,10 @@ 前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix,没错,就是传说中的黑客帝国: -

+

-

- -

+

+
勇敢的骚年啊,你是选择红药丸还是选择蓝药丸呢?
@@ -16,7 +15,7 @@
好了,言止于此,不能说更多了,下面开始我们本篇的正题。 -

+
## 前言 From 225c2f9b137dc06717b7e46abc5a74d652518a70 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 21:10:54 +0800 Subject: [PATCH 103/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 259feb3c..a93a2193 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -2,10 +2,10 @@ 前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix,没错,就是传说中的黑客帝国: -
+
-
+
勇敢的骚年啊,你是选择红药丸还是选择蓝药丸呢?
From 5c67f4fa02330344f0a911e421de5157d381ef32 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 21:16:22 +0800 Subject: [PATCH 104/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index a93a2193..2a725841 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -1,25 +1,12 @@ # Matrix基础 -前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix,没错,就是传说中的黑客帝国: +前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix(传说中的黑客帝国!!!): -
- -
-
-勇敢的骚年啊,你是选择红药丸还是选择蓝药丸呢? +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) -
-我选蓝色的,不要问我为什么。 -
+如题,本篇的主角是 Matrix(并不是黑客帝国来着),我们之前在很多地方都见过 Matrix 的身影,如: 画布操作,drawBitmap,path 等。 -
- -好了,言止于此,不能说更多了,下面开始我们本篇的正题。 -
- -## 前言 - -如题,本篇的主角是 Matrix,在 Canvas 中很多地方都有 Matrix 的身影,如: 画布操作,drawBitmap,path 等。几乎无处不在,那么 Matrix 到底是干什么的呢? +实际上,在2D绘图这一部分,处处都有着 Matrix 的影响,这个如此厉害的 Matrix 到底是什么呢? > **Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。** From be7814f540e5e401118ea01bb2ea3b2833f8003a Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 21:17:24 +0800 Subject: [PATCH 105/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 2a725841..3a4ec47b 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -11,7 +11,7 @@ > **Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。** -我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过不少画布相关操作,这些操作的核心就是是操作 Matrix +我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过不少画布相关操作,这些操作的核心就是改变 Matrix 的数值。 ## Matrix方法表 From 62aeaad7893f60769e6570e62988a5aecb2d3c0f Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 21:30:06 +0800 Subject: [PATCH 106/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 3a4ec47b..f3138dff 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -4,9 +4,11 @@ ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) -如题,本篇的主角是 Matrix(并不是黑客帝国来着),我们之前在很多地方都见过 Matrix 的身影,如: 画布操作,drawBitmap,path 等。 +如题,本篇的主角是 Matrix(其实并不是黑客帝国来着)。 -实际上,在2D绘图这一部分,处处都有着 Matrix 的影响,这个如此厉害的 Matrix 到底是什么呢? +仔细会想一下,我们在很多地方都见过 Matrix(画布操作,drawBitmap,path 等), 感觉它就像是一个烦人家伙,什么事情都想插上一脚。 然而实际情况却并非如此, Matrix 一直都在我们看不到的地方默默付出着, 如果没有了 Matrix, 我们之前的很多方法都是无法运行的。 + +这么说来 Matrix 也算个厉害人物,那么这个 Matrix 到底是何方神圣呢? > **Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。** From c8d724268c5812d041f3841e7da0eea3589019c2 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 21:32:11 +0800 Subject: [PATCH 107/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index f3138dff..dee17f77 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -6,14 +6,14 @@ 如题,本篇的主角是 Matrix(其实并不是黑客帝国来着)。 -仔细会想一下,我们在很多地方都见过 Matrix(画布操作,drawBitmap,path 等), 感觉它就像是一个烦人家伙,什么事情都想插上一脚。 然而实际情况却并非如此, Matrix 一直都在我们看不到的地方默默付出着, 如果没有了 Matrix, 我们之前的很多方法都是无法运行的。 +仔细回想一下,我们在很多地方都见过 Matrix(画布操作,drawBitmap,path 等), 感觉它就像是一个烦人家伙,什么事情都想插上一脚。 然而实际情况却并非如此, Matrix 一直都在我们看不到的地方默默付出着, 如果没有了 Matrix, 我们之前的很多方法都是无法运行的。 这么说来 Matrix 也算个厉害人物,那么这个 Matrix 到底是何方神圣呢? > **Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。** -我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过不少画布相关操作,这些操作的核心就是改变 Matrix 的数值。 +也就是说, 我们进行界面视图等转换都是需要依靠 Matrix 的帮助的,例如我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的画布操作,这些操作的核心就是改变 Matrix 的数值。 ## Matrix方法表 From 60a74ebcd57c4d4ba769c2de043e60cdd1cce224 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 21:32:58 +0800 Subject: [PATCH 108/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index dee17f77..723d7fe9 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -11,7 +11,7 @@ 这么说来 Matrix 也算个厉害人物,那么这个 Matrix 到底是何方神圣呢? > -**Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。** +#### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 也就是说, 我们进行界面视图等转换都是需要依靠 Matrix 的帮助的,例如我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的画布操作,这些操作的核心就是改变 Matrix 的数值。 From 55350baaf4eb55f2813ecc80c8035a9a2ecbe8fe Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 21:49:00 +0800 Subject: [PATCH 109/615] Merge * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update * Update --- CustomView/Advance/[9]Matrix_Basic.md | 40 +++++++++++---------------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 58085b49..723d7fe9 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -1,42 +1,34 @@ # Matrix基础 -前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix,没错,就是传说中的黑客帝国: +前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix(传说中的黑客帝国!!!): ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) -勇敢的骚年啊,你是选择红药丸还是选择蓝药丸呢? +如题,本篇的主角是 Matrix(其实并不是黑客帝国来着)。 -> -我选蓝色的,不要问我为什么。 +仔细回想一下,我们在很多地方都见过 Matrix(画布操作,drawBitmap,path 等), 感觉它就像是一个烦人家伙,什么事情都想插上一脚。 然而实际情况却并非如此, Matrix 一直都在我们看不到的地方默默付出着, 如果没有了 Matrix, 我们之前的很多方法都是无法运行的。 -![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4pji1l0lej308c04pwer.jpg) - -好了,言止于此,不能说更多了,下面开始我们本篇的正题。 - -## 前言 - -如题,本篇的主角是 Matrix,在 Canvas 中很多地方都有 Matrix 的身影,如: 画布操作,drawBitmap,path 等。几乎无处不在,那么 Matrix 到底是干什么的呢? +这么说来 Matrix 也算个厉害人物,那么这个 Matrix 到底是何方神圣呢? > -**Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。** +#### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 -我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过不少画布相关操作,这些操作的核心就是是操作 Matrix +也就是说, 我们进行界面视图等转换都是需要依靠 Matrix 的帮助的,例如我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的画布操作,这些操作的核心就是改变 Matrix 的数值。 ## Matrix方法表 Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 -方法类别 | 相关API | 摘要 ----|---|--- -比较 | equals | 比较两个矩阵是否相同 -获取数值 | getValues | 获取矩阵的数值 -获取哈希值 | hashCode | 获取矩阵的哈希值 -获取逆矩阵 | invert | 如果矩阵可逆,获取其逆矩阵 -是否是仿射矩阵 | isAffine |判断是否是仿射矩阵 -是否是单位矩阵 | isIdentity | 判断是否是单位矩阵 -获取变换后位置 | mapPoints | 计算一个点在变换后点的位置 -获取变换后位置 | mapRect | 计算一个矩形变换后点位置 -获取变换后位置 | mapVectors | 计算一个向量阵列变换后点位置 +方法类别 | 相关API | 摘要 +-----------|---------------------------------------------------------|------------------------------------- +比较方法 | equals hashCode | 比较、 获取哈希值 +基本方法 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值 +矩阵相关 | invert isAffine isIdentity | 计算逆矩阵、 是否是仿射矩阵、 是否是单位矩阵 +数值计算 | mapPoints mapRect mapVectors | 计算 点、 矩形、 阵列 经过变换后点位置 +设置(set) | setConcat setRotate setScale setSkew setTranslate | 设置变换 +前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘变换 +后乘(post) | postConcat postRotate postScale postSkew postTranslate | 后乘变换 + From 930c0c72561efb8a8dd6e459485b101eed83064d Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 22:16:19 +0800 Subject: [PATCH 110/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 723d7fe9..837bac4f 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -20,14 +20,15 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 方法类别 | 相关API | 摘要 ------------|---------------------------------------------------------|------------------------------------- +-----------|---------------------------------------------------------|------------------------ 比较方法 | equals hashCode | 比较、 获取哈希值 -基本方法 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值 -矩阵相关 | invert isAffine isIdentity | 计算逆矩阵、 是否是仿射矩阵、 是否是单位矩阵 -数值计算 | mapPoints mapRect mapVectors | 计算 点、 矩形、 阵列 经过变换后点位置 +基本方法 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值 +数值计算 | mapPoints mapRect mapVectors | 计算变换后的数值 设置(set) | setConcat setRotate setScale setSkew setTranslate | 设置变换 前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘变换 后乘(post) | postConcat postRotate postScale postSkew postTranslate | 后乘变换 +特殊方法 | invert isAffine isIdentity | 逆矩阵、 是否是仿射矩阵、 是否是单位矩阵 +其它方法 | From dc1d2a1c870c848d34b604163a4fdcdfff2450a3 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 22:20:36 +0800 Subject: [PATCH 111/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 837bac4f..c4ea87a3 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -23,12 +23,12 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 -----------|---------------------------------------------------------|------------------------ 比较方法 | equals hashCode | 比较、 获取哈希值 基本方法 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值 -数值计算 | mapPoints mapRect mapVectors | 计算变换后的数值 +数值计算 | mapPoints mapRadius mapRect mapVectors | 计算变换后的数值 设置(set) | setConcat setRotate setScale setSkew setTranslate | 设置变换 前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘变换 后乘(post) | postConcat postRotate postScale postSkew postTranslate | 后乘变换 -特殊方法 | invert isAffine isIdentity | 逆矩阵、 是否是仿射矩阵、 是否是单位矩阵 -其它方法 | +特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 +其它方法 | invert isAffine isIdentity toString toShortString | 逆矩阵、 是否是仿射矩阵、 是否是单位矩阵 ... From 5c3bf7a703615009f54f56b459a37849afe146c8 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 22:28:43 +0800 Subject: [PATCH 112/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index c4ea87a3..b7aff4bd 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -27,8 +27,8 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 设置(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 toString toShortString | 逆矩阵、 是否是仿射矩阵、 是否是单位矩阵 ... +特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 +其它方法 | invert isAffine isIdentity toString toShortString | 逆矩阵、 是否是仿射矩阵、 是否是单位矩阵 ... From dd803c2e58a5c84a2b933bf75605e4c8fb409264 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 22:31:43 +0800 Subject: [PATCH 113/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index b7aff4bd..589ffea3 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -27,8 +27,9 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 设置(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 toString toShortString | 逆矩阵、 是否是仿射矩阵、 是否是单位矩阵 ... +特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 +其它方法 | invert isAffine isIdentity toString toShortString | 逆矩阵、 是否是仿射矩阵、 是否是单位矩阵 ... + From 2a887c29dda239cec980574fed7fd3e93bba67e9 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 26 Jun 2016 23:14:36 +0800 Subject: [PATCH 114/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 589ffea3..3aca64f4 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -30,6 +30,7 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 其它方法 | invert isAffine isIdentity toString toShortString | 逆矩阵、 是否是仿射矩阵、 是否是单位矩阵 ... +## Matrix原理 From 2d07b45701853d9695042c6af2b0e77b9d96a189 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 27 Jun 2016 12:48:38 +0800 Subject: [PATCH 115/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 3aca64f4..47d99cc1 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -6,7 +6,7 @@ 如题,本篇的主角是 Matrix(其实并不是黑客帝国来着)。 -仔细回想一下,我们在很多地方都见过 Matrix(画布操作,drawBitmap,path 等), 感觉它就像是一个烦人家伙,什么事情都想插上一脚。 然而实际情况却并非如此, Matrix 一直都在我们看不到的地方默默付出着, 如果没有了 Matrix, 我们之前的很多方法都是无法运行的。 +仔细回想一下,我们在很多地方都见过 Matrix(画布操作,drawBitmap,path 等), 感觉它就像是一个烦人家伙,什么事情都想插上一脚。 然而实际情况却并非如此, Matrix 一直都在我们没有注意到到地方默默付出着, 如果没有了 Matrix, 我们之前的很多方法都是无法运行的。 这么说来 Matrix 也算个厉害人物,那么这个 Matrix 到底是何方神圣呢? From c8bf3bb1446ebafd571ee898fe3f3c0b40ce17af Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 27 Jun 2016 19:47:50 +0800 Subject: [PATCH 116/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 3aca64f4..f14b0567 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -32,6 +32,7 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 ## Matrix原理 +Matrix 本质是一个 3 x 3 的矩阵。 From eaa78a867998b1e060b351dad620cf9eacc5d349 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 27 Jun 2016 19:49:29 +0800 Subject: [PATCH 117/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 47d99cc1..b5847b9f 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -32,7 +32,7 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 ## Matrix原理 - +Matrix 本质是一个 3x3 的矩阵。 From 0250af36a437f593735a4f970c86628ce07a9b24 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 27 Jun 2016 21:51:32 +0800 Subject: [PATCH 118/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 76760315..076aae58 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -21,14 +21,14 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 方法类别 | 相关API | 摘要 -----------|---------------------------------------------------------|------------------------ -比较方法 | equals hashCode | 比较、 获取哈希值 -基本方法 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值 -数值计算 | mapPoints mapRadius mapRect mapVectors | 计算变换后的数值 +基本方法 | equals hashCode toString toShortString | 比较、 获取哈希值、 转换为字符串 +数值操作 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值 设置(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 toString toShortString | 逆矩阵、 是否是仿射矩阵、 是否是单位矩阵 ... +数值计算 | mapPoints mapRadius mapRect mapVectors | 计算变换后的数值 +特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 +矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... ## Matrix原理 From 03eb8c6ea3375439477e429ac0360f0b75954cc5 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 28 Jun 2016 15:49:34 +0800 Subject: [PATCH 119/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 076aae58..ee6b08ae 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -33,7 +33,7 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 ## Matrix原理 -Matrix 本质是一个 3x3 的矩阵。 +Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图状态的不同内容。 From dac6f430989127b059379a9157a558140b9e0cbb Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 2 Jul 2016 23:09:12 +0800 Subject: [PATCH 120/615] Update --- CustomView/Advance/[7]Path_Over.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[7]Path_Over.md b/CustomView/Advance/[7]Path_Over.md index b8c3afde..88cbd1b7 100644 --- a/CustomView/Advance/[7]Path_Over.md +++ b/CustomView/Advance/[7]Path_Over.md @@ -171,7 +171,7 @@ toggleInverseFillType | 切换填充规则(即原有规则与反向规则之 Path path = new Path(); // 创建Path //path.setFillType(Path.FillType.EVEN_ODD); // 设置Path填充模式为 奇偶规则 - path.setFillType(Path.FillType.INVERSE_WINDING); // 反奇偶规则 + path.setFillType(Path.FillType.INVERSE_EVEN_ODD); // 反奇偶规则 path.addRect(-200,-200,200,200, Path.Direction.CW); // 给Path中添加一个矩形 ``` From 45cc090e9929cfcacf9e530b2a8f4333ed1d9a79 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 3 Jul 2016 18:49:36 +0800 Subject: [PATCH 121/615] Update --- QuickChart/Matrix.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 QuickChart/Matrix.md diff --git a/QuickChart/Matrix.md b/QuickChart/Matrix.md new file mode 100644 index 00000000..01bf7cb8 --- /dev/null +++ b/QuickChart/Matrix.md @@ -0,0 +1 @@ +# Matrix常用操作速查表 From 3be6e26a7a51df704303f40b7fef8471a1603f3a Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 3 Jul 2016 18:50:33 +0800 Subject: [PATCH 122/615] Update --- QuickChart/Path.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/QuickChart/Path.md b/QuickChart/Path.md index e55947dd..2310b2c6 100644 --- a/QuickChart/Path.md +++ b/QuickChart/Path.md @@ -22,3 +22,10 @@ rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是 重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** 矩阵操作 | transform | 矩阵变换 +## 相关文章 + +* []() +* []() +* []() +* []() + From 83f9ed43fe7074e60fcf5660099ac7bf33052453 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 3 Jul 2016 18:52:37 +0800 Subject: [PATCH 123/615] Update --- QuickChart/Path.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/QuickChart/Path.md b/QuickChart/Path.md index 2310b2c6..6ed41739 100644 --- a/QuickChart/Path.md +++ b/QuickChart/Path.md @@ -24,8 +24,8 @@ rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是 ## 相关文章 -* []() -* []() -* []() -* []() +* [Path基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) +* [贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) +* [Path完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) +* [Path玩出花样](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B8%5DPath_Play.md) From 7c4c52e8f29224f890edc9a5dc310cc78d393094 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 9 Jul 2016 09:14:51 +0800 Subject: [PATCH 124/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index ee6b08ae..16162b7e 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -33,7 +33,7 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 ## Matrix原理 -Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图状态的不同内容。 +Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图状态的不同内容,我们对视图的操作最终都是改变Matrix里面的数值。 From 1e3934f8c87856499e88e75b910f387f44b3f1f7 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 17 Jul 2016 23:49:40 +0800 Subject: [PATCH 125/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 16162b7e..5ad85355 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -1,14 +1,12 @@ # Matrix基础 -前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的 Matrix(传说中的黑客帝国!!!): +前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的黑客帝国! ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) -如题,本篇的主角是 Matrix(其实并不是黑客帝国来着)。 +如题,本篇的主角是 Matrix(并不是黑客帝国)。 -仔细回想一下,我们在很多地方都见过 Matrix(画布操作,drawBitmap,path 等), 感觉它就像是一个烦人家伙,什么事情都想插上一脚。 然而实际情况却并非如此, Matrix 一直都在我们没有注意到到地方默默付出着, 如果没有了 Matrix, 我们之前的很多方法都是无法运行的。 - -这么说来 Matrix 也算个厉害人物,那么这个 Matrix 到底是何方神圣呢? +我们在之前的很多文章中都提及过它,但并没有仔细的介绍过,从本篇开始正式介绍它了,这个在2D绘图中十分重要的角色Matrix。 > #### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 From 6ad8bde1c459cf3f7c2e44b1036f615521e076be Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 17 Jul 2016 23:52:31 +0800 Subject: [PATCH 126/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 5ad85355..8ce3d602 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -1,12 +1,12 @@ # Matrix基础 -前面扯了四篇 Path 相关的内容,本次终于要到了大家期盼已久的黑客帝国! +前面讲了四篇 Path 相关的内容,本次终于要到了大家期盼已久的黑客帝国! ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) 如题,本篇的主角是 Matrix(并不是黑客帝国)。 -我们在之前的很多文章中都提及过它,但并没有仔细的介绍过,从本篇开始正式介绍它了,这个在2D绘图中十分重要的角色Matrix。 +它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D绘图中十分重要的角色 -- Matrix。 > #### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 From 343aa4ad31cf3d9943429d6c3df4ff72b33ef099 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 17 Jul 2016 23:54:02 +0800 Subject: [PATCH 127/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 8ce3d602..8aa48f65 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -28,8 +28,8 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... -## Matrix原理 +## Matrix原理 Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图状态的不同内容,我们对视图的操作最终都是改变Matrix里面的数值。 From 8703d71aaede2e32905236ca03294b09854e0001 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 17 Jul 2016 23:57:42 +0800 Subject: [PATCH 128/615] Update --- {Question => ChaosCrystal}/HowToViewAPISourceOnline.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {Question => ChaosCrystal}/HowToViewAPISourceOnline.md (100%) diff --git a/Question/HowToViewAPISourceOnline.md b/ChaosCrystal/HowToViewAPISourceOnline.md similarity index 100% rename from Question/HowToViewAPISourceOnline.md rename to ChaosCrystal/HowToViewAPISourceOnline.md From 120c6fd81ba0ebc4eaa1cd0372abb837d794d1b5 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 00:06:59 +0800 Subject: [PATCH 129/615] Update --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 9e2226bf..4c354d0d 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,11 @@ 02 | [Path常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Path.md) 03 | [贝塞尔曲线常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Bezier.md) +## [混沌水晶](https://github.com/GcsSloop/AndroidNote/tree/master/ChaosCrystal) + +序号 | 内容 +:---:|--------------- + 01 | [在线查看Android API源码](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/HowToViewAPISourceOnline.md) ## About Me From f4137aa76f5854c4d5a694716eeec0f93698ff6c Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 00:08:03 +0800 Subject: [PATCH 130/615] Update --- ChaosCrystal/README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 ChaosCrystal/README.md diff --git a/ChaosCrystal/README.md b/ChaosCrystal/README.md new file mode 100644 index 00000000..3881df81 --- /dev/null +++ b/ChaosCrystal/README.md @@ -0,0 +1,5 @@ +# 混沌水晶 + +序号 | 内容 +:---:|--------------- + 01 | [在线查看Android API源码](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/HowToViewAPISourceOnline.md) From b17c9c93ef1719e785db0b71cfc02909a50770b7 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 00:19:15 +0800 Subject: [PATCH 131/615] Update --- ChaosCrystal/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ChaosCrystal/README.md b/ChaosCrystal/README.md index 3881df81..f2d3abfa 100644 --- a/ChaosCrystal/README.md +++ b/ChaosCrystal/README.md @@ -1,4 +1,6 @@ -# 混沌水晶 +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f5xd2k7s8hj30x30d8tab.jpg) + +# 混沌水晶 序号 | 内容 :---:|--------------- From 2806a91e62c5b6f8b87c5d80b68b7eeaf31fba31 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 00:40:35 +0800 Subject: [PATCH 132/615] Update --- ChaosCrystal/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChaosCrystal/README.md b/ChaosCrystal/README.md index f2d3abfa..2514ba44 100644 --- a/ChaosCrystal/README.md +++ b/ChaosCrystal/README.md @@ -2,6 +2,8 @@ # 混沌水晶 +混沌水晶本身并没有太大功效,但与其他物品合成之后可能产生质的变化。 + 序号 | 内容 :---:|--------------- 01 | [在线查看Android API源码](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/HowToViewAPISourceOnline.md) From 9d5b3dd51904f3d1ce6159e7dee9721bfe4e521b Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 02:48:30 +0800 Subject: [PATCH 133/615] Update --- ...5\277\253\346\215\267\351\224\256(Mac).md" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 "ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" diff --git "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" new file mode 100644 index 00000000..beb887cd --- /dev/null +++ "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" @@ -0,0 +1,21 @@ +# AndroidStudio常用快捷键(Mac) + +快捷键 | 作用 +---|--- +Option + Enter | 自动修正 +Command + N | 自动生成代码(Getter Setter) +Command + Alt + L | 格式化代码 +Command + Alt + T | 把选中的代码放在 try{} 、if{} 、 else{} 里 +Command + / | 注释 // +Command + Shift + / | 注释 /* */ +Command + Shift + Up/Down | 语句上下移动 +Option + Shift + Up/Down | 内容上下移动 +Option + Command + M | 将选中代码块封装成一个方法 +Command + D | 复制当前一行(或选择区域),并粘贴到下面 +Command + Z | 后退 +Command + Shift + Z | 前进 +Control + Alt + O | 优化导入的包 +Ctrl(Command)+ - / + | 折叠/展开代码 +Ctrl(Command)+Shift+ - / + | 折叠/展开全部代码 +Ctrl(Command)+Shift+. | 折叠/展开当前花括号中的代码 + From 09018ce2886b587141c1a36d54a41ae26815c5f5 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 02:50:34 +0800 Subject: [PATCH 134/615] Update --- ...5\277\253\346\215\267\351\224\256(Mac).md" | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" index beb887cd..68c18fe9 100644 --- "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" +++ "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" @@ -1,21 +1,21 @@ # AndroidStudio常用快捷键(Mac) -快捷键 | 作用 ----|--- -Option + Enter | 自动修正 -Command + N | 自动生成代码(Getter Setter) -Command + Alt + L | 格式化代码 -Command + Alt + T | 把选中的代码放在 try{} 、if{} 、 else{} 里 -Command + / | 注释 // -Command + Shift + / | 注释 /* */ -Command + Shift + Up/Down | 语句上下移动 -Option + Shift + Up/Down | 内容上下移动 -Option + Command + M | 将选中代码块封装成一个方法 -Command + D | 复制当前一行(或选择区域),并粘贴到下面 -Command + Z | 后退 -Command + Shift + Z | 前进 -Control + Alt + O | 优化导入的包 -Ctrl(Command)+ - / + | 折叠/展开代码 -Ctrl(Command)+Shift+ - / + | 折叠/展开全部代码 -Ctrl(Command)+Shift+. | 折叠/展开当前花括号中的代码 +快捷键 | 作用 +----------------------------|----------------------------------------------- +Option + Enter | 自动修正 +Command + N | 自动生成代码(Getter Setter) +Command + Alt + L | 格式化代码 +Command + Alt + T | 把选中的代码放在 try{} 、if{} 、 else{} 里 +Command + / | 注释 // +Command + Shift + / | 注释 /* */ +Command + Shift + Up/Down | 语句上下移动 +Option + Shift + Up/Down | 内容上下移动 +Option + Command + M | 将选中代码块封装成一个方法 +Command + D | 复制当前一行(或选择区域),并粘贴到下面 +Command + Z | 后退 +Command + Shift + Z | 前进 +Control + Alt + O | 优化导入的包 +Ctrl(Command)+ - / + | 折叠/展开代码 +Ctrl(Command)+Shift+ - / + | 折叠/展开全部代码 +Ctrl(Command)+Shift+. | 折叠/展开当前花括号中的代码 From 54fc0a1b88dc2729e3b0c45f417638e19ec31294 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 02:52:09 +0800 Subject: [PATCH 135/615] Update --- ...270\347\224\250\345\221\275\344\273\244.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 "ChaosCrystal/ADB\345\270\270\347\224\250\345\221\275\344\273\244.md" diff --git "a/ChaosCrystal/ADB\345\270\270\347\224\250\345\221\275\344\273\244.md" "b/ChaosCrystal/ADB\345\270\270\347\224\250\345\221\275\344\273\244.md" new file mode 100644 index 00000000..f5ab0017 --- /dev/null +++ "b/ChaosCrystal/ADB\345\270\270\347\224\250\345\221\275\344\273\244.md" @@ -0,0 +1,18 @@ +# ADB常用命令 + +命令 | 说明 +--- | --- +adb start-server | 启动服务 +adb kill-server | 关闭服务 +adb devices | 显示当前连接的所有设备(如果服务没有开启会自动开启) +adb install xxx.apk | 将应用安装进设备中 +adb uninstall <包名> | 卸载应用 +adb -s <设备名> <命令> | 如果有多个设备,指定某一个设备进行操作 +adb pull <手机文件> <电脑文件> | 将手机内文件导入到电脑上(文件名均为全称) +adb push <电脑文件> <手机文件> | 将电脑中文件推送到手机上(文件名均为全称) +adb shell | 进入手机命令行终端 + ┗ ls | 查看目录列表 + ┗ ls -l | 显示详细信息(权限 用户名 组名 时间 包名) + ┗ ps | 当前正在运行的进程 + ┗ ping | 手机的网络连通性 + From b050c19010f6eae9d8bf66a10340328577deede6 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 02:53:24 +0800 Subject: [PATCH 136/615] Update --- ...70\347\224\250\345\221\275\344\273\244.md" | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git "a/ChaosCrystal/ADB\345\270\270\347\224\250\345\221\275\344\273\244.md" "b/ChaosCrystal/ADB\345\270\270\347\224\250\345\221\275\344\273\244.md" index f5ab0017..bdab36c6 100644 --- "a/ChaosCrystal/ADB\345\270\270\347\224\250\345\221\275\344\273\244.md" +++ "b/ChaosCrystal/ADB\345\270\270\347\224\250\345\221\275\344\273\244.md" @@ -1,18 +1,18 @@ # ADB常用命令 -命令 | 说明 ---- | --- -adb start-server | 启动服务 -adb kill-server | 关闭服务 -adb devices | 显示当前连接的所有设备(如果服务没有开启会自动开启) -adb install xxx.apk | 将应用安装进设备中 -adb uninstall <包名> | 卸载应用 -adb -s <设备名> <命令> | 如果有多个设备,指定某一个设备进行操作 +命令 | 说明 +--------------------------------|----------------------------------------------------- +adb start-server | 启动服务 +adb kill-server | 关闭服务 +adb devices | 显示当前连接的所有设备(如果服务没有开启会自动开启) +adb install xxx.apk | 将应用安装进设备中 +adb uninstall <包名> | 卸载应用 +adb -s <设备名> <命令> | 如果有多个设备,指定某一个设备进行操作 adb pull <手机文件> <电脑文件> | 将手机内文件导入到电脑上(文件名均为全称) adb push <电脑文件> <手机文件> | 将电脑中文件推送到手机上(文件名均为全称) -adb shell | 进入手机命令行终端 - ┗ ls | 查看目录列表 - ┗ ls -l | 显示详细信息(权限 用户名 组名 时间 包名) - ┗ ps | 当前正在运行的进程 - ┗ ping | 手机的网络连通性 +adb shell | 进入手机命令行终端 + ┗ ls | 查看目录列表 + ┗ ls -l | 显示详细信息(权限 用户名 组名 时间 包名) + ┗ ps | 当前正在运行的进程 + ┗ ping | 手机的网络连通性 From 21dfcf91012807d6e20df05cfba7269d1b77eb0a Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 02:56:35 +0800 Subject: [PATCH 137/615] Update --- ...344\270\216GIF\345\210\266\344\275\234.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 "ChaosCrystal/\345\275\225\345\261\217\344\270\216GIF\345\210\266\344\275\234.md" diff --git "a/ChaosCrystal/\345\275\225\345\261\217\344\270\216GIF\345\210\266\344\275\234.md" "b/ChaosCrystal/\345\275\225\345\261\217\344\270\216GIF\345\210\266\344\275\234.md" new file mode 100644 index 00000000..4613d0e2 --- /dev/null +++ "b/ChaosCrystal/\345\275\225\345\261\217\344\270\216GIF\345\210\266\344\275\234.md" @@ -0,0 +1,65 @@ +# 录屏与GIF制作 + +## 说明 +在实际工作或学习过程中,很多地方都需要展示一些过程,或者展示动态的效果,使用视频显得比较大了,而且也不利于分享,故使用GIF就是一种很好的方法,体积小,易于分享展示。 + +## 制作GIF的方法 +> 此处大部分参考自 廖祜秋(我们的秋百万大哥) 整理的内容: [Make GIF Snapshot for Android APP](http://www.liaohuqiu.net/posts/make-gif-for-android-app/) + +制作GIF一般分为以下两种情况: + +类别 | 说明 | 备注 +--- | --- | --- +第一种 | 在电脑上可以看到效果 | 在模拟器中运行的app,视频等 +第二种 | 在手机上可以看到效果 | 在真机中运行的app + +### 第一种的制作方法 +第一种方法比较容易直接录制屏幕然后转换为GIF就行了,有很多可视化的制作软件,这里推荐几种: + +名称 | 说明 | 地址 + --- | --- | --- +都叫兽GIF | 可视化GIF制作工具,支持录制后再次编辑,不同程度压缩,添加水印等功能,但默认右下角有一个都叫兽的水印,不适合强迫症患者 | [都叫兽GIF](http://www.reneelab.com.cn)
[Windows直接下载](http://www.reneelab.com.cn/download-center/renee-gifer) +LICEcap | 可视化GIF制作工具,支持编辑录制区域大小,可改变录制帧率,功能没有上面多,但用起来很简单 | [LICEcap](http://www.cockos.com/licecap/)
[Windows直接下载](http://www.cockos.com/licecap/licecap123-install.exe) +ezgif | 在线制作GIF的工具,这个的功能也很强大,支持将多张图片合成为GIF,将视频转换为GIF,剪切旋转等多种操作 | [ezgif](http://ezgif.com/) + +## 第二种的制作方法 +虽然手机上也有一些录屏GIF制作软件,但是大部分都很渣,很难达到我们想要的效果。 + +我个人一般是将操作过程录制下来,然后发送到电脑上,用电脑软件截取GIF,也就是转为第一种方法。 + +### 录制手机操作的方法 + +#### 通过AndroidStudio录屏工具: + +这个用起来很方便,录制后能直接保存在电脑上。 + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f13ro2pqw2j30bd0ahwfi.jpg) + +1.选到该选项卡 + +2.上面一个按钮是截屏,下面一个按钮是录屏。 + +#### 通过ADB命令: + +作为一个程序猿,虽然可视化操作很爽,但不会两条命令怎么能装逼呢。下面就教大家如何用命令录屏。 + +``` shell +$ adb shell // 进入shell +shell@ $ screenrecord --verbose /sdcard/demo.mp4 // 开始录制(保存到内存卡上) +(press Ctrl-C to stop) // 按Ctrl+C结束录制 +shell@ $ exit // 结束录制 +$ adb pull /sdcard/demo.mp4 // 将内存卡中的文件传到电脑上 +``` +**[更多ADB命令看这里](http://developer.android.com/tools/help/shell.html#screenrecord)** + +#### 通过Python命令录制 + +虽说是Python命令,但是底层调用的依旧是adb,内部实现依赖了ffmpeg。 + +**详情请参考RoboGif的文档->[RoboGif](https://github.com/GcsSloop/RoboGif)** + +如果你对Python还不了解,可以到这里学习一下Python的基础知识:**[PythonNote](https://github.com/GcsSloop/PythonNote)** + + + + From 5874b0da4fc33fdb727476ac9f05c93bed306708 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 19:30:05 +0800 Subject: [PATCH 138/615] Update --- ChaosCrystal/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ChaosCrystal/README.md b/ChaosCrystal/README.md index 2514ba44..e685b450 100644 --- a/ChaosCrystal/README.md +++ b/ChaosCrystal/README.md @@ -7,3 +7,6 @@ 序号 | 内容 :---:|--------------- 01 | [在线查看Android API源码](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/HowToViewAPISourceOnline.md) + 02 | [ADB常用命令](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/ADB%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4.md) + 03 | [AndroidStudio常用快捷键(Mac)](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/AndroidStudio%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE(Mac).md) + 04 | [录屏与GIF制作](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/%E5%BD%95%E5%B1%8F%E4%B8%8EGIF%E5%88%B6%E4%BD%9C.md) From c18256f3dc4725521eccaa8018688cc9aa1b5c46 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 19:31:10 +0800 Subject: [PATCH 139/615] Update --- ChaosCrystal/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ChaosCrystal/README.md b/ChaosCrystal/README.md index e685b450..10db8eba 100644 --- a/ChaosCrystal/README.md +++ b/ChaosCrystal/README.md @@ -6,7 +6,9 @@ 序号 | 内容 :---:|--------------- - 01 | [在线查看Android API源码](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/HowToViewAPISourceOnline.md) - 02 | [ADB常用命令](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/ADB%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4.md) - 03 | [AndroidStudio常用快捷键(Mac)](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/AndroidStudio%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE(Mac).md) - 04 | [录屏与GIF制作](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/%E5%BD%95%E5%B1%8F%E4%B8%8EGIF%E5%88%B6%E4%BD%9C.md) + 01 | [AndroidStudio常用快捷键(Mac)](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/AndroidStudio%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE(Mac).md) + 02 | [在线查看Android API源码](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/HowToViewAPISourceOnline.md) + 03 | [录屏与GIF制作](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/%E5%BD%95%E5%B1%8F%E4%B8%8EGIF%E5%88%B6%E4%BD%9C.md) + 04 | [ADB常用命令](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/ADB%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4.md) + + From 2150b361deb261489c679c72e4b3a26bf1ca7993 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 19:32:23 +0800 Subject: [PATCH 140/615] Update --- ...p\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "ChaosCrystal/Android\344\270\255dip\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" diff --git "a/ChaosCrystal/Android\344\270\255dip\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" "b/ChaosCrystal/Android\344\270\255dip\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" new file mode 100644 index 00000000..97fdddd3 --- /dev/null +++ "b/ChaosCrystal/Android\344\270\255dip\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" @@ -0,0 +1 @@ +# Android中dip、dp、sp、pt和px From 46ec6028213ff291e814b3e306d13d8c305c557e Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 19:32:47 +0800 Subject: [PATCH 141/615] Update --- ...\200\201sp\343\200\201pt\345\222\214px.md" | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git "a/ChaosCrystal/Android\344\270\255dip\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" "b/ChaosCrystal/Android\344\270\255dip\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" index 97fdddd3..51ce9556 100644 --- "a/ChaosCrystal/Android\344\270\255dip\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" +++ "b/ChaosCrystal/Android\344\270\255dip\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" @@ -1 +1,77 @@ # Android中dip、dp、sp、pt和px + +概念区别: + +单位 | 含义 +--- | --- +dip | device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA **推荐使用这个,不依赖像素**。 +dp | 同上,和dip一样。 +px | pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素。 +sp | scaled pixels(放大像素). 主要用于字体显示best for textsize。 +pt | point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用。 +in | (英寸):长度单位。 +mm | (毫米):长度单位。 + +单位转换: +``` java +/** + * dp、sp 转换为 px 的工具类 + * + * @author fxsky 2012.11.12 + * + */ +public class DisplayUtil { + /** + * 将px值转换为dip或dp值,保证尺寸大小不变 + * + * @param pxValue + * @param scale + * (DisplayMetrics类中属性density) + * @return + */ + public static int px2dip(Context context, float pxValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (pxValue / scale + 0.5f); + } + + /** + * 将dip或dp值转换为px值,保证尺寸大小不变 + * + * @param dipValue + * @param scale + * (DisplayMetrics类中属性density) + * @return + */ + public static int dip2px(Context context, float dipValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dipValue * scale + 0.5f); + } + + /** + * 将px值转换为sp值,保证文字大小不变 + * + * @param pxValue + * @param fontScale + * (DisplayMetrics类中属性scaledDensity) + * @return + */ + public static int px2sp(Context context, float pxValue) { + final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; + return (int) (pxValue / fontScale + 0.5f); + } + + /** + * 将sp值转换为px值,保证文字大小不变 + * + * @param spValue + * @param fontScale + * (DisplayMetrics类中属性scaledDensity) + * @return + */ + public static int sp2px(Context context, float spValue) { + final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; + return (int) (spValue * fontScale + 0.5f); + } +} +``` + From ccf7c1fd2d14e150e0c6817920eaaa1e716ae4f7 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 18 Jul 2016 19:35:19 +0800 Subject: [PATCH 142/615] Update --- ChaosCrystal/README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ChaosCrystal/README.md b/ChaosCrystal/README.md index 10db8eba..7fe21f18 100644 --- a/ChaosCrystal/README.md +++ b/ChaosCrystal/README.md @@ -4,11 +4,10 @@ 混沌水晶本身并没有太大功效,但与其他物品合成之后可能产生质的变化。 -序号 | 内容 -:---:|--------------- - 01 | [AndroidStudio常用快捷键(Mac)](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/AndroidStudio%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE(Mac).md) - 02 | [在线查看Android API源码](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/HowToViewAPISourceOnline.md) - 03 | [录屏与GIF制作](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/%E5%BD%95%E5%B1%8F%E4%B8%8EGIF%E5%88%B6%E4%BD%9C.md) - 04 | [ADB常用命令](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/ADB%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4.md) +* [Android中dip、dp、sp、pt和px](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/Android%E4%B8%ADdip%E3%80%81dp%E3%80%81sp%E3%80%81pt%E5%92%8Cpx.md) +* [AndroidStudio常用快捷键(Mac)](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/AndroidStudio%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE(Mac).md) +* [在线查看Android API源码](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/HowToViewAPISourceOnline.md) +* [录屏与GIF制作](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/%E5%BD%95%E5%B1%8F%E4%B8%8EGIF%E5%88%B6%E4%BD%9C.md) +* [ADB常用命令](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/ADB%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4.md) From 81e79c65af8a3935b12b0f0b92fa476546351a95 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 19 Jul 2016 02:32:37 +0800 Subject: [PATCH 143/615] Update --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4c354d0d..2bbcb2b3 100644 --- a/README.md +++ b/README.md @@ -45,9 +45,14 @@ ## [混沌水晶](https://github.com/GcsSloop/AndroidNote/tree/master/ChaosCrystal) -序号 | 内容 -:---:|--------------- - 01 | [在线查看Android API源码](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/HowToViewAPISourceOnline.md) +混沌水晶本身并没有太大功效,但与其他物品合成之后可能产生质的变化。 + +* [Android中dip、dp、sp、pt和px](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/Android%E4%B8%ADdip%E3%80%81dp%E3%80%81sp%E3%80%81pt%E5%92%8Cpx.md) +* [AndroidStudio常用快捷键(Mac)](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/AndroidStudio%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE(Mac).md) +* [在线查看Android API源码](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/HowToViewAPISourceOnline.md) +* [录屏与GIF制作](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/%E5%BD%95%E5%B1%8F%E4%B8%8EGIF%E5%88%B6%E4%BD%9C.md) +* [ADB常用命令](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/ADB%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4.md) + ## About Me From 1ca06fcea7d091235c5e16455761c2e12de9ac90 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 19 Jul 2016 03:47:11 +0800 Subject: [PATCH 144/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 8aa48f65..24aa13a0 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -31,7 +31,9 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 ## Matrix原理 -Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图状态的不同内容,我们对视图的操作最终都是改变Matrix里面的数值。 +Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图的不同属性,大致如下: + + From d0446e249bd16244a6c2ebd30dd5290de0769c3a Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 19 Jul 2016 03:51:20 +0800 Subject: [PATCH 145/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 24aa13a0..5da1c40d 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -33,7 +33,11 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图的不同属性,大致如下: - + | 0 | 1 | 2 +---|-----------|-----------|---------- + 0 | MSSCALE_X | MSKEW_X | MTRANS_X + 1 | MSSCALE_X | MSKEW_X | MTRANS_X + 2 | MPERSRP_0 | MPERSRP_1 | MPERSRP_2 From d734553ecc81df60ff7d96bd46eccbd5e5431040 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 19 Jul 2016 04:33:23 +0800 Subject: [PATCH 146/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 5da1c40d..52aa510b 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -36,7 +36,7 @@ Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制 | 0 | 1 | 2 ---|-----------|-----------|---------- 0 | MSSCALE_X | MSKEW_X | MTRANS_X - 1 | MSSCALE_X | MSKEW_X | MTRANS_X + 1 | MSKEW_Y | MSSCALE_Y | MTRANS_Y 2 | MPERSRP_0 | MPERSRP_1 | MPERSRP_2 From 282f79ae5dffd6529fc2e8822f5374fad688bdd0 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 19 Jul 2016 04:51:48 +0800 Subject: [PATCH 147/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 52aa510b..80f87ae1 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -37,7 +37,7 @@ Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制 ---|-----------|-----------|---------- 0 | MSSCALE_X | MSKEW_X | MTRANS_X 1 | MSKEW_Y | MSSCALE_Y | MTRANS_Y - 2 | MPERSRP_0 | MPERSRP_1 | MPERSRP_2 + 2 | MPERSP_0 | MPERSP_1 | MPERSP_2 From 897a36bf1d1f0778ef3a58fda2269b01ece1773c Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 19 Jul 2016 21:36:45 +0800 Subject: [PATCH 148/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 80f87ae1..80f43a8e 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -35,8 +35,8 @@ Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制 | 0 | 1 | 2 ---|-----------|-----------|---------- - 0 | MSSCALE_X | MSKEW_X | MTRANS_X - 1 | MSKEW_Y | MSSCALE_Y | MTRANS_Y + 0 | MSCALE_X | MSKEW_X | MTRANS_X + 1 | MSKEW_Y | MSCALE_Y | MTRANS_Y 2 | MPERSP_0 | MPERSP_1 | MPERSP_2 From ba52ec6c5ffd912d12f3b6d5f84cb6af998e2161 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 01:45:13 +0800 Subject: [PATCH 149/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 80f43a8e..bb8287b6 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -39,6 +39,11 @@ Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制 1 | MSKEW_Y | MSCALE_Y | MTRANS_Y 2 | MPERSP_0 | MPERSP_1 | MPERSP_2 +**数值作用的介绍:** + + + + From 3129661f53d5d572ea929196d8a56f69fa7d1d21 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 01:52:12 +0800 Subject: [PATCH 150/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index bb8287b6..4c85f310 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -41,6 +41,18 @@ Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制 **数值作用的介绍:** +序号 | 名称 | 摘要 +-----|----------|------------------------ + 0 | MSCALE_X | + 1 | MSKEW_X | + 2 | MTRANS_X | + 3 | MSKEW_Y | + 4 | MSCALE_Y | + 5 | MTRANS_Y | + 6 | MPERSP_0 | + 7 | MPERSP_1 | + 8 | MPERSP_2 | + From 18f3d455445a771f5001998ab68be79515adb947 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 02:09:15 +0800 Subject: [PATCH 151/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 4c85f310..10ea1155 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -41,17 +41,20 @@ Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制 **数值作用的介绍:** +> +根据名称我们就能猜到其大概作用,但有一些数值比较奇怪,需要细心考证。 + 序号 | 名称 | 摘要 -----|----------|------------------------ - 0 | MSCALE_X | - 1 | MSKEW_X | - 2 | MTRANS_X | - 3 | MSKEW_Y | - 4 | MSCALE_Y | - 5 | MTRANS_Y | - 6 | MPERSP_0 | - 7 | MPERSP_1 | - 8 | MPERSP_2 | + 0 | MSCALE_X | 控制X坐标 缩放,旋转 + 1 | MSKEW_X | 控制X坐标 错切,旋转 + 2 | MTRANS_X | 控制X坐标 位移 + 3 | MSKEW_Y | 控制Y坐标 错切,旋转 + 4 | MSCALE_Y | 控制Y坐标 缩放,旋转 + 5 | MTRANS_Y | 控制Y坐标 位移 + 6 | MPERSP_0 | 控制透视 (绕Y轴旋转) + 7 | MPERSP_1 | 控制透视 (绕X轴旋转) + 8 | MPERSP_2 | 控制透视 (通常为1) From bdd93635f294d7b75d0fcd9178c45321fb1c9bdb Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 02:46:31 +0800 Subject: [PATCH 152/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 10ea1155..8c3de57f 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -44,17 +44,17 @@ Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制 > 根据名称我们就能猜到其大概作用,但有一些数值比较奇怪,需要细心考证。 -序号 | 名称 | 摘要 ------|----------|------------------------ - 0 | MSCALE_X | 控制X坐标 缩放,旋转 - 1 | MSKEW_X | 控制X坐标 错切,旋转 - 2 | MTRANS_X | 控制X坐标 位移 - 3 | MSKEW_Y | 控制Y坐标 错切,旋转 - 4 | MSCALE_Y | 控制Y坐标 缩放,旋转 - 5 | MTRANS_Y | 控制Y坐标 位移 - 6 | MPERSP_0 | 控制透视 (绕Y轴旋转) - 7 | MPERSP_1 | 控制透视 (绕X轴旋转) - 8 | MPERSP_2 | 控制透视 (通常为1) +序号 | 名称 | 对应单词 | 摘要 +-----|----------|-------------|-------------- + 0 | MSCALE_X | scale | 控制X坐标 缩放,旋转 + 1 | MSKEW_X | skew | 控制X坐标 错切,旋转 + 2 | MTRANS_X | transfer | 控制X坐标 位移 + 3 | MSKEW_Y | skew | 控制Y坐标 错切,旋转 + 4 | MSCALE_Y | scale | 控制Y坐标 缩放,旋转 + 5 | MTRANS_Y | transfer | 控制Y坐标 位移 + 6 | MPERSP_0 | perspective | 控制透视 (绕Y轴旋转) + 7 | MPERSP_1 | perspective | 控制透视 (绕X轴旋转) + 8 | MPERSP_2 | perspective | 控制透视 (通常为1) From 0de38eecbc7f91b0c9e77ed7178e740ceb0973ba Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 03:23:57 +0800 Subject: [PATCH 153/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 8c3de57f..0dcdaffb 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -6,7 +6,7 @@ 如题,本篇的主角是 Matrix(并不是黑客帝国)。 -它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D绘图中十分重要的角色 -- Matrix。 +它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(Android中有三个Matrix,分别属于OpenGL,graphics 和 vr, 本篇主要讲述的是graphics中的Matrix)。 > #### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 From 3880e31e40c8bb56dc1cfe0f063cdeee2c999c99 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 03:43:21 +0800 Subject: [PATCH 154/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 0dcdaffb..2419119a 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -6,7 +6,7 @@ 如题,本篇的主角是 Matrix(并不是黑客帝国)。 -它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(Android中有三个Matrix,分别属于OpenGL,graphics 和 vr, 本篇主要讲述的是graphics中的Matrix)。 +它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(Android中有两个Matrix,分别属于OpenGL 和 graphics, 本篇主要讲述的是graphics中的Matrix)。 > #### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 From f89d547992604343315bbb2a06309840cb15a615 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 04:04:36 +0800 Subject: [PATCH 155/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 2419119a..2f864155 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -29,7 +29,7 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... -## Matrix原理 +## Matrix基本原理 Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图的不同属性,大致如下: @@ -55,7 +55,13 @@ Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制 6 | MPERSP_0 | perspective | 控制透视 (绕Y轴旋转) 7 | MPERSP_1 | perspective | 控制透视 (绕X轴旋转) 8 | MPERSP_2 | perspective | 控制透视 (通常为1) - + +从上表中可以看出一些内容,下面分析一下画布常用的四种操作(translate, scale, rotate, skew)都是由哪些参数控制的。 + + + +## Matrix方法详解 + From a33549970f67241cc33c6550a0f3b591e46d3c63 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 06:10:39 +0800 Subject: [PATCH 156/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 2f864155..edfabfa4 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -1,5 +1,6 @@ # Matrix基础 + 前面讲了四篇 Path 相关的内容,本次终于要到了大家期盼已久的黑客帝国! ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) @@ -33,11 +34,18 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图的不同属性,大致如下: - | 0 | 1 | 2 ----|-----------|-----------|---------- - 0 | MSCALE_X | MSKEW_X | MTRANS_X - 1 | MSKEW_Y | MSCALE_Y | MTRANS_Y - 2 | MPERSP_0 | MPERSP_1 | MPERSP_2 +![](http://latex.codecogs.com/svg.latex? +$$ +\\left [ +\\begin{matrix} +MSCALE\\_X & MSKEW\\_X & MTRANS\\_X \\\\ +\\\\ +MSKEW\\_Y & MSCALE\\_Y & MTRANS\\_Y \\\\ +\\\\ +MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 +\\end{1} +\\right ] +$$) **数值作用的介绍:** From ba8c768bda9b107653875a9699d08938b220f7dd Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 06:14:11 +0800 Subject: [PATCH 157/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index edfabfa4..3f1f7ee2 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -34,7 +34,7 @@ Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些 Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图的不同属性,大致如下: -![](http://latex.codecogs.com/svg.latex? +![](http://latex.codecogs.com/png.latex? $$ \\left [ \\begin{matrix} From c449b01fbd8f2966749b3010515d0d3968252fab Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 15:15:03 +0800 Subject: [PATCH 158/615] Update --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2bbcb2b3..17ef6ddf 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,8 @@ 02 | [Path常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Path.md) 03 | [贝塞尔曲线常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Bezier.md) +****** + ## [混沌水晶](https://github.com/GcsSloop/AndroidNote/tree/master/ChaosCrystal) 混沌水晶本身并没有太大功效,但与其他物品合成之后可能产生质的变化。 From 28c0ff5d76116dde43e46fdec000e958481a2634 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 16:48:25 +0800 Subject: [PATCH 159/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 3f1f7ee2..774bf144 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -66,6 +66,8 @@ $$) 从上表中可以看出一些内容,下面分析一下画布常用的四种操作(translate, scale, rotate, skew)都是由哪些参数控制的。 +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f60gwrhlnyj30c008zdgy.jpg) +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f60gx3a9z5j30c008zwf0.jpg) ## Matrix方法详解 From 549615a448e26930c2c549f3cb2c82e74c811b99 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 16:52:48 +0800 Subject: [PATCH 160/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 774bf144..9a400c0d 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -69,6 +69,8 @@ $$) ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f60gwrhlnyj30c008zdgy.jpg) ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f60gx3a9z5j30c008zwf0.jpg) +> +**从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇范围内,暂不过多叙述。** ## Matrix方法详解 From b4dd04fd19e04f7456d7b2b8f28be7e69e3f26c5 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 16:55:36 +0800 Subject: [PATCH 161/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 9a400c0d..984861f7 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -64,7 +64,7 @@ $$) 7 | MPERSP_1 | perspective | 控制透视 (绕X轴旋转) 8 | MPERSP_2 | perspective | 控制透视 (通常为1) -从上表中可以看出一些内容,下面分析一下画布常用的四种操作(translate, scale, rotate, skew)都是由哪些参数控制的。 +从上表中可以看出一些内容,下面我们看一下2D画布中常用的四种操作(translate, scale, rotate, skew)都是由哪些参数控制的。 ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f60gwrhlnyj30c008zdgy.jpg) ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f60gx3a9z5j30c008zwf0.jpg) From 9f6199b59e2a17d40d73223f6617eecb6e18431a Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 20 Jul 2016 17:05:00 +0800 Subject: [PATCH 162/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 984861f7..8383579f 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -5,15 +5,18 @@ ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) +## Matrix作用 + 如题,本篇的主角是 Matrix(并不是黑客帝国)。 它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(Android中有两个Matrix,分别属于OpenGL 和 graphics, 本篇主要讲述的是graphics中的Matrix)。 > -#### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 +### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 也就是说, 我们进行界面视图等转换都是需要依靠 Matrix 的帮助的,例如我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的画布操作,这些操作的核心就是改变 Matrix 的数值。 + ## Matrix方法表 Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 @@ -72,7 +75,7 @@ $$) > **从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇范围内,暂不过多叙述。** -## Matrix方法详解 + From 0bf4fdbdf99b17081eab12fa1a21fffc4ad36f30 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 21 Jul 2016 03:09:37 +0800 Subject: [PATCH 163/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 8383579f..7f6cb48e 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -7,7 +7,7 @@ ## Matrix作用 -如题,本篇的主角是 Matrix(并不是黑客帝国)。 +如题,本篇的主角是 Matrix。 它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(Android中有两个Matrix,分别属于OpenGL 和 graphics, 本篇主要讲述的是graphics中的Matrix)。 @@ -17,22 +17,6 @@ 也就是说, 我们进行界面视图等转换都是需要依靠 Matrix 的帮助的,例如我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的画布操作,这些操作的核心就是改变 Matrix 的数值。 -## Matrix方法表 - -Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 - -方法类别 | 相关API | 摘要 ------------|---------------------------------------------------------|------------------------ -基本方法 | equals hashCode toString toShortString | 比较、 获取哈希值、 转换为字符串 -数值操作 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值 -设置(set) | setConcat setRotate setScale setSkew setTranslate | 设置变换 -前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘变换 -后乘(post) | postConcat postRotate postScale postSkew postTranslate | 后乘变换 -数值计算 | mapPoints mapRadius mapRect mapVectors | 计算变换后的数值 -特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 -矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... - - ## Matrix基本原理 Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图的不同属性,大致如下: @@ -73,13 +57,29 @@ $$) ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f60gx3a9z5j30c008zwf0.jpg) > -**从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇范围内,暂不过多叙述。** +**从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇范围内,暂不过多叙述,会在之后对文章中详述其作用。** +## Matrix方法表 + +Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 + +方法类别 | 相关API | 摘要 +-----------|---------------------------------------------------------|------------------------ +基本方法 | equals hashCode toString toShortString | 比较、 获取哈希值、 转换为字符串 +数值操作 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值 +设置(set) | setConcat setRotate setScale setSkew setTranslate | 设置变换 +前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘变换 +后乘(post) | postConcat postRotate postScale postSkew postTranslate | 后乘变换 +数值计算 | mapPoints mapRadius mapRect mapVectors | 计算变换后的数值 +特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 +矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... + + From eb0d57779a6784adb20fccb4d1bc24972012ef0b Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 21 Jul 2016 04:09:29 +0800 Subject: [PATCH 164/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 7f6cb48e..4557be0a 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -9,13 +9,14 @@ 如题,本篇的主角是 Matrix。 -它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(Android中有两个Matrix,分别属于OpenGL 和 graphics, 本篇主要讲述的是graphics中的Matrix)。 +它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(Android中有两个Matrix,分别属于OpenGL 和 graphics, 本篇主要讲述的是graphics中的Matrix), + +另外,本篇的重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 > ### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 -也就是说, 我们进行界面视图等转换都是需要依靠 Matrix 的帮助的,例如我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的画布操作,这些操作的核心就是改变 Matrix 的数值。 - +也就是说, 我们进行界面视图等转换都是需要依靠 Matrix 的帮助的,例如我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的画布操作,这些操作的核心就是改变 Matrix 的数值,我们常见的可以用到Matrix的地方就是 canvas、 path、 bitmap 和 camera 等地方,对于我们Android程序员来说,只要是图形化界面展示,就有Matrix在后台默默工作。 ## Matrix基本原理 @@ -34,10 +35,11 @@ MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 \\right ] $$) + **数值作用的介绍:** > -根据名称我们就能猜到其大概作用,但有一些数值比较奇怪,需要细心考证。 +根据名称我们就能猜到其大概作用,但有些效果是需要多个参数组合控制的,如下。 序号 | 名称 | 对应单词 | 摘要 -----|----------|-------------|-------------- @@ -59,6 +61,20 @@ $$) > **从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇范围内,暂不过多叙述,会在之后对文章中详述其作用。** +## Matrix常见误解 + +在写本文之前,我翻阅很多介绍 Matrix 的文章和官方文档,但其中文的搜索结果令我很悲伤,大部分的中文章对Matrix都存在误解,想当然的创造出一些错误的理论, 导致很多(抄袭)的文章都是这一错误的理论,不知道要坑害多少小白,常见的错误理论有: + +* 1.认为Matrix最下面的一行的三个参数(MPERSP_0、MPERSP_1、MPERSP_2)没有什么太大的作用,在这里只是为了凑数。 + +> 实际上最后一行参数在3D变换中有着至关重要的作用,这一点会在后面中Camera一文中详细介绍。 + +* 2.最后一个参数MPERSP_2被解释为scale + +> 的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。 + + + @@ -66,7 +82,7 @@ $$) ## Matrix方法表 -Matrix 有很多常用和不常用的方法,在本篇中重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 +Matrix 有很多常用和不常用的方法, 方法类别 | 相关API | 摘要 -----------|---------------------------------------------------------|------------------------ From 00151af1ad9afc5a3be26792bbca8afe6d59bf6c Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 21 Jul 2016 04:10:59 +0800 Subject: [PATCH 165/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 4557be0a..6ad70f92 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -5,11 +5,11 @@ ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) -## Matrix作用 +## 一、Matrix作用 如题,本篇的主角是 Matrix。 -它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(Android中有两个Matrix,分别属于OpenGL 和 graphics, 本篇主要讲述的是graphics中的Matrix), +它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(_Android中有两个Matrix,分别属于OpenGL 和 graphics, 本篇主要讲述的是graphics中的Matrix_), 另外,本篇的重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 @@ -18,7 +18,7 @@ 也就是说, 我们进行界面视图等转换都是需要依靠 Matrix 的帮助的,例如我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的画布操作,这些操作的核心就是改变 Matrix 的数值,我们常见的可以用到Matrix的地方就是 canvas、 path、 bitmap 和 camera 等地方,对于我们Android程序员来说,只要是图形化界面展示,就有Matrix在后台默默工作。 -## Matrix基本原理 +## 二、Matrix基本原理 Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图的不同属性,大致如下: @@ -61,7 +61,7 @@ $$) > **从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇范围内,暂不过多叙述,会在之后对文章中详述其作用。** -## Matrix常见误解 +## 三、Matrix常见误解 在写本文之前,我翻阅很多介绍 Matrix 的文章和官方文档,但其中文的搜索结果令我很悲伤,大部分的中文章对Matrix都存在误解,想当然的创造出一些错误的理论, 导致很多(抄袭)的文章都是这一错误的理论,不知道要坑害多少小白,常见的错误理论有: From 949ea23e1a07d38d123fdd4a08ee9a7088fb1e9f Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 21 Jul 2016 04:14:15 +0800 Subject: [PATCH 166/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 6ad70f92..85a35ab9 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -65,13 +65,13 @@ $$) 在写本文之前,我翻阅很多介绍 Matrix 的文章和官方文档,但其中文的搜索结果令我很悲伤,大部分的中文章对Matrix都存在误解,想当然的创造出一些错误的理论, 导致很多(抄袭)的文章都是这一错误的理论,不知道要坑害多少小白,常见的错误理论有: -* 1.认为Matrix最下面的一行的三个参数(MPERSP_0、MPERSP_1、MPERSP_2)没有什么太大的作用,在这里只是为了凑数。 +**1.认为Matrix最下面的一行的三个参数(MPERSP_0、MPERSP_1、MPERSP_2)没有什么太大的作用,在这里只是为了凑数。** -> 实际上最后一行参数在3D变换中有着至关重要的作用,这一点会在后面中Camera一文中详细介绍。 +> **实际上最后一行参数在3D变换中有着至关重要的作用,这一点会在后面中Camera一文中详细介绍。** -* 2.最后一个参数MPERSP_2被解释为scale +### **2.最后一个参数MPERSP_2被解释为scale** -> 的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。 +> **的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。** From 20b66a4bce81f7013ad0d11da780e5edaa3da305 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 21 Jul 2016 15:04:25 +0800 Subject: [PATCH 167/615] Update --- CustomView/Base/[2]AngleAndRadian.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CustomView/Base/[2]AngleAndRadian.md b/CustomView/Base/[2]AngleAndRadian.md index 295b006c..bb974dae 100644 --- a/CustomView/Base/[2]AngleAndRadian.md +++ b/CustomView/Base/[2]AngleAndRadian.md @@ -51,10 +51,10 @@ C = 2πr; 可得: -**弧度 = 角度xπ/180** - -**角度 = 弧度x180/π** - +公式 | 例子 +----------------------|--------------------- +**弧度 = 角度xπ/180** | 2π = 360 x π / 180 +**角度 = 弧度x180/π** | 360 = 2π x 180 / π ## 四.一些细节问题 由于默认屏幕坐标系和常见数学坐标系的小差别([坐标系问题点这里](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md)),所以在角上必然也会存在一些区别,例如: From f0a95cadf3ad9928dca064ae8a57b50f0a911d5a Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 21 Jul 2016 15:05:44 +0800 Subject: [PATCH 168/615] Update --- CustomView/Base/[2]AngleAndRadian.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CustomView/Base/[2]AngleAndRadian.md b/CustomView/Base/[2]AngleAndRadian.md index bb974dae..086c8181 100644 --- a/CustomView/Base/[2]AngleAndRadian.md +++ b/CustomView/Base/[2]AngleAndRadian.md @@ -56,6 +56,13 @@ C = 2πr; **弧度 = 角度xπ/180** | 2π = 360 x π / 180 **角度 = 弧度x180/π** | 360 = 2π x 180 / π +维基百科的公式: + +> rad 是弧度, deg 是角度 + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f4hui2jaecj305m03lwee.jpg) + + ## 四.一些细节问题 由于默认屏幕坐标系和常见数学坐标系的小差别([坐标系问题点这里](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md)),所以在角上必然也会存在一些区别,例如: From 7740bbf2964babc6e56baf7a215f7240a01ac6b6 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 21 Jul 2016 17:15:35 +0800 Subject: [PATCH 169/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 85a35ab9..cd48e2bc 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -69,7 +69,7 @@ $$) > **实际上最后一行参数在3D变换中有着至关重要的作用,这一点会在后面中Camera一文中详细介绍。** -### **2.最后一个参数MPERSP_2被解释为scale** +**2.最后一个参数MPERSP_2被解释为scale** > **的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。** From 24c59d3a30868455a5ea4e923c34051117b2921d Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 22 Jul 2016 01:35:19 +0800 Subject: [PATCH 170/615] Update --- GankDevelopmentNote/chapter_1.md | 65 -------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 GankDevelopmentNote/chapter_1.md diff --git a/GankDevelopmentNote/chapter_1.md b/GankDevelopmentNote/chapter_1.md deleted file mode 100644 index f68e6726..00000000 --- a/GankDevelopmentNote/chapter_1.md +++ /dev/null @@ -1,65 +0,0 @@ -# Gank开发日志 - 整体规划 - -## 前言 - - 一直想找一个免费好用的网络接口做一个完完整整的客户端,然而一直没有找到合适的,直到某天看到代码家干货集中营的开放API,感觉很符合本人口味,于是决定做一个Gank的客户端。 - - 然而定睛一看,Gank已经有这么多客户端了,而且大部分都做的还不错,让我也是压力山大啊,个人觉得,既然要做,就肯定要做一个和别人不一样的,有特色的,这才有意思嘛,然而带收藏的,纯妹子的,日报型的都有了,思来想去,也没有找到和别人不同的突破点,于是就暂时搁置了,突然某天灵光乍现,作品要体现自己的特色,**自己的特色不就是懒么?所以就做一个最偷工减料的客户端吧**。 - -### 先预览完成效果,大家猜一下最终用了多少行代码:bangbang: - - - - -**嘻嘻,这个大家先慢慢猜,稍后再告诉大家结果,下面开始本篇正文,对项目进行整体规划。** - -## 一.需求分析 - - 在做项目之前,肯定要首先分析一下都需要哪些功能,以免花费大量精力结果实现了一些并没有什么卵用的功能。 - -### 基本功能 - -序号 | 功能 -:---:|-------------- - 1 | 展示最新的干货信息 - 2 | **看妹子,看妹子,看妹子!** - 3 | **保存妹子图片,保存妹子图片,保存妹子图片!** - 4 | 查看文章详情 - 5 | 可以方便的分享收藏文章 - - -### 可以砍掉功能 - - - -我们百万大哥曾说过,**要么砍需求,要么砍需求方**,由于本次需求是我自己提出来了,砍自己容易被当成精神病,所以我决定砍需求。 - -> **接下来请欣赏我如何为自己的偷懒找理由。** - -序号 | 需求 | 理由 -:---:|-----------------------|---------------- - 1 | 展示最新干货信息 | (必备功能,保留) - 2 | ~~看妹子~~ | (看妹子还要新建显示图片的界面,太麻烦,砍了) 喂喂喂,话说这才是核心功能吧:joy:怎能说砍就砍。(那就交给浏览器干吧) - 3 | ~~保存妹子~~ | (既然看妹子都交给浏览器干了,那保存妹子自然也是浏览器的活) - 4 | ~~查看文章详情~~ |(什么?你说要做一个内置的浏览器(WebView)用来看文章?,话说一旦做了内置浏览器,就需要提供分享功能,提供查看保存妹子功能等等......这么繁重的活怎么能自己干,果断抛出去,拜拜啦,万恶的内置浏览器。) - 5 | ~~方便的分享保存文章~~ | (话说这活不是已经交给其他浏览器干了么?) - -**砍需求成功,最终只剩一个需求了,哇哈哈哈哈哈哈~~~~~~~~** - -话说这样砍需求会不会影响体验效果?接下来分析一下使用外置浏览器的好处。 - -序号 | 优点 -:---:|--------- - 1 | 手机默认都有浏览器,所以满足基本需求应该不成问题。 - 2 | 防止内置浏览器(WebView)因兼容性问题导致阅读效果不佳。 - 3 | 如果使用Chrome浏览器,360浏览器等并登陆账号,可以方便将手机收藏同步到电脑,毕竟大部分技术文章在手机端查看效果并不是很好。个人推荐使用Chrome,用Google账号登陆,在文末会提供科学上网软件。 - 4 | 作为本应用和核心功能,看妹子,保存妹子,浏览器都可以很好的完成,甚至你可以在浏览器中搜索图片出处,高清大图以及类似图片(首先,你要有一个Chrome和科学上网软件) 效果见下:point_down: - - - - - - - - - From 2da14ef96e86f071c0daf9b1c93f6d9603d00150 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 22 Jul 2016 02:47:02 +0800 Subject: [PATCH 171/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index cd48e2bc..36c5877e 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -63,7 +63,7 @@ $$) ## 三、Matrix常见误解 -在写本文之前,我翻阅很多介绍 Matrix 的文章和官方文档,但其中文的搜索结果令我很悲伤,大部分的中文章对Matrix都存在误解,想当然的创造出一些错误的理论, 导致很多(抄袭)的文章都是这一错误的理论,不知道要坑害多少小白,常见的错误理论有: +在写本文之前,我翻阅很多介绍 Matrix 的文章和官方文档,但其中文的搜索结果令我很悲伤,大部分的中文文章对Matrix都存在误解,想当然的创造出一些错误的理论, 导致很多(抄袭)的文章都是这一错误的理论,不知道要坑害多少小白,常见的错误理论有: **1.认为Matrix最下面的一行的三个参数(MPERSP_0、MPERSP_1、MPERSP_2)没有什么太大的作用,在这里只是为了凑数。** @@ -74,6 +74,17 @@ $$) > **的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。** +## 四、Matrix原理详解 + +Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识,不过我会尽量用通俗易懂的方式来帮助大家理解它。 + +**Matrix 作为一个模型,实际上的作用就是数值转换,将一个坐标系中的点映射到另一个坐标系中,举个栗子:** + + + + + + From 8e39014116087780f79e73e7422c3af412e34154 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 22 Jul 2016 03:42:32 +0800 Subject: [PATCH 172/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 36c5877e..61d1eee0 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -80,6 +80,13 @@ Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识, **Matrix 作为一个模型,实际上的作用就是数值转换,将一个坐标系中的点映射到另一个坐标系中,举个栗子:** +我的的手机屏幕作为物理设备,其坐标系肯定是从左上角开始的,而且是不会改变的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系,通常情况下,我们的内容区和屏幕坐标系还相差一个通知栏和一个标题栏,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的屏幕坐标系来绘制。 + +假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点,Matrix在此处的作用就是转换这些数值。 + +我们知道,Android中点视图是可以嵌套的树形结构,每一个子View都有自己的坐标系,但实际绘制时都应当转换为实际的屏幕坐标系才能正确的绘制,所以让每一个子View都有一个Matrix,这样每一个View就都拥有了转换坐标的能力,可以非常方便的将各自的坐标系中的内容映射到屏幕坐标系中。 + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f624vi3eb6j30rs0goab5.jpg) From 2c0f232460146ddc259e8dcfebc69507368a23e9 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 22 Jul 2016 03:54:40 +0800 Subject: [PATCH 173/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 61d1eee0..d22e1a11 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -16,7 +16,16 @@ > ### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 -也就是说, 我们进行界面视图等转换都是需要依靠 Matrix 的帮助的,例如我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的画布操作,这些操作的核心就是改变 Matrix 的数值,我们常见的可以用到Matrix的地方就是 canvas、 path、 bitmap 和 camera 等地方,对于我们Android程序员来说,只要是图形化界面展示,就有Matrix在后台默默工作。 +**Matrix 作为一个模型,主要功能就是数值转换,将一个坐标系中的点映射到另一个坐标系中,举个栗子:** + +我的的手机屏幕作为物理设备,其坐标系肯定是从左上角开始的,而且是不会改变的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系,通常情况下,我们的内容区和屏幕坐标系还相差一个通知栏和一个标题栏,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的屏幕坐标系来绘制。 + +假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点,Matrix在此处的作用就是转换这些数值。 + +我们知道,Android中点视图是可以嵌套的树形结构,每一个子View都有自己的坐标系,但实际绘制时都应当转换为实际的屏幕坐标系才能正确的绘制,所以让每一个子View都有一个Matrix,这样每一个View就都拥有了转换坐标的能力,可以非常方便的将各自的坐标系中的内容映射到屏幕坐标系中。 + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f624vi3eb6j30rs0goab5.jpg) + ## 二、Matrix基本原理 @@ -78,15 +87,12 @@ $$) Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识,不过我会尽量用通俗易懂的方式来帮助大家理解它。 -**Matrix 作为一个模型,实际上的作用就是数值转换,将一个坐标系中的点映射到另一个坐标系中,举个栗子:** +## 四大常用操作 -我的的手机屏幕作为物理设备,其坐标系肯定是从左上角开始的,而且是不会改变的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系,通常情况下,我们的内容区和屏幕坐标系还相差一个通知栏和一个标题栏,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的屏幕坐标系来绘制。 +我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的四种画布操作(translate, scale, rotate, skew),这些操作的核心就是改变Matrix的数值,接下来我们看看这四种操作都会影响到哪些数值。 -假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点,Matrix在此处的作用就是转换这些数值。 -我们知道,Android中点视图是可以嵌套的树形结构,每一个子View都有自己的坐标系,但实际绘制时都应当转换为实际的屏幕坐标系才能正确的绘制,所以让每一个子View都有一个Matrix,这样每一个View就都拥有了转换坐标的能力,可以非常方便的将各自的坐标系中的内容映射到屏幕坐标系中。 -![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f624vi3eb6j30rs0goab5.jpg) From 705564455852a26d9f9c7348e82d66056bbcaf23 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 22 Jul 2016 04:01:04 +0800 Subject: [PATCH 174/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 29 ++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index d22e1a11..cc8fed6c 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -7,22 +7,37 @@ ## 一、Matrix作用 -如题,本篇的主角是 Matrix。 +如题,本篇的主角是 Matrix,看起来大概是下面这样: + +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} +MSCALE\\_X & MSKEW\\_X & MTRANS\\_X \\\\ +\\\\ +MSKEW\\_Y & MSCALE\\_Y & MTRANS\\_Y \\\\ +\\\\ +MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 +\\end{1} +\\right ] +$$) 它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(_Android中有两个Matrix,分别属于OpenGL 和 graphics, 本篇主要讲述的是graphics中的Matrix_), -另外,本篇的重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 +本篇的重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 > ### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 **Matrix 作为一个模型,主要功能就是数值转换,将一个坐标系中的点映射到另一个坐标系中,举个栗子:** -我的的手机屏幕作为物理设备,其坐标系肯定是从左上角开始的,而且是不会改变的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系,通常情况下,我们的内容区和屏幕坐标系还相差一个通知栏和一个标题栏,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的屏幕坐标系来绘制。 +我的的手机屏幕作为物理设备,其坐标系肯定是从左上角开始的,而且是不会改变的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系,通常情况下,我们的内容区和屏幕坐标系还相差一个通知栏加一个标题栏的距离,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的屏幕坐标系来绘制,Matrix在此处的作用就是转换这些数值。 -假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点,Matrix在此处的作用就是转换这些数值。 +> +假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点。 -我们知道,Android中点视图是可以嵌套的树形结构,每一个子View都有自己的坐标系,但实际绘制时都应当转换为实际的屏幕坐标系才能正确的绘制,所以让每一个子View都有一个Matrix,这样每一个View就都拥有了转换坐标的能力,可以非常方便的将各自的坐标系中的内容映射到屏幕坐标系中。 +> +我们也知道,Android中点视图是可以嵌套的树形结构,每一个子View都有自己的坐标系,但实际绘制时都应当转换为实际的屏幕坐标系才能正确的绘制,所以让每一个子View都有一个Matrix,这样每一个View就都拥有了转换坐标的能力,可以非常方便的将各自的坐标系中的内容映射到屏幕坐标系中。 ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f624vi3eb6j30rs0goab5.jpg) @@ -70,7 +85,7 @@ $$) > **从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇范围内,暂不过多叙述,会在之后对文章中详述其作用。** -## 三、Matrix常见误解 +### 常见误解 在写本文之前,我翻阅很多介绍 Matrix 的文章和官方文档,但其中文的搜索结果令我很悲伤,大部分的中文文章对Matrix都存在误解,想当然的创造出一些错误的理论, 导致很多(抄袭)的文章都是这一错误的理论,不知道要坑害多少小白,常见的错误理论有: @@ -83,7 +98,7 @@ $$) > **的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。** -## 四、Matrix原理详解 +## 三、Matrix原理详解 Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识,不过我会尽量用通俗易懂的方式来帮助大家理解它。 From 0291f358d27f6d05ffddf210c14926870a489d30 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 22 Jul 2016 04:01:30 +0800 Subject: [PATCH 175/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index cc8fed6c..a80802f6 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -26,7 +26,6 @@ $$) 本篇的重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 -> ### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 **Matrix 作为一个模型,主要功能就是数值转换,将一个坐标系中的点映射到另一个坐标系中,举个栗子:** From 8c76929f7deafeb34d2f33596a4dc5bafc47eccb Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 22 Jul 2016 07:26:20 +0800 Subject: [PATCH 176/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index a80802f6..ad730082 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -97,7 +97,14 @@ $$) > **的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。** -## 三、Matrix原理详解 +## 三、Matrix优缺点 + +Matrix在view、canvas、path、bitmap等很多地方都有应用,可以说运用十分广泛,优点突出,但也存在一定但缺点,下面简要介绍一下Matrix相关优缺点。 + +### 优点 + + + Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识,不过我会尽量用通俗易懂的方式来帮助大家理解它。 From 91d7fd579db287bf6b81934c8fff9fca8e473cdc Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 22 Jul 2016 14:47:51 +0800 Subject: [PATCH 177/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index ad730082..d9998475 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -103,6 +103,10 @@ Matrix在view、canvas、path、bitmap等很多地方都有应用,可以说运 ### 优点 +* 计算方便,利用矩阵的计算法则 +* 方便复用,Matrix仅有九个数值,却包含了大部分画布的状态信息,如果有重复的需要相同状态的地方,只需要构造好一个Matrix,然后设置给不同的画布即可,无需给每一个画布都重新构造状态,同样,如果一张图片需要在不同的地方以状态(镜像,旋转)展示,可以只放一张资源图片,然后构造出不同的Matrix进行设置即可。 +* + From dfc8926134a4f0f0a9a5779e941a12cd40ba5c53 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 22 Jul 2016 21:28:29 +0800 Subject: [PATCH 178/615] Update --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 17ef6ddf..f42bec5a 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ -# AndroidNote -### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f6307cu3krj30rs05kglz.jpg) -我的安卓学习笔记,记录学习过程中遇到的问题,以及我发布的安卓相关文章。 +### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -如果出现链接失效等情况可以提交Issues提醒我修改相关内容。 +我的安卓学习笔记,记录学习过程中遇到的问题,以及我的一些经验总结。如果出现链接失效等情况可以提交Issues提醒我修改相关内容。 > #### PS:点击分类标题可以查看该分类的详细信息。 From 6513bf57197f001a1c19a370a86f7bb5513a7de0 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 22 Jul 2016 23:21:08 +0800 Subject: [PATCH 179/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index d9998475..e79df6e6 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -79,7 +79,7 @@ $$) 从上表中可以看出一些内容,下面我们看一下2D画布中常用的四种操作(translate, scale, rotate, skew)都是由哪些参数控制的。 ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f60gwrhlnyj30c008zdgy.jpg) -![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f60gx3a9z5j30c008zwf0.jpg) +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f633hvklfnj30c008zdge.jpg) > **从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇范围内,暂不过多叙述,会在之后对文章中详述其作用。** From 443bd862e3fdc9dfc871672f968f11c503c85ccc Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 00:58:04 +0800 Subject: [PATCH 180/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index e79df6e6..3ca77faf 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -103,9 +103,15 @@ Matrix在view、canvas、path、bitmap等很多地方都有应用,可以说运 ### 优点 -* 计算方便,利用矩阵的计算法则 -* 方便复用,Matrix仅有九个数值,却包含了大部分画布的状态信息,如果有重复的需要相同状态的地方,只需要构造好一个Matrix,然后设置给不同的画布即可,无需给每一个画布都重新构造状态,同样,如果一张图片需要在不同的地方以状态(镜像,旋转)展示,可以只放一张资源图片,然后构造出不同的Matrix进行设置即可。 -* +* 计算方便,利用矩阵的计算法则可以方便的将一个坐标系转换为另一个坐标系中。 +* 存储量小,Matrix仅有九个数值,却包含了大部分画布的状态信息。 +* 方便复用,如果有重复的需要相同状态的地方,只需要构造好一个Matrix,设置给不同的画布即可保证每一个画布的状态都是相同的,无需给每一个画布都重新构造状态。另外,如果一张图片需要以不同的状态展示,可以只放一张资源图片,然后构造出不同的Matrix进行设置即可。 + +### 缺点 + +* 稍有门槛,Matrix计算运用了线性代数的知识,有一定的门槛,虽然封装了比较好的方法,但对于大部分人来说,pre、post、set有啥区别还是傻傻分不清楚,更不用说仿射,投影,齐次坐标这些让人头大的概念。 +* 容易混淆,Matrix的方法变换 和 Canvas的方法变换 稍微有所差别, 如果按照Canvas的变换方法直接构造Matrix,最后的结果可能会与你想象的有所差别。 + @@ -136,11 +142,11 @@ Matrix 有很多常用和不常用的方法, 方法类别 | 相关API | 摘要 -----------|---------------------------------------------------------|------------------------ 基本方法 | equals hashCode toString toShortString | 比较、 获取哈希值、 转换为字符串 -数值操作 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值 +数值操作 | 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 | 后乘变换 -数值计算 | mapPoints mapRadius mapRect mapVectors | 计算变换后的数值 特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... From 2728b4da974c9f9b0d6c11a66356fecda578304a Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 01:01:59 +0800 Subject: [PATCH 181/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 3ca77faf..a6d6481a 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -22,21 +22,17 @@ MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 \\right ] $$) -它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(_Android中有两个Matrix,分别属于OpenGL 和 graphics, 本篇主要讲述的是graphics中的Matrix_), - -本篇的重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。 +它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(_本篇讲述的是graphics中的Matrix_), ### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 -**Matrix 作为一个模型,主要功能就是数值转换,将一个坐标系中的点映射到另一个坐标系中,举个栗子:** +Matrix 作为一个模型,主要功能就是数值转换,将一个坐标系中的点映射到另一个坐标系中,举个栗子: 我的的手机屏幕作为物理设备,其坐标系肯定是从左上角开始的,而且是不会改变的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系,通常情况下,我们的内容区和屏幕坐标系还相差一个通知栏加一个标题栏的距离,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的屏幕坐标系来绘制,Matrix在此处的作用就是转换这些数值。 > 假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点。 -> -我们也知道,Android中点视图是可以嵌套的树形结构,每一个子View都有自己的坐标系,但实际绘制时都应当转换为实际的屏幕坐标系才能正确的绘制,所以让每一个子View都有一个Matrix,这样每一个View就都拥有了转换坐标的能力,可以非常方便的将各自的坐标系中的内容映射到屏幕坐标系中。 ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f624vi3eb6j30rs0goab5.jpg) @@ -59,11 +55,6 @@ MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 $$) -**数值作用的介绍:** - -> -根据名称我们就能猜到其大概作用,但有些效果是需要多个参数组合控制的,如下。 - 序号 | 名称 | 对应单词 | 摘要 -----|----------|-------------|-------------- 0 | MSCALE_X | scale | 控制X坐标 缩放,旋转 From 5a87381bfc84fc00dcd59184638cf1c3ec65eb86 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 01:05:12 +0800 Subject: [PATCH 182/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index a6d6481a..88385e21 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -24,11 +24,11 @@ $$) 它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(_本篇讲述的是graphics中的Matrix_), -### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型。 +### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型,主要功能是坐标映射,数值转换。 -Matrix 作为一个模型,主要功能就是数值转换,将一个坐标系中的点映射到另一个坐标系中,举个栗子: +我的的手机屏幕作为物理设备,其坐标系是从左上角开始的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系。 -我的的手机屏幕作为物理设备,其坐标系肯定是从左上角开始的,而且是不会改变的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系,通常情况下,我们的内容区和屏幕坐标系还相差一个通知栏加一个标题栏的距离,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的屏幕坐标系来绘制,Matrix在此处的作用就是转换这些数值。 +以下图为例,我们的内容区和屏幕坐标系还相差一个通知栏加一个标题栏的距离,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的屏幕坐标系来绘制,Matrix在此处的作用就是转换这些数值。 > 假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点。 From 3ee920843e4198f87d25ff08c348840750d0639a Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 01:11:09 +0800 Subject: [PATCH 183/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 88385e21..7d90ffe5 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -88,28 +88,12 @@ $$) > **的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。** -## 三、Matrix优缺点 +## 三、Matrix详解 -Matrix在view、canvas、path、bitmap等很多地方都有应用,可以说运用十分广泛,优点突出,但也存在一定但缺点,下面简要介绍一下Matrix相关优缺点。 +Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识,我会尽量用通俗易懂的方式来帮助大家理解它。 -### 优点 -* 计算方便,利用矩阵的计算法则可以方便的将一个坐标系转换为另一个坐标系中。 -* 存储量小,Matrix仅有九个数值,却包含了大部分画布的状态信息。 -* 方便复用,如果有重复的需要相同状态的地方,只需要构造好一个Matrix,设置给不同的画布即可保证每一个画布的状态都是相同的,无需给每一个画布都重新构造状态。另外,如果一张图片需要以不同的状态展示,可以只放一张资源图片,然后构造出不同的Matrix进行设置即可。 - -### 缺点 - -* 稍有门槛,Matrix计算运用了线性代数的知识,有一定的门槛,虽然封装了比较好的方法,但对于大部分人来说,pre、post、set有啥区别还是傻傻分不清楚,更不用说仿射,投影,齐次坐标这些让人头大的概念。 -* 容易混淆,Matrix的方法变换 和 Canvas的方法变换 稍微有所差别, 如果按照Canvas的变换方法直接构造Matrix,最后的结果可能会与你想象的有所差别。 - - - - - -Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识,不过我会尽量用通俗易懂的方式来帮助大家理解它。 - -## 四大常用操作 +### 四大常用操作 我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的四种画布操作(translate, scale, rotate, skew),这些操作的核心就是改变Matrix的数值,接下来我们看看这四种操作都会影响到哪些数值。 From b7df5963a8aa7792bf6da47d5ea25f23091f0e22 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 01:15:22 +0800 Subject: [PATCH 184/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 7d90ffe5..62625bd3 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -1,13 +1,16 @@ # Matrix基础 -前面讲了四篇 Path 相关的内容,本次终于要到了大家期盼已久的黑客帝国! +前面讲了四篇 Path 相关的内容,本次终于要到了大家期盼已久的黑客帝国(Matrix)! ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) -## 一、Matrix作用 -如题,本篇的主角是 Matrix,看起来大概是下面这样: +****** + +## 一、Matrix简介 + +如题,本篇的主角是 Matrix,其实和黑客帝国并没有太大关系,它看起来大概是下面这样: ![](http://latex.codecogs.com/png.latex? $$ @@ -22,9 +25,7 @@ MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 \\right ] $$) -它在我们在之前的很多文章中都提及过,但并没有仔细的介绍过,从本篇开始终于要正式介绍它了,这个在2D和3D绘图中十分重要的角色Matrix(_本篇讲述的是graphics中的Matrix_), - -### Matrix 的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,其作用则是一个模型,一个控制视图状态的模型,主要功能是坐标映射,数值转换。 +### Matrix概念: Matrix的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,也一个控制视图状态的模型,主要功能是坐标映射,数值转换。 我的的手机屏幕作为物理设备,其坐标系是从左上角开始的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系。 From 9a81e8381fd041bebd3052356865ba36e0d1354d Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 01:18:44 +0800 Subject: [PATCH 185/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 62625bd3..a832761c 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -1,4 +1,4 @@ -# Matrix基础 +# Matrix基础篇 前面讲了四篇 Path 相关的内容,本次终于要到了大家期盼已久的黑客帝国(Matrix)! From 10d43506ff0b1f1e5a9e39bd53d985aa429de9cf Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 01:31:39 +0800 Subject: [PATCH 186/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index a832761c..47296055 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -1,7 +1,9 @@ # Matrix基础篇 -前面讲了四篇 Path 相关的内容,本次终于要到了大家期盼已久的黑客帝国(Matrix)! +## 前言 + +前面讲了四篇 Path 相关的内容,经过长时间的拖更,终于要到了大家期盼已久的 Matrix, 一个与黑客帝国同名的东东,看名字就知道很不凡,接下来我们就看看这个 Matrix 到底是何方神圣。 ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) From 4ff6481eec2fdd788b4171b1a8e7691d43420b1f Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 02:07:25 +0800 Subject: [PATCH 187/615] Update --- CustomView/Advance/[1]CustomViewProcess.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CustomView/Advance/[1]CustomViewProcess.md b/CustomView/Advance/[1]CustomViewProcess.md index dcbbc99b..f01a4f17 100644 --- a/CustomView/Advance/[1]CustomViewProcess.md +++ b/CustomView/Advance/[1]CustomViewProcess.md @@ -8,6 +8,9 @@ ## 前言 **本章节为什么要叫进阶篇?(虽然讲的是基础内容),因为从本篇开始,将会逐渐揭开自定义View的神秘面纱,每一篇都将比上一篇内容更加深入,利用所学的知识能够制作更加炫酷自定义View,就像在台阶上一样,每一篇都更上一层,~~帮助大家一步步走向人生巅峰,出任CEO,迎娶白富美。~~ 误,是帮助大家更加了解那些炫酷的自定义View是如何制作的,达到举一反三的效果。** +添加一个自定义View绘制流程函数调用链(简化版) + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f6389npihlj30fr0hejs9.jpg) ## 一.自定义View分类 From 3e4f755dd74ea00335bb8d29462b78e7a9a8d11f Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 02:22:21 +0800 Subject: [PATCH 188/615] Update --- CustomView/Advance/[1]CustomViewProcess.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[1]CustomViewProcess.md b/CustomView/Advance/[1]CustomViewProcess.md index f01a4f17..53c9a0a0 100644 --- a/CustomView/Advance/[1]CustomViewProcess.md +++ b/CustomView/Advance/[1]CustomViewProcess.md @@ -10,7 +10,8 @@ 添加一个自定义View绘制流程函数调用链(简化版) -![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f6389npihlj30fr0hejs9.jpg) +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f638q87ubaj30fr0heaaw.jpg) + ## 一.自定义View分类 From 1016a858c79fc4ac655339e7583b0c132bdec510 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 02:23:47 +0800 Subject: [PATCH 189/615] Update --- CustomView/Advance/[1]CustomViewProcess.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[1]CustomViewProcess.md b/CustomView/Advance/[1]CustomViewProcess.md index 53c9a0a0..4dbf43b7 100644 --- a/CustomView/Advance/[1]CustomViewProcess.md +++ b/CustomView/Advance/[1]CustomViewProcess.md @@ -8,7 +8,7 @@ ## 前言 **本章节为什么要叫进阶篇?(虽然讲的是基础内容),因为从本篇开始,将会逐渐揭开自定义View的神秘面纱,每一篇都将比上一篇内容更加深入,利用所学的知识能够制作更加炫酷自定义View,就像在台阶上一样,每一篇都更上一层,~~帮助大家一步步走向人生巅峰,出任CEO,迎娶白富美。~~ 误,是帮助大家更加了解那些炫酷的自定义View是如何制作的,达到举一反三的效果。** -添加一个自定义View绘制流程函数调用链(简化版) +自定义View绘制流程函数调用链(简化版) ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f638q87ubaj30fr0heaaw.jpg) From 007e8ebb8733c5c92ab942f4e96b472a76d49e50 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 02:27:48 +0800 Subject: [PATCH 190/615] Update --- CustomView/Advance/[1]CustomViewProcess.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[1]CustomViewProcess.md b/CustomView/Advance/[1]CustomViewProcess.md index 4dbf43b7..5d25f20b 100644 --- a/CustomView/Advance/[1]CustomViewProcess.md +++ b/CustomView/Advance/[1]CustomViewProcess.md @@ -10,7 +10,7 @@ 自定义View绘制流程函数调用链(简化版) -![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f638q87ubaj30fr0heaaw.jpg) +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f638wreu74j30fc0heaay.jpg) ## 一.自定义View分类 From eb3c2ba69ebd54fe48376fbb58dcf8f2fe51c169 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 04:17:12 +0800 Subject: [PATCH 191/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 47296055..0102c308 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -68,7 +68,7 @@ $$) 5 | MTRANS_Y | transfer | 控制Y坐标 位移 6 | MPERSP_0 | perspective | 控制透视 (绕Y轴旋转) 7 | MPERSP_1 | perspective | 控制透视 (绕X轴旋转) - 8 | MPERSP_2 | perspective | 控制透视 (通常为1) + 8 | MPERSP_2 | perspective | 控制透视 (齐次坐标标志位,通常为1) 从上表中可以看出一些内容,下面我们看一下2D画布中常用的四种操作(translate, scale, rotate, skew)都是由哪些参数控制的。 From 65fe66faa4db4e10b28aa6e4a351231cd00dc712 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 18:59:18 +0800 Subject: [PATCH 192/615] Update --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f42bec5a..d4df808c 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ > #### PS:点击分类标题可以查看该分类的详细信息。 -## [自定义View系列](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) +## [自定义View系列](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 序号 | 内容 :----:|--------- @@ -25,7 +25,7 @@ ****** -## [教程类](https://github.com/GcsSloop/AndroidNote/tree/master/Course) +## [教程类](https://github.com/GcsSloop/AndroidNote/tree/master/Course/README.md) 序号 | 内容 :---:|-------- @@ -34,7 +34,7 @@ ****** -## [速查表](https://github.com/GcsSloop/AndroidNote/tree/master/QuickChart) +## [速查表](https://github.com/GcsSloop/AndroidNote/tree/master/QuickChart/README.md) 序号 | 内容 :---:|--------------- @@ -44,7 +44,7 @@ ****** -## [混沌水晶](https://github.com/GcsSloop/AndroidNote/tree/master/ChaosCrystal) +## [混沌水晶](https://github.com/GcsSloop/AndroidNote/tree/master/ChaosCrystal/README.md) 混沌水晶本身并没有太大功效,但与其他物品合成之后可能产生质的变化。 From ad7be6bf734cf52767f2a90084287c2db1443cd2 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 19:00:03 +0800 Subject: [PATCH 193/615] Update --- CustomView/Base/[1]CoordinateSystem.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Base/[1]CoordinateSystem.md b/CustomView/Base/[1]CoordinateSystem.md index 2e90e234..e4b1f9ab 100644 --- a/CustomView/Base/[1]CoordinateSystem.md +++ b/CustomView/Base/[1]CoordinateSystem.md @@ -1,7 +1,7 @@ # 安卓中的坐标系 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) ## 一.屏幕坐标系和数学坐标系的区别 From 560fc7faa2f60d9e74c2fe4a26e6fae86c9af1e6 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 19:00:30 +0800 Subject: [PATCH 194/615] Update --- CustomView/Base/[2]AngleAndRadian.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Base/[2]AngleAndRadian.md b/CustomView/Base/[2]AngleAndRadian.md index 086c8181..e262ee81 100644 --- a/CustomView/Base/[2]AngleAndRadian.md +++ b/CustomView/Base/[2]AngleAndRadian.md @@ -1,7 +1,7 @@ # 角度与弧度 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 安卓中角度(angle)与弧度(radian)的有关问题。 From e44d10d8eb671ea43a57951d8d99cd16fe2da6e0 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 19:00:47 +0800 Subject: [PATCH 195/615] Update --- CustomView/Base/[3]Color.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Base/[3]Color.md b/CustomView/Base/[3]Color.md index d27d00f4..f5b0b7c1 100644 --- a/CustomView/Base/[3]Color.md +++ b/CustomView/Base/[3]Color.md @@ -1,7 +1,7 @@ # 颜色 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 简要介绍安卓中的颜色相关内容,包括颜色的定义,创建颜色的几种方式,以及颜色的混合模式等。 From d5240c909a424231931b4be3691c62d699cd87a6 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 19:02:26 +0800 Subject: [PATCH 196/615] Update --- CustomView/Advance/[1]CustomViewProcess.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[1]CustomViewProcess.md b/CustomView/Advance/[1]CustomViewProcess.md index 5d25f20b..c4fe7973 100644 --- a/CustomView/Advance/[1]CustomViewProcess.md +++ b/CustomView/Advance/[1]CustomViewProcess.md @@ -1,7 +1,7 @@ # 自定义View分类与流程 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 经历过前面三篇啰啰嗦嗦的基础篇之后,终于到了进阶篇,正式进入解析自定义View的阶段。 From 7ddcae40ed05ccfad03d7508fe4a0a216d13aafa Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 19:02:55 +0800 Subject: [PATCH 197/615] Update --- CustomView/Advance/[2]Canvas_BasicGraphics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[2]Canvas_BasicGraphics.md b/CustomView/Advance/[2]Canvas_BasicGraphics.md index 0eacbedf..52fe87fd 100644 --- a/CustomView/Advance/[2]Canvas_BasicGraphics.md +++ b/CustomView/Advance/[2]Canvas_BasicGraphics.md @@ -1,7 +1,7 @@ # Canvas之绘制基本形状 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 在上一篇[自定义View分类与流程](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B1%5DCustomViewProcess.md)中我们了解自定义View相关的基本知识,不过,这些东西依旧还是理论,并不能**拿来(zhuang)用(B)**, 这一次我们就了解一些**能(zhaung)用(B)**的东西。 From 0fb6445289d61ddb80de524a7bdd35aa7babb90f Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 19:03:15 +0800 Subject: [PATCH 198/615] Update --- CustomView/Advance/[3]Canvas_Convert.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[3]Canvas_Convert.md b/CustomView/Advance/[3]Canvas_Convert.md index 5d47a6a9..214ca7b6 100644 --- a/CustomView/Advance/[3]Canvas_Convert.md +++ b/CustomView/Advance/[3]Canvas_Convert.md @@ -1,7 +1,7 @@ # Canvas之画布操作 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 上一篇[Canvas之绘制基本形状](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md)中我们了解了如何使用Canvas绘制基本图形,本次了解一些基本的画布操作。 From c0d5c0ecd4c3037b4b821cdc9abf02c6ef5f720e Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 19:04:01 +0800 Subject: [PATCH 199/615] Update --- CustomView/Advance/[4]Canvas_PictureText.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[4]Canvas_PictureText.md b/CustomView/Advance/[4]Canvas_PictureText.md index 401d21a4..c87e1bba 100644 --- a/CustomView/Advance/[4]Canvas_PictureText.md +++ b/CustomView/Advance/[4]Canvas_PictureText.md @@ -1,7 +1,7 @@ # Canvas之图片文字 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 在上一篇文章[Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md)中我们了解了画布的一些基本操作方法,本次了解一些绘制图片文字相关的内容。如果你对前几篇文章讲述的内容熟练掌握的话,那么恭喜你,本篇结束之后,大部分的自定义View已经难不倒你了,当然了,这并不是终点,接下来还会有更加炫酷的技能。 From 7d293af3dfb6fcf686cef122341046f86ad2b160 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 19:04:30 +0800 Subject: [PATCH 200/615] Update --- CustomView/Advance/[5]Path_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[5]Path_Basic.md b/CustomView/Advance/[5]Path_Basic.md index acd7df0c..69a63c18 100644 --- a/CustomView/Advance/[5]Path_Basic.md +++ b/CustomView/Advance/[5]Path_Basic.md @@ -2,7 +2,7 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 在上一篇[Canvas之图片文字](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md)中我们了解了如何使用Canvas中绘制图片文字,结合前几篇文章,Canvas的基本操作已经差不多完结了,然而Canvas不仅仅具有这些基本的操作,还可以更加炫酷,本次会了解到path(路径)这个Canvas中的神器,有了这个神器,就能创造出更多**炫(zhuang)酷(B)**的东东了。 From 81c13c86eefa83f00ee532fce2a525a76d8430c5 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 19:04:54 +0800 Subject: [PATCH 201/615] Update --- CustomView/Advance/[6]Path_Bezier.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[6]Path_Bezier.md b/CustomView/Advance/[6]Path_Bezier.md index cade573c..a202261b 100644 --- a/CustomView/Advance/[6]Path_Bezier.md +++ b/CustomView/Advance/[6]Path_Bezier.md @@ -1,7 +1,7 @@ # Path之贝塞尔曲线 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 在上一篇文章[Path之基本图形](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_BasicGraphics.md)中我们了解了Path的基本使用方法,本次了解Path中非常非常非常重要的内容-贝塞尔曲线。 From 5cab4881331c7fe44c440eb9a9f1f8562995ed90 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 19:05:17 +0800 Subject: [PATCH 202/615] Update --- CustomView/Advance/[7]Path_Over.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[7]Path_Over.md b/CustomView/Advance/[7]Path_Over.md index 88cbd1b7..58ee9a6e 100644 --- a/CustomView/Advance/[7]Path_Over.md +++ b/CustomView/Advance/[7]Path_Over.md @@ -1,7 +1,7 @@ # Path之完结篇(伪) ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 经历过前两篇 [Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) 和 [Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) 的讲解,本篇终于进入Path的收尾篇,本篇结束后Path的大部分相关方法都已经讲解完了,但Path还有一些更有意思的玩法,应该会在后续的文章中出现吧,嗯,应该会的ˊ_>ˋ From dcf74c8210bf720619c071181a82adbc0b5d4d55 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 23 Jul 2016 19:05:36 +0800 Subject: [PATCH 203/615] Update --- CustomView/Advance/[8]Path_Play.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index eeca557b..c2a307fe 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -1,7 +1,7 @@ # Path之玩出花样(PathMeasure) ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 可以看到,在经过 From 5018f7722b73b67d9ba3aba171c10b8a5c72388d Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 24 Jul 2016 02:13:56 +0800 Subject: [PATCH 204/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 0102c308..0abe9ed0 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -39,6 +39,7 @@ $$) ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f624vi3eb6j30rs0goab5.jpg) +以上是仅以2D空间作为例子,然而我们在实际的软件开发过程中,为了有较好的空间层次感,可能都要求有一些3D效果,将3D效果的3维影像投影到2维的屏幕,也是依靠Matrix的转换。 ## 二、Matrix基本原理 @@ -95,6 +96,13 @@ $$) Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识,我会尽量用通俗易懂的方式来帮助大家理解它。 +在讲解之前我们先简单的理解几个概念和其作用。 + +### 1.齐次坐标 + +* 作用: 用于区分坐标和向量,方便进行仿射变换。 +* 摘要: 在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,我们人可以根据上下文信息区分这是点还是向量,而计算机则无法区分,为此我们增加了一个标志位来让计算机也可以区分它们,增加时候看起来是这样:
+**点(x: y: 1) | 向量(x: y: 0)**
### 四大常用操作 From 900b30df7115ffd2d3e04bbb946d5660f133b8f9 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 24 Jul 2016 02:33:08 +0800 Subject: [PATCH 205/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 0abe9ed0..67f49f41 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -102,7 +102,10 @@ Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识, * 作用: 用于区分坐标和向量,方便进行仿射变换。 * 摘要: 在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,我们人可以根据上下文信息区分这是点还是向量,而计算机则无法区分,为此我们增加了一个标志位来让计算机也可以区分它们,增加时候看起来是这样:
-**点(x: y: 1) | 向量(x: y: 0)**
+**点(x : y : 1) - 向量(x : y : 0)**
+你可能注意到了,我将分隔符换成了冒号,这是因为齐次坐标具有等比的性质,(2:3:1)、(4:6:2)...(2N,3N,N)表示的均是(2,3)这一个点。 + +### ### 四大常用操作 From 27f613768d906bff1b7ef461930941edc5040648 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 24 Jul 2016 02:37:49 +0800 Subject: [PATCH 206/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 67f49f41..13e1eaa5 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -103,7 +103,7 @@ Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识, * 作用: 用于区分坐标和向量,方便进行仿射变换。 * 摘要: 在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,我们人可以根据上下文信息区分这是点还是向量,而计算机则无法区分,为此我们增加了一个标志位来让计算机也可以区分它们,增加时候看起来是这样:
**点(x : y : 1) - 向量(x : y : 0)**
-你可能注意到了,我将分隔符换成了冒号,这是因为齐次坐标具有等比的性质,(2:3:1)、(4:6:2)...(2N,3N,N)表示的均是(2,3)这一个点。 +你可能注意到了,我将分隔符换成了冒号,这是因为齐次坐标具有等比的性质,(2:3:1)、(4:6:2)...(2N,3N,N)表示的均是(2,3)这一个点。(这也是为什么会产生将MPERSP_2解释为scale这一误解了) ### From bb6329ce5c5285ee64097d36c4ea8c5e3371bbdd Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 24 Jul 2016 02:53:41 +0800 Subject: [PATCH 207/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 13e1eaa5..8989ea75 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -96,16 +96,23 @@ $$) Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识,我会尽量用通俗易懂的方式来帮助大家理解它。 -在讲解之前我们先简单的理解几个概念和其作用。 +我们先简单的理解几个概念和其作用。 -### 1.齐次坐标 +### 1.齐次坐标系 -* 作用: 用于区分坐标和向量,方便进行仿射变换。 +* 作用: 方便区分坐标和向量,方便进行仿射变换。 * 摘要: 在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,我们人可以根据上下文信息区分这是点还是向量,而计算机则无法区分,为此我们增加了一个标志位来让计算机也可以区分它们,增加时候看起来是这样:
**点(x : y : 1) - 向量(x : y : 0)**
-你可能注意到了,我将分隔符换成了冒号,这是因为齐次坐标具有等比的性质,(2:3:1)、(4:6:2)...(2N,3N,N)表示的均是(2,3)这一个点。(这也是为什么会产生将MPERSP_2解释为scale这一误解了) +你可能注意到了,我将分隔符换成了冒号,这是因为齐次坐标具有等比的性质,(2:3:1)、(4:6:2)...(2N,3N,N)表示的均是(2,3)这一个点。(**这也是为什么会产生将MPERSP_2解释为scale这一误解了**) + +### 2.仿射变换 + +* 作用: 仿射变换其实是线性变换和平移变换的叠加,其实我们之前了解过的缩放,错切,旋转本质上都属于线性变换。对于我们android开发者而言,仿射变换对应的就是常见的四种画布操作(平移,旋转,缩放,错切)。 + +### 3.线性变换 + +#### a.缩放 -### ### 四大常用操作 From 687c7ce09d4abbbf90760363c81d2a2171308364 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 24 Jul 2016 02:57:06 +0800 Subject: [PATCH 208/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 8989ea75..f6427cb5 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -107,10 +107,12 @@ Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识, ### 2.仿射变换 -* 作用: 仿射变换其实是线性变换和平移变换的叠加,其实我们之前了解过的缩放,错切,旋转本质上都属于线性变换。对于我们android开发者而言,仿射变换对应的就是常见的四种画布操作(平移,旋转,缩放,错切)。 +* 作用: **仿射变换其实是线性变换和平移变换的叠加。**,我们之前了解过的缩放,错切,旋转本质上都属于线性变换。对于我们而言,仿射变换对应的就是常见的四种画布操作(平移,旋转,缩放,错切)。 +* 摘要: 我们之前说过,Matrix主要作用就是坐标的映射,仿射变换主要就是做这个工作的,详情请继续往下看。 ### 3.线性变换 + #### a.缩放 From 1a79990ba5e36974175cc95832a3c34149ecbdc5 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 24 Jul 2016 03:06:46 +0800 Subject: [PATCH 209/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index f6427cb5..9047ab88 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -107,14 +107,20 @@ Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识, ### 2.仿射变换 -* 作用: **仿射变换其实是线性变换和平移变换的叠加。**,我们之前了解过的缩放,错切,旋转本质上都属于线性变换。对于我们而言,仿射变换对应的就是常见的四种画布操作(平移,旋转,缩放,错切)。 +* 作用: **仿射变换其实是线性变换和平移变换的叠加。**,我们之前了解过的 缩放、旋转、错切 本质上都属于线性变换。对于我们而言,仿射变换对应的就是常见的四种画布操作(缩放、旋转、错切、平移)。 * 摘要: 我们之前说过,Matrix主要作用就是坐标的映射,仿射变换主要就是做这个工作的,详情请继续往下看。 ### 3.线性变换 +线性变换主要有3种: 缩放(scale)、旋转(rotate) 和 错切(skew)。 + +下面我们就以坐标映射的角度来讲讲这几种操作。 #### a.缩放 +以点(10,10)为例,我们将x缩放到原来到0.5倍,y缩放到原来到2倍,我们可以轻易到算出结果:(10x0.5, 10x2) = (5, 20) + + ### 四大常用操作 From 49d4f26620d294ee9de5ee81c9d4977afa959e0d Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 24 Jul 2016 03:17:36 +0800 Subject: [PATCH 210/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 56 ++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 9047ab88..864f1909 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -114,12 +114,66 @@ Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识, 线性变换主要有3种: 缩放(scale)、旋转(rotate) 和 错切(skew)。 -下面我们就以坐标映射的角度来讲讲这几种操作。 +线性变换均可用矩阵乘法完成(不了解矩阵乘法规则的参考下面维基百科),下面我们就来讲讲这几种操作。 + +**[维基百科-矩阵乘法](https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%99%A3%E4%B9%98%E6%B3%95)** #### a.缩放 以点(10,10)为例,我们将x缩放到原来到0.5倍,y缩放到原来到2倍,我们可以轻易到算出结果:(10x0.5, 10x2) = (5, 20) +矩阵计算公式: + +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} +X\\\\ +Y +\\end{1} +\\right ] + = +\\left [ +\\begin{matrix} +Scale\\_X & 0 \\\\ +0 & Scale\\_Y +\\end{1} +\\right ] + . +\\left [ +\\begin{matrix} +x\\\\ +y +\\end{1} +\\right ] +$$) + + +用计算示例: + +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} +5 \\\\ +20 +\\end{1} +\\right ] + = +\\left [ +\\begin{matrix} +0.5 & 0 \\\\ +0 & 2 +\\end{1} +\\right ] + . +\\left [ +\\begin{matrix} +10\\\\ +10 +\\end{1} +\\right ] +$$) ### 四大常用操作 From f3a7930302ae314a44c8b6ea5618566d890ecf71 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 24 Jul 2016 15:58:35 +0800 Subject: [PATCH 211/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 864f1909..9da46279 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -175,6 +175,10 @@ $$ \\right ] $$) +#### b.错切 + + + ### 四大常用操作 From 7bdc9f3486e88baac1450c15d0f267b081d8be8d Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 24 Jul 2016 22:25:44 +0800 Subject: [PATCH 212/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 9da46279..13d6c242 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -107,7 +107,7 @@ Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识, ### 2.仿射变换 -* 作用: **仿射变换其实是线性变换和平移变换的叠加。**,我们之前了解过的 缩放、旋转、错切 本质上都属于线性变换。对于我们而言,仿射变换对应的就是常见的四种画布操作(缩放、旋转、错切、平移)。 +* 作用: **仿射变换其实是线性变换和平移变换的叠加。**我们之前了解过的 缩放、旋转、错切 本质上都属于线性变换。对于我们而言,仿射变换对应的就是常见的四种画布操作(缩放、旋转、错切、平移)。 * 摘要: 我们之前说过,Matrix主要作用就是坐标的映射,仿射变换主要就是做这个工作的,详情请继续往下看。 ### 3.线性变换 @@ -180,6 +180,7 @@ $$) + ### 四大常用操作 我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的四种画布操作(translate, scale, rotate, skew),这些操作的核心就是改变Matrix的数值,接下来我们看看这四种操作都会影响到哪些数值。 From 8e349569ab197d18d7f34f6e98613e3db4ef6ff3 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 24 Jul 2016 23:14:42 +0800 Subject: [PATCH 213/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 13d6c242..e68cca82 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -101,7 +101,7 @@ Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识, ### 1.齐次坐标系 * 作用: 方便区分坐标和向量,方便进行仿射变换。 -* 摘要: 在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,我们人可以根据上下文信息区分这是点还是向量,而计算机则无法区分,为此我们增加了一个标志位来让计算机也可以区分它们,增加时候看起来是这样:
+* 摘要: 在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,我们人可以根据上下文信息区分这是点还是向量,而计算机则无法区分,为此我们增加了一个标志位来让计算机也可以区分它们,增加之后看起来是这样:
**点(x : y : 1) - 向量(x : y : 0)**
你可能注意到了,我将分隔符换成了冒号,这是因为齐次坐标具有等比的性质,(2:3:1)、(4:6:2)...(2N,3N,N)表示的均是(2,3)这一个点。(**这也是为什么会产生将MPERSP_2解释为scale这一误解了**) From 4536a71fd74f29d9974fc24935daee9223d20a3b Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 25 Jul 2016 05:39:42 +0800 Subject: [PATCH 214/615] Update --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index d4df808c..be955ac3 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,13 @@ > #### PS:点击分类标题可以查看该分类的详细信息。 +## 目录 + +- [自定义View系列](#自定义View系列) +- [教程类](#教程类) +- [速查表](#速查表) +- [混沌水晶](#混沌水晶) + ## [自定义View系列](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 序号 | 内容 From 25cedef3586f0f74d43f7bb6d735af592b61ac8c Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 25 Jul 2016 05:41:08 +0800 Subject: [PATCH 215/615] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index be955ac3..ada82d68 100644 --- a/README.md +++ b/README.md @@ -69,5 +69,4 @@ - - +[▲ 回到顶部](#目录) From b5eada82f3d32906c8250983d4780ad358b22243 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 25 Jul 2016 05:42:44 +0800 Subject: [PATCH 216/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ada82d68..49ece0f4 100644 --- a/README.md +++ b/README.md @@ -69,4 +69,4 @@ -[▲ 回到顶部](#目录) +[▲ 回到顶部](#top) From d37971d88f5590b300c4e9905cc04e48704b996d Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 25 Jul 2016 17:13:40 +0800 Subject: [PATCH 217/615] Update --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 49ece0f4..5d318b28 100644 --- a/README.md +++ b/README.md @@ -62,11 +62,26 @@ * [ADB常用命令](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/ADB%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4.md) +## 版权声明 + +* 所有原创文章(未进行特殊标识的均属于原创) 的著作权属于 **GcsSloop**。 +* 所有转载文章(标题注明`[转]`的所有文章) 的著作权属于原作者。 +* 所有译文文章(标题注明`[译]`的所有文章) 的原文著作权属于原作者,译文著作权属于 **GcsSloop**。 + +#### 转载注意事项 + +除注明外,所有文章均采用 [Creative Commons BY-NC-ND 4.0(自由转载-保持署名-非商用-禁止演绎)](http://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh)协议发布。 + +你可以在非商业的前提下免费转载,但同时你必须: + +* 保持文章原文,不作修改。 +* 明确署名,即至少注明 `作者:GcsSloop` 字样以及文章的原始链接,且不得使用 `rel="nofollow"` 标记。 + + ## About Me ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) - [▲ 回到顶部](#top) From 4801c4d59b8b87d74c1b8c3bb4616fa02febcadb Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 25 Jul 2016 17:14:57 +0800 Subject: [PATCH 218/615] Update --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5d318b28..203d8474 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,13 @@ ## 目录 -- [自定义View系列](#自定义View系列) +- [CustomView](#CustomView) - [教程类](#教程类) - [速查表](#速查表) - [混沌水晶](#混沌水晶) +- [版权声明](#版权声明) -## [自定义View系列](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) +## [CustomView](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) 序号 | 内容 :----:|--------- From 548225d24c8cf9fdb39cbd314fe4cbc46013aa60 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 03:13:12 +0800 Subject: [PATCH 219/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 203d8474..8baca8af 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ 08 | [安卓自定义View进阶 - Path基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) 09 | [安卓自定义View进阶 - 贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) 10 | [安卓自定义View进阶 - Path完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) - 11 | [安卓自定义View进阶 - Path玩出花样](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B8%5DPath_Play.md) + 11 | [安卓自定义View进阶 - Path玩出花样(PathMeasure)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B8%5DPath_Play.md) ****** From 78fc46851df8e314c9edceefcfd1c1913aa51b6a Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 03:17:33 +0800 Subject: [PATCH 220/615] Update --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 8baca8af..fc23be1d 100644 --- a/README.md +++ b/README.md @@ -8,27 +8,27 @@ ## 目录 -- [CustomView](#CustomView) +- [自定义View](#自定义View) - [教程类](#教程类) - [速查表](#速查表) - [混沌水晶](#混沌水晶) - [版权声明](#版权声明) -## [CustomView](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) +## [自定义View](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) - 序号 | 内容 -:----:|--------- - 01 | [安卓自定义View基础 - 坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md) - 02 | [安卓自定义View基础 - 角度弧度](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B2%5DAngleAndRadian.md) - 03 | [安卓自定义View基础 - 颜色](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B3%5DColor.md) - 04 | [安卓自定义View进阶 - 分类和流程](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B1%5DCustomViewProcess.md) - 05 | [安卓自定义View进阶 - 绘制基本图形](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md) - 06 | [安卓自定义View进阶 - 画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) - 07 | [安卓自定义View进阶 - 图片文字](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) - 08 | [安卓自定义View进阶 - Path基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) - 09 | [安卓自定义View进阶 - 贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) - 10 | [安卓自定义View进阶 - Path完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) - 11 | [安卓自定义View进阶 - Path玩出花样(PathMeasure)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B8%5DPath_Play.md) +* 基础篇 + * [安卓自定义View基础 - 坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md) + * [安卓自定义View基础 - 角度弧度](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B2%5DAngleAndRadian.md) + * [安卓自定义View基础 - 颜色](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B3%5DColor.md) +* 进阶篇 + * [安卓自定义View进阶 - 分类和流程](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B1%5DCustomViewProcess.md) + * [安卓自定义View进阶 - 绘制基本图形](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md) + * [安卓自定义View进阶 - 画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) + * [安卓自定义View进阶 - 图片文字](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) + * [安卓自定义View进阶 - Path基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) + * [安卓自定义View进阶 - 贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) + * [安卓自定义View进阶 - Path完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) + * [安卓自定义View进阶 - Path玩出花样(PathMeasure)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B8%5DPath_Play.md) ****** From 20baed58980333fc40a7a9bdefe75c53f1d3a14f Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 03:48:41 +0800 Subject: [PATCH 221/615] Update --- CustomView/Advance/[3]Canvas_Convert.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/CustomView/Advance/[3]Canvas_Convert.md b/CustomView/Advance/[3]Canvas_Convert.md index 214ca7b6..5a8ca1c2 100644 --- a/CustomView/Advance/[3]Canvas_Convert.md +++ b/CustomView/Advance/[3]Canvas_Convert.md @@ -19,7 +19,7 @@ 顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 画布剪裁 | clipPath, clipRect | 设置画布的显示区域 画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数 -画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、倾斜 +画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 Matrix(矩阵) | getMatrix, setMatrix, concat | 实际上画布的位移,缩放等操作的都是图像矩阵Matrix, 只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 ****** @@ -265,17 +265,15 @@ Matrix(矩阵) | getMatrix, setMatrix, concat | 实际上画布的位移,缩 ***** -#### ⑷倾斜(skew) +#### ⑷错切(skew) -skew这里翻译为倾斜,有的地方也叫错切。 +skew这里翻译为错切,错切是特殊线性变换的一种。 -倾斜只提供了一种方法: +错切只提供了一种方法: ``` java public void skew (float sx, float sy) ``` -参数含义:
-float sx:将画布在x方向上倾斜相应的角度,sx倾斜角度的tan值,
-float sy:将画布在y轴方向上倾斜相应的角度,sy为倾斜角度的tan值.
+ 示例: ``` java @@ -287,14 +285,14 @@ float sy:将画布在y轴方向上倾斜相应的角度,sy为倾斜角度的ta mPaint.setColor(Color.BLACK); // 绘制黑色矩形 canvas.drawRect(rect,mPaint); - canvas.skew(1,0); // 在x轴倾斜45度 <-- tan45 = 1 + canvas.skew(1,0); // 错切 mPaint.setColor(Color.BLUE); // 绘制蓝色矩形 canvas.drawRect(rect,mPaint); ``` -如你所想,倾斜也是可叠加的,不过请注意,调用次序不同绘制结果也会不同 +如你所想,错切也是可叠加的,不过请注意,调用次序不同绘制结果也会不同 ``` java // 将坐标系原点移动到画布正中心 canvas.translate(mWidth / 2, mHeight / 2); @@ -304,8 +302,8 @@ float sy:将画布在y轴方向上倾斜相应的角度,sy为倾斜角度的ta mPaint.setColor(Color.BLACK); // 绘制黑色矩形 canvas.drawRect(rect,mPaint); - canvas.skew(1,0); // 在x轴倾斜45度 <-- tan45 = 1 - canvas.skew(0,1); // 在y轴倾斜45度 <-- tan45 = 1 + canvas.skew(1,0); // 错切 + canvas.skew(0,1); // 错切 mPaint.setColor(Color.BLUE); // 绘制蓝色矩形 canvas.drawRect(rect,mPaint); From 8da53fc85c3c9e829f4f779b187072449166b3ef Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 03:56:26 +0800 Subject: [PATCH 222/615] Update --- CustomView/Advance/[3]Canvas_Convert.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[3]Canvas_Convert.md b/CustomView/Advance/[3]Canvas_Convert.md index 5a8ca1c2..b3a326c8 100644 --- a/CustomView/Advance/[3]Canvas_Convert.md +++ b/CustomView/Advance/[3]Canvas_Convert.md @@ -267,13 +267,18 @@ Matrix(矩阵) | getMatrix, setMatrix, concat | 实际上画布的位移,缩 ***** #### ⑷错切(skew) -skew这里翻译为错切,错切是特殊线性变换的一种。 +skew这里翻译为错切,错切是特殊类型的线性变换。 错切只提供了一种方法: ``` java public void skew (float sx, float sy) ``` +变换后: +``` +X = x + sx * y +Y = sy * x + y +``` 示例: ``` java From 5d0cb7a99bb85b5c2ba3e0161975fa6483618d08 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 04:01:42 +0800 Subject: [PATCH 223/615] Update --- CustomView/Advance/[3]Canvas_Convert.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[3]Canvas_Convert.md b/CustomView/Advance/[3]Canvas_Convert.md index b3a326c8..fddd7c62 100644 --- a/CustomView/Advance/[3]Canvas_Convert.md +++ b/CustomView/Advance/[3]Canvas_Convert.md @@ -295,7 +295,7 @@ Y = sy * x + y mPaint.setColor(Color.BLUE); // 绘制蓝色矩形 canvas.drawRect(rect,mPaint); ``` - + 如你所想,错切也是可叠加的,不过请注意,调用次序不同绘制结果也会不同 ``` java From af18b6a8511f5f9a5dcc0c26698bfe1a0f7c5d57 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 04:03:36 +0800 Subject: [PATCH 224/615] Update --- CustomView/Advance/[2]Canvas_BasicGraphics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[2]Canvas_BasicGraphics.md b/CustomView/Advance/[2]Canvas_BasicGraphics.md index 52fe87fd..773c4497 100644 --- a/CustomView/Advance/[2]Canvas_BasicGraphics.md +++ b/CustomView/Advance/[2]Canvas_BasicGraphics.md @@ -29,7 +29,7 @@ Canvas我们可以称之为画布,能够在上面绘制各种东西,是安 顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 画布剪裁 | clipPath, clipRect | 设置画布的显示区域 画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数 -画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、倾斜 +画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放等操作的都是图像矩阵Matrix,只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 > PS: Canvas常用方法在上面表格中已经全部列出了,当然还存在一些其他的方法未列出,具体可以参考官方文档 [Canvas](http://developer.android.com/reference/android/graphics/Canvas.html) From 00364a40ce8a500873a333a959052eac57c98d3c Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 04:03:57 +0800 Subject: [PATCH 225/615] Update --- CustomView/Advance/[4]Canvas_PictureText.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[4]Canvas_PictureText.md b/CustomView/Advance/[4]Canvas_PictureText.md index c87e1bba..94fecc07 100644 --- a/CustomView/Advance/[4]Canvas_PictureText.md +++ b/CustomView/Advance/[4]Canvas_PictureText.md @@ -17,7 +17,7 @@ 顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 画布剪裁 | clipPath, clipRect | 设置画布的显示区域 画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数 -画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、倾斜 +画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 Matrix(矩阵) | getMatrix, setMatrix, concat | 实际上画布的位移,缩放等操作的都是图像矩阵Matrix, 只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 ****** From 2f33ba171c394cffadff5dd5b9a1bb116167ab69 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 04:04:44 +0800 Subject: [PATCH 226/615] Update --- QuickChart/Canvas.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QuickChart/Canvas.md b/QuickChart/Canvas.md index 709e5b96..066f0967 100644 --- a/QuickChart/Canvas.md +++ b/QuickChart/Canvas.md @@ -10,5 +10,5 @@ 顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 画布剪裁 | clipPath, clipRect | 设置画布的显示区域 画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 会滚到指定状态、 获取保存次数
**相关链接:**
[【Canvas-画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) -画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、倾斜
**相关链接:**
[【基础-坐标系】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md)
[【基础-角度弧度】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B2%5DAngleAndRadian.md)
[【Canvas-画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) +画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切
**相关链接:**
[【基础-坐标系】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md)
[【基础-角度弧度】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B2%5DAngleAndRadian.md)
[【Canvas-画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放等操作的都是图像矩阵Matrix,只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 From ae650f8c74bd30d8eb32a38551ec272880d742f1 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 04:07:53 +0800 Subject: [PATCH 227/615] Update --- README.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index fc23be1d..903d3ff8 100644 --- a/README.md +++ b/README.md @@ -35,20 +35,16 @@ ## [教程类](https://github.com/GcsSloop/AndroidNote/tree/master/Course/README.md) -序号 | 内容 -:---:|-------- - 01 | [在AndroidStudio中使用PlantUML](https://github.com/GcsSloop/AndroidNote/blob/master/Course/HowToUsePlantUMLInAS.md) - 02 | [优雅的发布Android开源库(论JitPack的优越性)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/ReleaseLibraryByJitPack.md) +* [在AndroidStudio中使用PlantUML](https://github.com/GcsSloop/AndroidNote/blob/master/Course/HowToUsePlantUMLInAS.md) +* [优雅的发布Android开源库(论JitPack的优越性)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/ReleaseLibraryByJitPack.md) ****** ## [速查表](https://github.com/GcsSloop/AndroidNote/tree/master/QuickChart/README.md) -序号 | 内容 -:---:|--------------- - 01 | [Canvas常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Canvas.md) - 02 | [Path常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Path.md) - 03 | [贝塞尔曲线常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Bezier.md) +* [Canvas常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Canvas.md) +* [Path常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Path.md) +* [贝塞尔曲线常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Bezier.md) ****** From b80b8efae0d61fb9c2ae520e953b70ebc7efa137 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 04:20:03 +0800 Subject: [PATCH 228/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 36 +++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index e68cca82..2512ba8d 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -122,7 +122,7 @@ Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识, 以点(10,10)为例,我们将x缩放到原来到0.5倍,y缩放到原来到2倍,我们可以轻易到算出结果:(10x0.5, 10x2) = (5, 20) -矩阵计算公式: +计算公式: ![](http://latex.codecogs.com/png.latex? $$ @@ -149,7 +149,7 @@ y $$) -用计算示例: +计算示例: ![](http://latex.codecogs.com/png.latex? $$ @@ -177,6 +177,38 @@ $$) #### b.错切 +计算公式: + +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} +X\\\\ +Y +\\end{1} +\\right ] + = +\\left [ +\\begin{matrix} +1 & Skew\\_X \\\\ +Skew\\_Y & 1 +\\end{1} +\\right ] + . +\\left [ +\\begin{matrix} +x\\\\ +y +\\end{1} +\\right ] +$$) + +``` +X = x + Skew_X * y +Y = Skew_Y * x + y +``` + +计算示例: From 8a62dd35f2da130925e14f534c6a105b18750c68 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 04:36:27 +0800 Subject: [PATCH 229/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 2512ba8d..36a2ae9e 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -177,6 +177,8 @@ $$) #### b.错切 +错切有水平错切(平行X轴)和垂直错切(平行Y轴),或者是两者叠加。 + 计算公式: ![](http://latex.codecogs.com/png.latex? @@ -210,6 +212,29 @@ Y = Skew_Y * x + y 计算示例: +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} +20\\\\ +5 +\\end{1} +\\right ] + = +\\left [ +\\begin{matrix} +1 & 2 \\\\ +0 & 1 +\\end{1} +\\right ] + . +\\left [ +\\begin{matrix} +10\\\\ +5 +\\end{1} +\\right ] +$$) From d784f0d6b76458c4a472b4eafbc0b995eb3f135a Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 04:37:19 +0800 Subject: [PATCH 230/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 36a2ae9e..bbfb276d 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -237,6 +237,10 @@ $$ $$) +#### b.旋转 + + + ### 四大常用操作 From ec488ac8677dd60c5884d1654661276d02a2b86d Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 05:13:51 +0800 Subject: [PATCH 231/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 48 ++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index bbfb276d..24b754dd 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -122,7 +122,7 @@ Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识, 以点(10,10)为例,我们将x缩放到原来到0.5倍,y缩放到原来到2倍,我们可以轻易到算出结果:(10x0.5, 10x2) = (5, 20) -计算公式: +**计算公式:** ![](http://latex.codecogs.com/png.latex? $$ @@ -149,7 +149,7 @@ y $$) -计算示例: +**计算示例:** ![](http://latex.codecogs.com/png.latex? $$ @@ -179,7 +179,7 @@ $$) 错切有水平错切(平行X轴)和垂直错切(平行Y轴),或者是两者叠加。 -计算公式: +**计算公式:** ![](http://latex.codecogs.com/png.latex? $$ @@ -210,14 +210,14 @@ X = x + Skew_X * y Y = Skew_Y * x + y ``` -计算示例: +**计算示例:** ![](http://latex.codecogs.com/png.latex? $$ \\left [ \\begin{matrix} -20\\\\ -5 +25\\\\ +10 \\end{1} \\right ] = @@ -230,8 +230,8 @@ $$ . \\left [ \\begin{matrix} -10\\\\ -5 +5\\\\ +10 \\end{1} \\right ] $$) @@ -239,6 +239,38 @@ $$) #### b.旋转 +**计算公式:** + +逆时针旋转 a 度。 + +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} +X\\\\ +Y +\\end{1} +\\right ] + = +\\left [ +\\begin{matrix} +cos(a) & -sin(a) \\\\ +sin(a) & cos(a) +\\end{1} +\\right ] + . +\\left [ +\\begin{matrix} +x\\\\ +y +\\end{1} +\\right ] +$$) + + + + +**计算示例:** From 252f4635ec9e927888cb3242264038f6e3c6c351 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 05:16:35 +0800 Subject: [PATCH 232/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 57 +-------------------------- 1 file changed, 1 insertion(+), 56 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 24b754dd..83ed1e71 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -149,32 +149,6 @@ y $$) -**计算示例:** - -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} -5 \\\\ -20 -\\end{1} -\\right ] - = -\\left [ -\\begin{matrix} -0.5 & 0 \\\\ -0 & 2 -\\end{1} -\\right ] - . -\\left [ -\\begin{matrix} -10\\\\ -10 -\\end{1} -\\right ] -$$) - #### b.错切 错切有水平错切(平行X轴)和垂直错切(平行Y轴),或者是两者叠加。 @@ -210,33 +184,6 @@ X = x + Skew_X * y Y = Skew_Y * x + y ``` -**计算示例:** - -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} -25\\\\ -10 -\\end{1} -\\right ] - = -\\left [ -\\begin{matrix} -1 & 2 \\\\ -0 & 1 -\\end{1} -\\right ] - . -\\left [ -\\begin{matrix} -5\\\\ -10 -\\end{1} -\\right ] -$$) - - #### b.旋转 **计算公式:** @@ -268,9 +215,7 @@ y $$) - - -**计算示例:** +### 4.平移变换 From 90fa79a6035c3db1b19f2b74257c61009452a145 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 05:17:46 +0800 Subject: [PATCH 233/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 83ed1e71..c61c7f1d 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -122,8 +122,6 @@ Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识, 以点(10,10)为例,我们将x缩放到原来到0.5倍,y缩放到原来到2倍,我们可以轻易到算出结果:(10x0.5, 10x2) = (5, 20) -**计算公式:** - ![](http://latex.codecogs.com/png.latex? $$ \\left [ @@ -153,8 +151,6 @@ $$) 错切有水平错切(平行X轴)和垂直错切(平行Y轴),或者是两者叠加。 -**计算公式:** - ![](http://latex.codecogs.com/png.latex? $$ \\left [ @@ -186,8 +182,6 @@ Y = Skew_Y * x + y #### b.旋转 -**计算公式:** - 逆时针旋转 a 度。 ![](http://latex.codecogs.com/png.latex? @@ -219,12 +213,6 @@ $$) -### 四大常用操作 - -我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的四种画布操作(translate, scale, rotate, skew),这些操作的核心就是改变Matrix的数值,接下来我们看看这四种操作都会影响到哪些数值。 - - - From b37a628af9940ab15646dde74c382d9dd4e9bccf Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 05:39:21 +0800 Subject: [PATCH 234/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index c61c7f1d..c1bc8072 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -211,6 +211,9 @@ $$) ### 4.平移变换 +我们可以看到,在之前的示例中,用的都是 2 x 2 的矩阵,但我们实际的矩阵是 3 x 3 的,这是为什么呢? + +前面的各种方法我们都是直接 From 2b7308a0ebb426afdfeb9104344658ff21972c50 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 05:47:07 +0800 Subject: [PATCH 235/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index c1bc8072..202936f4 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -5,8 +5,9 @@ 前面讲了四篇 Path 相关的内容,经过长时间的拖更,终于要到了大家期盼已久的 Matrix, 一个与黑客帝国同名的东东,看名字就知道很不凡,接下来我们就看看这个 Matrix 到底是何方神圣。 +
![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) - +
****** From be4016f74658886db551ba8ad20320456cbcd7f2 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:02:36 +0800 Subject: [PATCH 236/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 72 ++++----------------------- 1 file changed, 9 insertions(+), 63 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 202936f4..5b38568d 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -5,15 +5,15 @@ 前面讲了四篇 Path 相关的内容,经过长时间的拖更,终于要到了大家期盼已久的 Matrix, 一个与黑客帝国同名的东东,看名字就知道很不凡,接下来我们就看看这个 Matrix 到底是何方神圣。 -
![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) -
****** ## 一、Matrix简介 -如题,本篇的主角是 Matrix,其实和黑客帝国并没有太大关系,它看起来大概是下面这样: +**如题,本篇的主角是 Matrix,其实和黑客帝国并没有太大关系, Matrix是一个矩阵,也一个控制视图状态的模型,主要功能是坐标映射,数值转换。** + +它看起来大概是下面这样: ![](http://latex.codecogs.com/png.latex? $$ @@ -28,7 +28,7 @@ MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 \\right ] $$) -### Matrix概念: Matrix的翻译过来是矩阵,模型。和其释义相同,Matrix是一个矩阵,也一个控制视图状态的模型,主要功能是坐标映射,数值转换。 +**为了帮助大家理解Matrix的作用,在这里简单的举一个例子:** 我的的手机屏幕作为物理设备,其坐标系是从左上角开始的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系。 @@ -42,37 +42,7 @@ $$) 以上是仅以2D空间作为例子,然而我们在实际的软件开发过程中,为了有较好的空间层次感,可能都要求有一些3D效果,将3D效果的3维影像投影到2维的屏幕,也是依靠Matrix的转换。 -## 二、Matrix基本原理 - -Matrix 本质是一个 3x3 的矩阵,里面有9个数值,分别用于控制视图的不同属性,大致如下: - -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} -MSCALE\\_X & MSKEW\\_X & MTRANS\\_X \\\\ -\\\\ -MSKEW\\_Y & MSCALE\\_Y & MTRANS\\_Y \\\\ -\\\\ -MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 -\\end{1} -\\right ] -$$) - - -序号 | 名称 | 对应单词 | 摘要 ------|----------|-------------|-------------- - 0 | MSCALE_X | scale | 控制X坐标 缩放,旋转 - 1 | MSKEW_X | skew | 控制X坐标 错切,旋转 - 2 | MTRANS_X | transfer | 控制X坐标 位移 - 3 | MSKEW_Y | skew | 控制Y坐标 错切,旋转 - 4 | MSCALE_Y | scale | 控制Y坐标 缩放,旋转 - 5 | MTRANS_Y | transfer | 控制Y坐标 位移 - 6 | MPERSP_0 | perspective | 控制透视 (绕Y轴旋转) - 7 | MPERSP_1 | perspective | 控制透视 (绕X轴旋转) - 8 | MPERSP_2 | perspective | 控制透视 (齐次坐标标志位,通常为1) - -从上表中可以看出一些内容,下面我们看一下2D画布中常用的四种操作(translate, scale, rotate, skew)都是由哪些参数控制的。 +下面我们看一下2D画布中常用的四种操作(translate, scale, rotate, skew)都是由哪些参数控制的。 ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f60gwrhlnyj30c008zdgy.jpg) ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f633hvklfnj30c008zdge.jpg) @@ -95,28 +65,11 @@ $$) ## 三、Matrix详解 -Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识,我会尽量用通俗易懂的方式来帮助大家理解它。 - -我们先简单的理解几个概念和其作用。 - -### 1.齐次坐标系 - -* 作用: 方便区分坐标和向量,方便进行仿射变换。 -* 摘要: 在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,我们人可以根据上下文信息区分这是点还是向量,而计算机则无法区分,为此我们增加了一个标志位来让计算机也可以区分它们,增加之后看起来是这样:
-**点(x : y : 1) - 向量(x : y : 0)**
-你可能注意到了,我将分隔符换成了冒号,这是因为齐次坐标具有等比的性质,(2:3:1)、(4:6:2)...(2N,3N,N)表示的均是(2,3)这一个点。(**这也是为什么会产生将MPERSP_2解释为scale这一误解了**) +Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就看看几种常见的变换原理: -### 2.仿射变换 - -* 作用: **仿射变换其实是线性变换和平移变换的叠加。**我们之前了解过的 缩放、旋转、错切 本质上都属于线性变换。对于我们而言,仿射变换对应的就是常见的四种画布操作(缩放、旋转、错切、平移)。 -* 摘要: 我们之前说过,Matrix主要作用就是坐标的映射,仿射变换主要就是做这个工作的,详情请继续往下看。 - -### 3.线性变换 - -线性变换主要有3种: 缩放(scale)、旋转(rotate) 和 错切(skew)。 - -线性变换均可用矩阵乘法完成(不了解矩阵乘法规则的参考下面维基百科),下面我们就来讲讲这几种操作。 +常见的基本变换有4种: 平移(translate)、缩放(scale)、旋转(rotate) 和 错切(skew)。 +由于我们以下大部分的计算都是基于矩阵乘法规则,如果你已经把线性代数还给了老师,请参考一下这里: **[维基百科-矩阵乘法](https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%99%A3%E4%B9%98%E6%B3%95)** #### a.缩放 @@ -176,11 +129,6 @@ y \\right ] $$) -``` -X = x + Skew_X * y -Y = Skew_Y * x + y -``` - #### b.旋转 逆时针旋转 a 度。 @@ -228,9 +176,7 @@ $$) -## Matrix方法表 - -Matrix 有很多常用和不常用的方法, +**Matrix方法表** 方法类别 | 相关API | 摘要 -----------|---------------------------------------------------------|------------------------ From 66743a53904f2f8da791e1744d72390d071a571a Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:04:45 +0800 Subject: [PATCH 237/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 5b38568d..58c6878e 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -28,20 +28,6 @@ MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 \\right ] $$) -**为了帮助大家理解Matrix的作用,在这里简单的举一个例子:** - -我的的手机屏幕作为物理设备,其坐标系是从左上角开始的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系。 - -以下图为例,我们的内容区和屏幕坐标系还相差一个通知栏加一个标题栏的距离,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的屏幕坐标系来绘制,Matrix在此处的作用就是转换这些数值。 - -> -假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点。 - - -![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f624vi3eb6j30rs0goab5.jpg) - -以上是仅以2D空间作为例子,然而我们在实际的软件开发过程中,为了有较好的空间层次感,可能都要求有一些3D效果,将3D效果的3维影像投影到2维的屏幕,也是依靠Matrix的转换。 - 下面我们看一下2D画布中常用的四种操作(translate, scale, rotate, skew)都是由哪些参数控制的。 ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f60gwrhlnyj30c008zdgy.jpg) @@ -52,8 +38,6 @@ $$) ### 常见误解 -在写本文之前,我翻阅很多介绍 Matrix 的文章和官方文档,但其中文的搜索结果令我很悲伤,大部分的中文文章对Matrix都存在误解,想当然的创造出一些错误的理论, 导致很多(抄袭)的文章都是这一错误的理论,不知道要坑害多少小白,常见的错误理论有: - **1.认为Matrix最下面的一行的三个参数(MPERSP_0、MPERSP_1、MPERSP_2)没有什么太大的作用,在这里只是为了凑数。** > **实际上最后一行参数在3D变换中有着至关重要的作用,这一点会在后面中Camera一文中详细介绍。** From e894945d7dfd78608b769a239f2d0596c08b8f7d Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:05:18 +0800 Subject: [PATCH 238/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 58c6878e..399f8dbd 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -11,7 +11,7 @@ ## 一、Matrix简介 -**如题,本篇的主角是 Matrix,其实和黑客帝国并没有太大关系, Matrix是一个矩阵,也一个控制视图状态的模型,主要功能是坐标映射,数值转换。** +**本篇的主角是 Matrix,其实和黑客帝国并没有太大关系, Matrix是一个矩阵,主要功能是坐标映射,数值转换。** 它看起来大概是下面这样: From 4cb987d033d4801b76a70c7785d65e050eedb3ff Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:08:13 +0800 Subject: [PATCH 239/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 399f8dbd..78f43c6e 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -3,15 +3,13 @@ ## 前言 -前面讲了四篇 Path 相关的内容,经过长时间的拖更,终于要到了大家期盼已久的 Matrix, 一个与黑客帝国同名的东东,看名字就知道很不凡,接下来我们就看看这个 Matrix 到底是何方神圣。 - -![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg) +经过长时间的拖更,终于要到了大家期盼已久的 Matrix。 ****** ## 一、Matrix简介 -**本篇的主角是 Matrix,其实和黑客帝国并没有太大关系, Matrix是一个矩阵,主要功能是坐标映射,数值转换。** +**Matrix是一个矩阵,主要功能是坐标映射,数值转换。** 它看起来大概是下面这样: From 6dc24694fdd477e488eb98f3c03caacf1b0dc93e Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:08:56 +0800 Subject: [PATCH 240/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 78f43c6e..757a895b 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -1,13 +1,13 @@ # Matrix基础篇 -## 前言 +## 目录 -经过长时间的拖更,终于要到了大家期盼已久的 Matrix。 +- [Matrix简介](#Matrix简介) ****** -## 一、Matrix简介 +## Matrix简介 **Matrix是一个矩阵,主要功能是坐标映射,数值转换。** From 6a5251b0e32866270aa459ad0a31b64c62f4bda2 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:10:26 +0800 Subject: [PATCH 241/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 757a895b..99c9d580 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -4,6 +4,8 @@ ## 目录 - [Matrix简介](#Matrix简介) + - [常见误解](#常见误解) +- [Matrix详解](#Matrix详解) ****** @@ -45,7 +47,7 @@ $$) > **的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。** -## 三、Matrix详解 +## Matrix详解 Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就看看几种常见的变换原理: From 733e73ffdb285ecc0c4ce2e5c4a4c0bd2e360659 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:13:17 +0800 Subject: [PATCH 242/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 99c9d580..5cee5a91 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -3,12 +3,13 @@ ## 目录 -- [Matrix简介](#Matrix简介) +- [Matrix简介](#jianjie) - [常见误解](#常见误解) - [Matrix详解](#Matrix详解) ****** +

## Matrix简介 **Matrix是一个矩阵,主要功能是坐标映射,数值转换。** From 996f597b167709ce10abee3d8c6c38f1c6aafc2b Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:14:29 +0800 Subject: [PATCH 243/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 5cee5a91..6c4a0d1e 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -4,8 +4,8 @@ ## 目录 - [Matrix简介](#jianjie) - - [常见误解](#常见误解) -- [Matrix详解](#Matrix详解) + - [常见误解](#wujie) +- [Matrix详解](#xiangjie) ****** @@ -37,6 +37,7 @@ $$) > **从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇范围内,暂不过多叙述,会在之后对文章中详述其作用。** +

### 常见误解 **1.认为Matrix最下面的一行的三个参数(MPERSP_0、MPERSP_1、MPERSP_2)没有什么太大的作用,在这里只是为了凑数。** @@ -47,7 +48,9 @@ $$) > **的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。** +****** +

## Matrix详解 Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就看看几种常见的变换原理: From 9dc6a0bb52726327cee37f3fd91a660b5ad1962e Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:18:07 +0800 Subject: [PATCH 244/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 6c4a0d1e..290f2bfb 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -34,26 +34,25 @@ $$) ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f60gwrhlnyj30c008zdgy.jpg) ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f633hvklfnj30c008zdge.jpg) -> -**从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇范围内,暂不过多叙述,会在之后对文章中详述其作用。** +**从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇讨论范围内,暂不过多叙述,会在之后对文章中详述其作用。**

### 常见误解 **1.认为Matrix最下面的一行的三个参数(MPERSP_0、MPERSP_1、MPERSP_2)没有什么太大的作用,在这里只是为了凑数。** -> **实际上最后一行参数在3D变换中有着至关重要的作用,这一点会在后面中Camera一文中详细介绍。** +实际上最后一行参数在3D变换中有着至关重要的作用,这一点会在后面中Camera一文中详细介绍。 **2.最后一个参数MPERSP_2被解释为scale** -> **的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。** +的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。 ******

## Matrix详解 -Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就看看几种常见的变换原理: +Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就看看几种常见变换的原理: 常见的基本变换有4种: 平移(translate)、缩放(scale)、旋转(rotate) 和 错切(skew)。 From ee55346440ecff0548096cd49a83b3a195a2f340 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:33:48 +0800 Subject: [PATCH 245/615] Update --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 903d3ff8..37541cf0 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,13 @@ ## 目录 -- [自定义View](#自定义View) +- [自定义View](#custom_view) - [教程类](#教程类) - [速查表](#速查表) - [混沌水晶](#混沌水晶) - [版权声明](#版权声明) +

## [自定义View](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) * 基础篇 From 21537caa205cd602477f696e45f30789c3e30d2e Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:35:12 +0800 Subject: [PATCH 246/615] Update --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 37541cf0..cf76d7a7 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ * [录屏与GIF制作](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/%E5%BD%95%E5%B1%8F%E4%B8%8EGIF%E5%88%B6%E4%BD%9C.md) * [ADB常用命令](https://github.com/GcsSloop/AndroidNote/blob/master/ChaosCrystal/ADB%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4.md) +****** ## 版权声明 @@ -74,6 +75,7 @@ * 保持文章原文,不作修改。 * 明确署名,即至少注明 `作者:GcsSloop` 字样以及文章的原始链接,且不得使用 `rel="nofollow"` 标记。 +* 商业用途请点击最下面图片联系本人。 ## About Me From 73123bf85d85a97bb27a986372415c65736aac94 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:36:30 +0800 Subject: [PATCH 247/615] Update --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index cf76d7a7..c7899b8d 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ - [混沌水晶](#混沌水晶) - [版权声明](#版权声明) +****** +

## [自定义View](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) From caf4d115cb5d96f7156c3889fb65ca1d7d39b31f Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 06:39:13 +0800 Subject: [PATCH 248/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 290f2bfb..04cf94d0 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -4,6 +4,7 @@ ## 目录 - [Matrix简介](#jianjie) + - [概述](#gaishu) - [常见误解](#wujie) - [Matrix详解](#xiangjie) @@ -12,6 +13,9 @@

## Matrix简介 +

+### 概述 + **Matrix是一个矩阵,主要功能是坐标映射,数值转换。** 它看起来大概是下面这样: From 7c5ec86e4d28eb20d7edb2df0f744e7a970e88c8 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 07:19:36 +0800 Subject: [PATCH 249/615] Update --- CustomView/Advance/[3]Canvas_Convert.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[3]Canvas_Convert.md b/CustomView/Advance/[3]Canvas_Convert.md index fddd7c62..b3a326c8 100644 --- a/CustomView/Advance/[3]Canvas_Convert.md +++ b/CustomView/Advance/[3]Canvas_Convert.md @@ -295,7 +295,7 @@ Y = sy * x + y mPaint.setColor(Color.BLUE); // 绘制蓝色矩形 canvas.drawRect(rect,mPaint); ``` - + 如你所想,错切也是可叠加的,不过请注意,调用次序不同绘制结果也会不同 ``` java From 4b61c5f7ffc17cb30ac5141eeb16b12348483c3e Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 07:22:37 +0800 Subject: [PATCH 250/615] Update --- CustomView/Advance/[3]Canvas_Convert.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[3]Canvas_Convert.md b/CustomView/Advance/[3]Canvas_Convert.md index b3a326c8..0ec2282d 100644 --- a/CustomView/Advance/[3]Canvas_Convert.md +++ b/CustomView/Advance/[3]Canvas_Convert.md @@ -274,6 +274,10 @@ skew这里翻译为错切,错切是特殊类型的线性变换。 public void skew (float sx, float sy) ``` +参数含义:
+float sx:将画布在x方向上倾斜相应的角度,sx倾斜角度的tan值,
+float sy:将画布在y轴方向上倾斜相应的角度,sy为倾斜角度的tan值.
+ 变换后: ``` X = x + sx * y @@ -290,7 +294,7 @@ Y = sy * x + y mPaint.setColor(Color.BLACK); // 绘制黑色矩形 canvas.drawRect(rect,mPaint); - canvas.skew(1,0); // 错切 + canvas.skew(1,0); // 水平错切 <- 45度 mPaint.setColor(Color.BLUE); // 绘制蓝色矩形 canvas.drawRect(rect,mPaint); @@ -307,8 +311,8 @@ Y = sy * x + y mPaint.setColor(Color.BLACK); // 绘制黑色矩形 canvas.drawRect(rect,mPaint); - canvas.skew(1,0); // 错切 - canvas.skew(0,1); // 错切 + canvas.skew(1,0); // 水平错切 + canvas.skew(0,1); // 垂直错切 mPaint.setColor(Color.BLUE); // 绘制蓝色矩形 canvas.drawRect(rect,mPaint); From d044c3dea2a072c71ead5a1dd52ca9646d422f06 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 07:24:42 +0800 Subject: [PATCH 251/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 04cf94d0..32ef1141 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -14,8 +14,6 @@ ## Matrix简介

-### 概述 - **Matrix是一个矩阵,主要功能是坐标映射,数值转换。** 它看起来大概是下面这样: From 6d8b372d202c2f7336c63697e3ee184b8b24980b Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 17:56:35 +0800 Subject: [PATCH 252/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 32ef1141..9d8dbc42 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -61,7 +61,7 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 由于我们以下大部分的计算都是基于矩阵乘法规则,如果你已经把线性代数还给了老师,请参考一下这里: **[维基百科-矩阵乘法](https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%99%A3%E4%B9%98%E6%B3%95)** -#### a.缩放 +### 1.缩放 以点(10,10)为例,我们将x缩放到原来到0.5倍,y缩放到原来到2倍,我们可以轻易到算出结果:(10x0.5, 10x2) = (5, 20) @@ -90,7 +90,7 @@ y $$) -#### b.错切 +### 2.错切 错切有水平错切(平行X轴)和垂直错切(平行Y轴),或者是两者叠加。 @@ -118,7 +118,7 @@ y \\right ] $$) -#### b.旋转 +### 3.旋转 逆时针旋转 a 度。 @@ -147,7 +147,7 @@ y $$) -### 4.平移变换 +### 4.平移 我们可以看到,在之前的示例中,用的都是 2 x 2 的矩阵,但我们实际的矩阵是 3 x 3 的,这是为什么呢? From 468255a40df46cfc42b9ff2d0e4f46f63cfafa8f Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 20:42:25 +0800 Subject: [PATCH 253/615] Update --- ...0\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" index 68c18fe9..88835198 100644 --- "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" +++ "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" @@ -1,10 +1,13 @@ # AndroidStudio常用快捷键(Mac) +这里的快捷键是基于OSX个人定制版本的,具体请到 setting -> keymap 设置 + 快捷键 | 作用 ----------------------------|----------------------------------------------- Option + Enter | 自动修正 Command + N | 自动生成代码(Getter Setter) Command + Alt + L | 格式化代码 +Contral + Shift + F | 格式化代码(定制) Command + Alt + T | 把选中的代码放在 try{} 、if{} 、 else{} 里 Command + / | 注释 // Command + Shift + / | 注释 /* */ @@ -18,4 +21,5 @@ Control + Alt + O | 优化导入的包 Ctrl(Command)+ - / + | 折叠/展开代码 Ctrl(Command)+Shift+ - / + | 折叠/展开全部代码 Ctrl(Command)+Shift+. | 折叠/展开当前花括号中的代码 +Command + Y | 快速查看代码实现 From a54445c470266c0127764170d6ff8c88c26299d4 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 20:50:39 +0800 Subject: [PATCH 254/615] Update --- ...270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" index 88835198..685ffa39 100644 --- "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" +++ "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" @@ -22,4 +22,6 @@ Ctrl(Command)+ - / + | 折叠/展开代码 Ctrl(Command)+Shift+ - / + | 折叠/展开全部代码 Ctrl(Command)+Shift+. | 折叠/展开当前花括号中的代码 Command + Y | 快速查看代码实现 +Contral + H | 查看继承关系 +Contral + Alt + H | 查看调用关系 From 22c9f9353d2d3da026c3a648814ebe859114711a Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 20:56:03 +0800 Subject: [PATCH 255/615] Update --- ...270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" index 685ffa39..1a144a28 100644 --- "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" +++ "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" @@ -24,4 +24,6 @@ Ctrl(Command)+Shift+. | 折叠/展开当前花括号中的代码 Command + Y | 快速查看代码实现 Contral + H | 查看继承关系 Contral + Alt + H | 查看调用关系 +Command + [ | 返回上一次查看的位置 +Command + ] | 前进到返回之前查看的位置 From 2d39b66dd7263a07e82605d5c6556bccb4b7c6b6 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 21:08:59 +0800 Subject: [PATCH 256/615] Update --- ...\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" index 1a144a28..f7bccc3b 100644 --- "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" +++ "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" @@ -26,4 +26,5 @@ Contral + H | 查看继承关系 Contral + Alt + H | 查看调用关系 Command + [ | 返回上一次查看的位置 Command + ] | 前进到返回之前查看的位置 +Command + J | 自动生成代码 From ff281179ff9df774c91049ceea9cfbb6538c5775 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 26 Jul 2016 21:39:37 +0800 Subject: [PATCH 257/615] Update --- ...\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" index f7bccc3b..61910c5f 100644 --- "a/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" +++ "b/ChaosCrystal/AndroidStudio\345\270\270\347\224\250\345\277\253\346\215\267\351\224\256(Mac).md" @@ -27,4 +27,5 @@ Contral + Alt + H | 查看调用关系 Command + [ | 返回上一次查看的位置 Command + ] | 前进到返回之前查看的位置 Command + J | 自动生成代码 +Command + E | 查看最近打开的文件 From 0230e5b7c9a9311dc8a26313da592d7e680b2c03 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 27 Jul 2016 04:44:59 +0800 Subject: [PATCH 258/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 28 ++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 9d8dbc42..242aea67 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -63,32 +63,46 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 ### 1.缩放 -以点(10,10)为例,我们将x缩放到原来到0.5倍,y缩放到原来到2倍,我们可以轻易到算出结果:(10x0.5, 10x2) = (5, 20) +![](http://latex.codecogs.com/png.latex? +$$ +x = MSCALE\\_X \\times x_0 +$$) + +![](http://latex.codecogs.com/png.latex? +$$ +y = MSCALE\\_Y \\times y_0 +$$) + +用矩阵表示: ![](http://latex.codecogs.com/png.latex? $$ \\left [ \\begin{matrix} -X\\\\ -Y +x\\\\ +y\\\\ +1 \\end{1} \\right ] = \\left [ \\begin{matrix} -Scale\\_X & 0 \\\\ -0 & Scale\\_Y +MSCALE\\_X & 0 & 0 \\\\ + 0 & MSCALE\\_Y & 0 \\\\ + 0 & 0 & 1 \\end{1} \\right ] . \\left [ \\begin{matrix} -x\\\\ -y +x_0 \\\\ +y_0 \\\\ +1 \\end{1} \\right ] $$) +图例: ### 2.错切 From 386bfa71874d2d981e05eecfce8b57a58c68b416 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 27 Jul 2016 04:46:49 +0800 Subject: [PATCH 259/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 242aea67..e5610df8 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -92,7 +92,6 @@ MSCALE\\_X & 0 & 0 \\\\ 0 & 0 & 1 \\end{1} \\right ] - . \\left [ \\begin{matrix} x_0 \\\\ @@ -123,7 +122,6 @@ Y Skew\\_Y & 1 \\end{1} \\right ] - . \\left [ \\begin{matrix} x\\\\ From bd65ce6fbb3d91691ae9d951cd40574aabff565b Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 27 Jul 2016 05:31:57 +0800 Subject: [PATCH 260/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index e5610df8..26e090b1 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -101,6 +101,14 @@ y_0 \\\\ \\right ] $$) +> +你可能注意到了,我们坐标多了一个1,这是使用了齐次坐标系的缘故,在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,计算机无法区分,为此让计算机也可以区分它们,增加了一个标志位,增加之后看起来是这样:
+> +(x, y, 1) - 点
+(x, y, 0) - 向量
+> +另外,齐次坐标具有等比的性质,(2,3,1)、(4,6,2)...(2N,3N,N)表示的均是(2,3)这一个点。(**将MPERSP_2解释为scale这一误解就源于此**)。 + 图例: ### 2.错切 From 4c00613405ef4b25fc34ad302df1d7f65393c58b Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 27 Jul 2016 19:50:35 +0800 Subject: [PATCH 261/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 26e090b1..6184c147 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -119,21 +119,24 @@ $$) $$ \\left [ \\begin{matrix} -X\\\\ -Y +x\\\\ +y\\\\ +1 \\end{1} \\right ] = \\left [ -\\begin{matrix} -1 & Skew\\_X \\\\ -Skew\\_Y & 1 +\\begin{matrix} + 1 & MSKEW\\_X & 0 \\\\ +MSKEW\\_Y & 1 & 0 \\\\ + 0 & 0 & 1 \\end{1} \\right ] \\left [ \\begin{matrix} -x\\\\ -y +x_0\\\\ +y_0\\\\ +1 \\end{1} \\right ] $$) From 8696ef5f1265df06d81e119ae89bfe8768a043f8 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 27 Jul 2016 23:32:35 +0800 Subject: [PATCH 262/615] Update --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index c7899b8d..c64d1191 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,31 @@ > #### PS:点击分类标题可以查看该分类的详细信息。 + + ## 目录 +

+ + +
+ + ****** From 862178879b7865ef0dcd453f538b47ab27f772e7 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 27 Jul 2016 23:37:45 +0800 Subject: [PATCH 263/615] Update --- README.md | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index c64d1191..26721986 100644 --- a/README.md +++ b/README.md @@ -7,30 +7,26 @@ > #### PS:点击分类标题可以查看该分类的详细信息。 ## 目录 -
- - -
+ + - ****** From e0cc6ba517baeeab5c72bf38638dddc53ecffa25 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 27 Jul 2016 23:39:21 +0800 Subject: [PATCH 264/615] Update --- README.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/README.md b/README.md index 26721986..c7899b8d 100644 --- a/README.md +++ b/README.md @@ -6,22 +6,8 @@ > #### PS:点击分类标题可以查看该分类的详细信息。 - - ## 目录 - - - - [自定义View](#custom_view) - [教程类](#教程类) - [速查表](#速查表) From 2a8686ac2ed4605d909941278b64172c755e52d5 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 28 Jul 2016 04:48:35 +0800 Subject: [PATCH 265/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 6184c147..2285f27e 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -151,20 +151,23 @@ $$ \\begin{matrix} X\\\\ Y +1 \\end{1} \\right ] = \\left [ \\begin{matrix} -cos(a) & -sin(a) \\\\ -sin(a) & cos(a) +cos(a) & -sin(a) & 0 \\\\ +sin(a) & cos(a) & 0 \\\\ + 0 & 0 & 1 \\end{1} \\right ] . \\left [ \\begin{matrix} -x\\\\ -y +x_0\\\\ +y_0\\\\ +1 \\end{1} \\right ] $$) From ebe187df27e6a335c089709efe61a3188d50d7a9 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 28 Jul 2016 23:54:23 +0800 Subject: [PATCH 266/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 2285f27e..492ae93d 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -175,12 +175,6 @@ $$) ### 4.平移 -我们可以看到,在之前的示例中,用的都是 2 x 2 的矩阵,但我们实际的矩阵是 3 x 3 的,这是为什么呢? - -前面的各种方法我们都是直接 - - - From e644bcf322e6c68ad7d86f0974d35e0ba877fb12 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 29 Jul 2016 01:39:19 +0800 Subject: [PATCH 267/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 31 ++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 492ae93d..e29a3a5b 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -149,8 +149,8 @@ $$) $$ \\left [ \\begin{matrix} -X\\\\ -Y +x\\\\ +y 1 \\end{1} \\right ] @@ -175,7 +175,32 @@ $$) ### 4.平移 - +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} +x\\\\ +y +1 +\\end{1} +\\right ] + = +\\left [ +\\begin{matrix} +1 & 0 & MTRANS\\_X \\\\ +0 & 1 & MTRANS\\_Y \\\\ +0 & 0 & 1 +\\end{1} +\\right ] + . +\\left [ +\\begin{matrix} +x_0\\\\ +y_0\\\\ +1 +\\end{1} +\\right ] +$$) From 836eba33e75332478e243c972b9d18cdf80ad3d2 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 29 Jul 2016 22:50:40 +0800 Subject: [PATCH 268/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index e29a3a5b..c52c5dcd 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -175,20 +175,25 @@ $$) ### 4.平移 +![](http://latex.codecogs.com/png.latex?$$ x = x_0 + \\Delta x $$) + +![](http://latex.codecogs.com/png.latex?$$ y = y_0 + \\Delta y $$) + + ![](http://latex.codecogs.com/png.latex? $$ \\left [ \\begin{matrix} x\\\\ -y +y\\\\ 1 \\end{1} \\right ] = \\left [ \\begin{matrix} -1 & 0 & MTRANS\\_X \\\\ -0 & 1 & MTRANS\\_Y \\\\ +1 & 0 & \\Delta x \\\\ +0 & 1 & \\Delta y \\\\ 0 & 0 & 1 \\end{1} \\right ] From faaf2d7ffa0728396a7240815e7825e12bf0b115 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 29 Jul 2016 23:20:33 +0800 Subject: [PATCH 269/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index c52c5dcd..61bbf1d7 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -63,15 +63,10 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 ### 1.缩放 -![](http://latex.codecogs.com/png.latex? -$$ -x = MSCALE\\_X \\times x_0 -$$) +![](http://latex.codecogs.com/png.latex?$$ x = k_1 x_0 $$) + +![](http://latex.codecogs.com/png.latex?$$ y = k_2 y_0 $$) -![](http://latex.codecogs.com/png.latex? -$$ -y = MSCALE\\_Y \\times y_0 -$$) 用矩阵表示: @@ -87,9 +82,9 @@ y\\\\ = \\left [ \\begin{matrix} -MSCALE\\_X & 0 & 0 \\\\ - 0 & MSCALE\\_Y & 0 \\\\ - 0 & 0 & 1 +k_1 & 0 & 0 \\\\ + 0 & k_2 & 0 \\\\ + 0 & 0 & 1 \\end{1} \\right ] \\left [ From 8bcee327290244c43a1575795ccd8b9d4f9882ac Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 29 Jul 2016 23:57:36 +0800 Subject: [PATCH 270/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 61bbf1d7..37fc856b 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -122,9 +122,9 @@ y\\\\ = \\left [ \\begin{matrix} - 1 & MSKEW\\_X & 0 \\\\ -MSKEW\\_Y & 1 & 0 \\\\ - 0 & 0 & 1 + 1 & k_1 & 0 \\\\ +k_2 & 1 & 0 \\\\ + 0 & 0 & 1 \\end{1} \\right ] \\left [ From d826748f6d9a73ca3f637bf8e0d77b8a505ba37a Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 30 Jul 2016 07:49:28 +0800 Subject: [PATCH 271/615] Update --- ...\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git "a/ChaosCrystal/Android\344\270\255dip\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" "b/ChaosCrystal/Android\344\270\255dip\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" index 51ce9556..67f1ff94 100644 --- "a/ChaosCrystal/Android\344\270\255dip\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" +++ "b/ChaosCrystal/Android\344\270\255dip\343\200\201dp\343\200\201sp\343\200\201pt\345\222\214px.md" @@ -12,7 +12,11 @@ pt | point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业 in | (英寸):长度单位。 mm | (毫米):长度单位。 -单位转换: +## 工具包 + +在 [ViewSupport](https://github.com/GcsSloop/ViewSupport) 支持包中可以找到该工具。 + +## 单位转换代码: ``` java /** * dp、sp 转换为 px 的工具类 From 6de69bbd7cb62691fd849f7476058c98f9f6d64e Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 30 Jul 2016 07:58:07 +0800 Subject: [PATCH 272/615] Update --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index c7899b8d..8dda22b4 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,16 @@ ****** +## 开源库 + +* [FontsManager - 快速替换字体](https://github.com/GcsSloop/FontsManager) +* [ViewSupport - 自定义View工具包](https://github.com/GcsSloop/ViewSupport) +* [Rocker - 自定义摇杆](https://github.com/GcsSloop/Rocker) +* [LeafLoading - 进度条](https://github.com/GcsSloop/LeafLoading) +* [Rotate3dAnimation - 3D旋转动画(修正版)](https://github.com/GcsSloop/Rotate3dAnimation) + +****** + ## 版权声明 * 所有原创文章(未进行特殊标识的均属于原创) 的著作权属于 **GcsSloop**。 From 11ebf3a626c0f7b807cab9a3bcdc96a693732923 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 30 Jul 2016 07:58:51 +0800 Subject: [PATCH 273/615] Update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8dda22b4..a7e4dc88 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ - [教程类](#教程类) - [速查表](#速查表) - [混沌水晶](#混沌水晶) +- [开源库](#开源库) - [版权声明](#版权声明) ****** From 8e76bf4d5fd2d8dc4c2386c57746c77e1dbac992 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 31 Jul 2016 03:21:14 +0800 Subject: [PATCH 274/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 37fc856b..ab5a912a 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -104,11 +104,17 @@ $$) > 另外,齐次坐标具有等比的性质,(2,3,1)、(4,6,2)...(2N,3N,N)表示的均是(2,3)这一个点。(**将MPERSP_2解释为scale这一误解就源于此**)。 -图例: - ### 2.错切 -错切有水平错切(平行X轴)和垂直错切(平行Y轴),或者是两者叠加。 +错切存在两种特殊错切,水平错切(平行X轴)和垂直错切(平行Y轴)。 + +#### 水平错切 + +![](http://latex.codecogs.com/png.latex?$$ x = x + ky_0 $$) + +![](http://latex.codecogs.com/png.latex?$$ y = y_0 $$) + +用矩阵表示: ![](http://latex.codecogs.com/png.latex? $$ @@ -122,8 +128,8 @@ y\\\\ = \\left [ \\begin{matrix} - 1 & k_1 & 0 \\\\ -k_2 & 1 & 0 \\\\ + 1 & k & 0 \\\\ + 0 & 1 & 0 \\\\ 0 & 0 & 1 \\end{1} \\right ] From 0af5449e62e159b77d8c67384095566cd0af46a5 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 31 Jul 2016 03:49:17 +0800 Subject: [PATCH 275/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index ab5a912a..f0e4aeaf 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -104,6 +104,10 @@ $$) > 另外,齐次坐标具有等比的性质,(2,3,1)、(4,6,2)...(2N,3N,N)表示的均是(2,3)这一个点。(**将MPERSP_2解释为scale这一误解就源于此**)。 +图例: + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f6ck7qsor2j308c0dwglo.jpg) + ### 2.错切 错切存在两种特殊错切,水平错切(平行X轴)和垂直错切(平行Y轴)。 From 4575f6259ae2b98e04645e34d264fae52534db5a Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 31 Jul 2016 05:44:38 +0800 Subject: [PATCH 276/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index f0e4aeaf..54d3e02b 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -106,7 +106,7 @@ $$) 图例: -![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f6ck7qsor2j308c0dwglo.jpg) +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f6cnk02zy9j308c0dwwej.jpg) ### 2.错切 @@ -146,6 +146,10 @@ y_0\\\\ \\right ] $$) +图例: + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f6cniifb0sj308c0dw3yz.jpg) + ### 3.旋转 逆时针旋转 a 度。 From 41abc8687fa992d013bc02820375b8b6f071aea7 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 31 Jul 2016 05:47:58 +0800 Subject: [PATCH 277/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 40 ++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 54d3e02b..f90df85c 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -114,7 +114,7 @@ $$) #### 水平错切 -![](http://latex.codecogs.com/png.latex?$$ x = x + ky_0 $$) +![](http://latex.codecogs.com/png.latex?$$ x = x_0 + ky_0 $$) ![](http://latex.codecogs.com/png.latex?$$ y = y_0 $$) @@ -150,6 +150,44 @@ $$) ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f6cniifb0sj308c0dw3yz.jpg) +#### 垂直错切 + +![](http://latex.codecogs.com/png.latex?$$ x = x_0 $$) + +![](http://latex.codecogs.com/png.latex?$$ y = kx_0 + y_0 $$) + +用矩阵表示: + +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} +x\\\\ +y\\\\ +1 +\\end{1} +\\right ] + = +\\left [ +\\begin{matrix} + 1 & 0 & 0 \\\\ + k & 1 & 0 \\\\ + 0 & 0 & 1 +\\end{1} +\\right ] +\\left [ +\\begin{matrix} +x_0\\\\ +y_0\\\\ +1 +\\end{1} +\\right ] +$$) + +图例: + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f6cnkwyksij308c0dwq3f.jpg) + ### 3.旋转 逆时针旋转 a 度。 From 29c55dbafc46267c10c0fb1f8d7eb8a0dd0411f0 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 31 Jul 2016 06:03:12 +0800 Subject: [PATCH 278/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index f90df85c..038d1843 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -190,14 +190,16 @@ $$) ### 3.旋转 -逆时针旋转 a 度。 +设一个点 A(x0, 0) ,绕原点旋转 θ 度, 假定点A距离原点距离为 r。 + + ![](http://latex.codecogs.com/png.latex? $$ \\left [ \\begin{matrix} x\\\\ -y +y\\\\ 1 \\end{1} \\right ] From 479849a6ba2c473a609ce9b89a2a75b0b70df13a Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 31 Jul 2016 06:03:49 +0800 Subject: [PATCH 279/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 038d1843..4d6d0764 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -190,7 +190,7 @@ $$) ### 3.旋转 -设一个点 A(x0, 0) ,绕原点旋转 θ 度, 假定点A距离原点距离为 r。 +设一个点 A(x0, y0) ,绕原点旋转 θ 度, 假定点A距离原点距离为 r。 From 9682ab19a121722d88a6454b019e2224729c8ace Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 31 Jul 2016 06:47:50 +0800 Subject: [PATCH 280/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 4d6d0764..d5b4ca4a 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -190,9 +190,9 @@ $$) ### 3.旋转 -设一个点 A(x0, y0) ,绕原点旋转 θ 度, 假定点A距离原点距离为 r。 - +设一个点 A(x0, y0) ,绕原点旋转 θ 度, 假定点A距离原点距离为 r, 旋转后为点 B(x, y) 如下: +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f6cpceme7lj308c0dwq30.jpg) ![](http://latex.codecogs.com/png.latex? $$ From 20df15e5a178f680365c47f6937725d483c995e9 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 31 Jul 2016 06:57:02 +0800 Subject: [PATCH 281/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index d5b4ca4a..220dd747 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -190,7 +190,13 @@ $$) ### 3.旋转 -设一个点 A(x0, y0) ,绕原点旋转 θ 度, 假定点A距离原点距离为 r, 旋转后为点 B(x, y) 如下: +假定一个点 A(x0, y0) ,距离原点距离为 r, 与水平轴夹角为 α 度, 绕原点旋转 θ 度, 旋转后为点 B(x, y) 如下: + +![](http://latex.codecogs.com/png.latex? $$ x_0 = r \\cdot cos \\alpha $$) + +![](http://latex.codecogs.com/png.latex? $$ y_0 = r \\cdot sin \\alpha $$) + +图例: ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f6cpceme7lj308c0dwq30.jpg) @@ -206,8 +212,8 @@ y\\\\ = \\left [ \\begin{matrix} -cos(a) & -sin(a) & 0 \\\\ -sin(a) & cos(a) & 0 \\\\ +cos(\\alpha) & -sin(\\alpha) & 0 \\\\ +sin(\\alpha) & cos(\\alpha) & 0 \\\\ 0 & 0 & 1 \\end{1} \\right ] From e1ce1d52baa755fbe44e7b132530848bcee65a9d Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 31 Jul 2016 07:08:37 +0800 Subject: [PATCH 282/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 220dd747..58513168 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -196,9 +196,23 @@ $$) ![](http://latex.codecogs.com/png.latex? $$ y_0 = r \\cdot sin \\alpha $$) +![](http://latex.codecogs.com/png.latex? +$$ +x = r \\cdot cos( \\alpha + \\theta) += r \\cdot cos \\alpha \\cdot cos \\theta - r \\cdot sin \\alpha \\cdot sin \\theta += x_0 \\cdot cos \\theta - y_0 \\cdot sin \\theta +$$) + +![](http://latex.codecogs.com/png.latex? +$$ +y = r \\cdot sin( \\alpha + \\theta) += r \\cdot sin \\alpha \\cdot cos \\theta + r \\cdot cos \\alpha \\cdot sin \\theta += y_0 \\cdot cos \\theta + x_0 \\cdot sin \\theta +$$) + 图例: -![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f6cpceme7lj308c0dwq30.jpg) +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f6cpp174twj308c0dwt8s.jpg) ![](http://latex.codecogs.com/png.latex? $$ From 4557cb0697531afc8278a916ea64ede64c7f195d Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 31 Jul 2016 07:10:41 +0800 Subject: [PATCH 283/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 58513168..a7b37733 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -210,9 +210,7 @@ y = r \\cdot sin( \\alpha + \\theta) = y_0 \\cdot cos \\theta + x_0 \\cdot sin \\theta $$) -图例: - -![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f6cpp174twj308c0dwt8s.jpg) +用矩阵表示: ![](http://latex.codecogs.com/png.latex? $$ @@ -226,9 +224,9 @@ y\\\\ = \\left [ \\begin{matrix} -cos(\\alpha) & -sin(\\alpha) & 0 \\\\ -sin(\\alpha) & cos(\\alpha) & 0 \\\\ - 0 & 0 & 1 +cos(\\theta) & -sin(\\theta) & 0 \\\\ +sin(\\theta) & cos(\\theta) & 0 \\\\ + 0 & 0 & 1 \\end{1} \\right ] . @@ -241,6 +239,12 @@ y_0\\\\ \\right ] $$) +图例: + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f6cpp174twj308c0dwt8s.jpg) + + + ### 4.平移 From c6cb7e51f87448af04343619cef87d4c72fd1340 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 31 Jul 2016 07:22:27 +0800 Subject: [PATCH 284/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 37 +++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index a7b37733..aba8fae8 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -188,6 +188,43 @@ $$) ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f6cnkwyksij308c0dwq3f.jpg) +#### 复合错切 + +> 水平错切和垂直错切的复合。 + +![](http://latex.codecogs.com/png.latex?$$ x = x_0 + k_1 y_0 $$) + +![](http://latex.codecogs.com/png.latex?$$ y = k_2 x_0 + y_0 $$) + +用矩阵表示: + +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} +x\\\\ +y\\\\ +1 +\\end{1} +\\right ] + = +\\left [ +\\begin{matrix} + 1 & k_1 & 0 \\\\ + k_2 & 1 & 0 \\\\ + 0 & 0 & 1 +\\end{1} +\\right ] +\\left [ +\\begin{matrix} +x_0\\\\ +y_0\\\\ +1 +\\end{1} +\\right ] +$$) + + ### 3.旋转 假定一个点 A(x0, y0) ,距离原点距离为 r, 与水平轴夹角为 α 度, 绕原点旋转 θ 度, 旋转后为点 B(x, y) 如下: From ebed4ed7c63f222844bfffc945222e991e024689 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 31 Jul 2016 07:23:01 +0800 Subject: [PATCH 285/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index aba8fae8..c816dade 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -224,6 +224,9 @@ y_0\\\\ \\right ] $$) +图例: + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f6cqdu6olfj308c0dwdgi.jpg) ### 3.旋转 From 502525b31f7e5a9fa30ba57b82c6e30ecf67f1bb Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 1 Aug 2016 02:00:17 +0800 Subject: [PATCH 286/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index c816dade..24c596e6 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -61,7 +61,7 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 由于我们以下大部分的计算都是基于矩阵乘法规则,如果你已经把线性代数还给了老师,请参考一下这里: **[维基百科-矩阵乘法](https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%99%A3%E4%B9%98%E6%B3%95)** -### 1.缩放 +### 1.缩放(Scale) ![](http://latex.codecogs.com/png.latex?$$ x = k_1 x_0 $$) @@ -108,7 +108,7 @@ $$) ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f6cnk02zy9j308c0dwwej.jpg) -### 2.错切 +### 2.错切(Skew) 错切存在两种特殊错切,水平错切(平行X轴)和垂直错切(平行Y轴)。 @@ -228,7 +228,7 @@ $$) ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f6cqdu6olfj308c0dwdgi.jpg) -### 3.旋转 +### 3.旋转(Rotate) 假定一个点 A(x0, y0) ,距离原点距离为 r, 与水平轴夹角为 α 度, 绕原点旋转 θ 度, 旋转后为点 B(x, y) 如下: @@ -284,14 +284,13 @@ $$) ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f6cpp174twj308c0dwt8s.jpg) - - -### 4.平移 +### 4.平移(Translate) ![](http://latex.codecogs.com/png.latex?$$ x = x_0 + \\Delta x $$) ![](http://latex.codecogs.com/png.latex?$$ y = y_0 + \\Delta y $$) +用矩阵表示: ![](http://latex.codecogs.com/png.latex? $$ From f97d0aee3adae68476906dce9bd40cb4217f2f88 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 1 Aug 2016 04:13:34 +0800 Subject: [PATCH 287/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 24c596e6..3623571f 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -319,7 +319,9 @@ y_0\\\\ \\right ] $$) +图例: +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f6dqiw20xoj308c0dw0su.jpg) From 843bce19b8c67f6ab117f7181b4095f24e7ee111 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 1 Aug 2016 04:27:53 +0800 Subject: [PATCH 288/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a7e4dc88..a13d2da9 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,6 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) - + [▲ 回到顶部](#top) From 9f3a6a6ac23ab7bdebc3e4ad6f1ccfe953bc1a32 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 1 Aug 2016 06:47:35 +0800 Subject: [PATCH 289/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 3623571f..20566092 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -6,7 +6,9 @@ - [Matrix简介](#jianjie) - [概述](#gaishu) - [常见误解](#wujie) -- [Matrix详解](#xiangjie) +- [Matrix基本原理](#jiben) +- [Matrix复合原理](#fuhe) + ****** @@ -51,12 +53,14 @@ $$) ****** -

-## Matrix详解 +

+## Matrix基本原理 Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就看看几种常见变换的原理: -常见的基本变换有4种: 平移(translate)、缩放(scale)、旋转(rotate) 和 错切(skew)。 +> 我们所用到的变换均属于仿射变换,仿射变换是 线性变换(缩放,旋转,错切) 和 平移变换(平移) 的复合,由于这些概念对于我们作用并不大,此处不过多介绍,有兴趣可自行了解。 + +基本变换有4种: 平移(translate)、缩放(scale)、旋转(rotate) 和 错切(skew)。 由于我们以下大部分的计算都是基于矩阵乘法规则,如果你已经把线性代数还给了老师,请参考一下这里: **[维基百科-矩阵乘法](https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%99%A3%E4%B9%98%E6%B3%95)** @@ -286,6 +290,9 @@ $$) ### 4.平移(Translate) +> +此处也是使用齐次坐标的优点体现之一,实际上前面的三个操作使用 2x2 的矩阵也能满足需求,但是使用 2x2 的矩阵,无法将平移操作加入其中,而将坐标扩展为齐次坐标后,将矩阵扩展为 3x3 就可以将算法统一,四种算法均可以使用矩阵乘法完成。 + ![](http://latex.codecogs.com/png.latex?$$ x = x_0 + \\Delta x $$) ![](http://latex.codecogs.com/png.latex?$$ y = y_0 + \\Delta y $$) @@ -324,6 +331,8 @@ $$) ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f6dqiw20xoj308c0dw0su.jpg) +

+## Matrix复合原理 From 7a84a9398f4bd83d3ee050cba6f730b03d1df1f1 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 1 Aug 2016 06:50:21 +0800 Subject: [PATCH 290/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 20566092..975661d7 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -8,6 +8,7 @@ - [常见误解](#wujie) - [Matrix基本原理](#jiben) - [Matrix复合原理](#fuhe) +- [Matrix方法表](#fangfa) ****** @@ -338,7 +339,8 @@ $$) -**Matrix方法表** +

+## Matrix方法表 方法类别 | 相关API | 摘要 -----------|---------------------------------------------------------|------------------------ From 62f55b5f4b574d501b4d486bff37219290e291b7 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 1 Aug 2016 07:01:24 +0800 Subject: [PATCH 291/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 975661d7..0b608558 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -3,13 +3,18 @@ ## 目录 +- [前言](#qianyan) - [Matrix简介](#jianjie) - - [概述](#gaishu) - - [常见误解](#wujie) - [Matrix基本原理](#jiben) - [Matrix复合原理](#fuhe) - [Matrix方法表](#fangfa) +

+## 前言 + +本文内容偏向理论,和 [画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 有重叠的部分,本文会让你更加深入的了解其中的原理。 + +由于Google已经对这一部分已经做了很好的封装,所以跳过本部分对实际开发影响并不会太大,不想深究的粗略浏览即可,下一篇中将会详细讲解Matrix的具体用法和技巧。 ****** @@ -339,7 +344,7 @@ $$) -

+

## Matrix方法表 方法类别 | 相关API | 摘要 From ad6b318ca6bff582ae3547d66c7c8974a22bf2cf Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 00:40:48 +0800 Subject: [PATCH 292/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 0b608558..1d175643 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -340,6 +340,10 @@ $$)

## Matrix复合原理 +其实Matrix的多种复合操作都是使用矩阵乘法实现的,从原理上理解很简单,但是,使用矩阵乘法也有其弱点,后面的操作可能会影响到前面到操作,所以在构造Matrix时顺序很重要。 + +我们常用的四大变换操作,每一种操作在Matrix均有三类,前乘(pre),后乘(post)和设置(set),可以参见文末对[Matrix方法表](#fangfa)。 + From 6827fc2df1eda7bbf15c6a5804be21811fe711a8 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 00:58:57 +0800 Subject: [PATCH 293/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 1d175643..42ee83d2 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -342,7 +342,16 @@ $$) 其实Matrix的多种复合操作都是使用矩阵乘法实现的,从原理上理解很简单,但是,使用矩阵乘法也有其弱点,后面的操作可能会影响到前面到操作,所以在构造Matrix时顺序很重要。 -我们常用的四大变换操作,每一种操作在Matrix均有三类,前乘(pre),后乘(post)和设置(set),可以参见文末对[Matrix方法表](#fangfa)。 +我们常用的四大变换操作,每一种操作在Matrix均有三类,前乘(pre),后乘(post)和设置(set),可以参见文末对[Matrix方法表](#fangfa),由于矩阵乘法不满足交换律,所以前乘(pre),后乘(post)和设置(set)的区别还是很大的。 + +### 前乘(pre) + +前乘相当于矩阵的右乘: +![](http://latex.codecogs.com/png.latex?$$ M' = M \\cdot S $$) + +> 这表示一个矩阵与一个特殊矩阵前乘后构造出结果矩阵。 + + From ca44e99c25f2d20b26f31e010be782fb703d1f7f Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 02:17:27 +0800 Subject: [PATCH 294/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 42ee83d2..246bcc98 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -351,11 +351,16 @@ $$) > 这表示一个矩阵与一个特殊矩阵前乘后构造出结果矩阵。 +### 后乘(post) +前乘相当于矩阵的左乘: +![](http://latex.codecogs.com/png.latex?$$ M' = S \\cdot M $$) +> 这表示一个矩阵与一个特殊矩阵后乘后构造出结果矩阵。 +### 设置(set) - +设置使用的不是矩阵乘法,而是直接覆盖掉原来的数值,所以,使用设置后可能会导致之前的操作失效。

## Matrix方法表 From 454f558bbe4313ac060d43cfd1783f4dd5b83d77 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 02:44:03 +0800 Subject: [PATCH 295/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 246bcc98..676a1985 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -46,6 +46,16 @@ $$) **从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇讨论范围内,暂不过多叙述,会在之后对文章中详述其作用。** +### Matrix优点 + +* 作用范围更广,Matrix在自定义View,图片,动画效果上均有运用,相比与之前讲对画布操作应用范围更广。 +* 更加灵活,画布操作是对Matrix的封装,Matrix作为更接近底层的东西,必然要比画布操作更加灵活。 +* 封装很好,Matrix本身对各个方法就做了很好的封装,让开发者可以很方便的操作Matrix。 + +### Matrix缺点 + +* 难以深入理解,很难理解中各个数值的意义,以及操作规律,如果不了解矩阵,也很难理解前乘,后乘。 +

### 常见误解 @@ -360,7 +370,7 @@ $$) ### 设置(set) -设置使用的不是矩阵乘法,而是直接覆盖掉原来的数值,所以,使用设置后可能会导致之前的操作失效。 +设置使用的不是矩阵乘法,而是直接覆盖掉原来的数值,所以,**使用设置可能会导致之前的操作失效**。

## Matrix方法表 From a24d7b8068128aaa8dbed7c919e22d38c18797b5 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 03:24:34 +0800 Subject: [PATCH 296/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 676a1985..0cc6a36f 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -372,6 +372,35 @@ $$) 设置使用的不是矩阵乘法,而是直接覆盖掉原来的数值,所以,**使用设置可能会导致之前的操作失效**。 +## 组合 + +我们使用Matrix最终目的就是让视图显示为我们想要的状态,为此我们可能需要多种操作结合使用。 + +我发现很多讲解Matrix的文章喜欢用绕某一个点缩放(旋转)的示例来讲解,如下: + + +> + 那么我们如果想让它基于图片中心缩放,应该该怎么办?要用到组合变换, + 1)先将图片由中心平移到原点,这是应用变换 T + 2)对图应用缩放变换 S + 3)再将图片平移回到中心,应用变换 -T + +> + 对应代码: + matrix.postScale(0.5f, 0.5f); + matrix.preTranslate(-pivotX, -pivotY); + matrix.postTranslate(pivotX, pivotY); +> + PS: 此段文字引用自其它文章。 + +首先,**这个思路是没有任何问题的,也是实现绕某一点操作的核心原理**,但这可能会对一部分小白造成误解,认为只能这样实现,然而查看一下Matrix的方法表就能知道四大操作都可以指定中心点,所以,上面的三行代码用一行就能完成: + +```java +matrix.postScale(0.5f, 0.5f, pivotX, pivotY); +``` + +**组合操作构造Matrix时,个人建议尽量全部使用后乘或者全部使用前乘,这样操作顺序容易确定,出现问题也比较容易排查。
当然,由于矩阵乘法不满足交换律,前乘和后乘的结果是不同的,使用时应结合具体情景分析使用。** +

## Matrix方法表 From ffc68702528d188bac52e8de4a3412924f3bc3ce Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 03:29:22 +0800 Subject: [PATCH 297/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 0cc6a36f..05a014ef 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -404,6 +404,8 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY);

## Matrix方法表 +这个方法表,暂时放到这里让大家看看,方法的使用讲解放在下一篇文章中。 + 方法类别 | 相关API | 摘要 -----------|---------------------------------------------------------|------------------------ 基本方法 | equals hashCode toString toShortString | 比较、 获取哈希值、 转换为字符串 From 60a9b330cf4bc743b2b909d81a4683f8db137eab Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 03:33:27 +0800 Subject: [PATCH 298/615] Update --- Course/HowToUsePlantUMLInAS.md | 2 +- Course/ReleaseLibraryByJitPack.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Course/HowToUsePlantUMLInAS.md b/Course/HowToUsePlantUMLInAS.md index ea1ef7de..baa7809a 100644 --- a/Course/HowToUsePlantUMLInAS.md +++ b/Course/HowToUsePlantUMLInAS.md @@ -49,7 +49,7 @@ ## About Me ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) - + diff --git a/Course/ReleaseLibraryByJitPack.md b/Course/ReleaseLibraryByJitPack.md index 18b3dbf6..a5aae506 100644 --- a/Course/ReleaseLibraryByJitPack.md +++ b/Course/ReleaseLibraryByJitPack.md @@ -149,7 +149,7 @@ buildscript { ### 作者微博: @GcsSloop - + From 4a4791b283efa576079a2e49192c0f46838c4e82 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 03:35:04 +0800 Subject: [PATCH 299/615] Update --- CustomView/Base/[1]CoordinateSystem.md | 2 +- CustomView/Base/[2]AngleAndRadian.md | 2 +- CustomView/Base/[3]Color.md | 2 +- CustomView/README.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CustomView/Base/[1]CoordinateSystem.md b/CustomView/Base/[1]CoordinateSystem.md index e4b1f9ab..00ac0ba8 100644 --- a/CustomView/Base/[1]CoordinateSystem.md +++ b/CustomView/Base/[1]CoordinateSystem.md @@ -63,5 +63,5 @@ ### 作者微博: @GcsSloop - + diff --git a/CustomView/Base/[2]AngleAndRadian.md b/CustomView/Base/[2]AngleAndRadian.md index e262ee81..5b4ee7db 100644 --- a/CustomView/Base/[2]AngleAndRadian.md +++ b/CustomView/Base/[2]AngleAndRadian.md @@ -75,7 +75,7 @@ C = 2πr; ## About Me ### 作者微博: @GcsSloop - + diff --git a/CustomView/Base/[3]Color.md b/CustomView/Base/[3]Color.md index f5b0b7c1..aeb8a6f4 100644 --- a/CustomView/Base/[3]Color.md +++ b/CustomView/Base/[3]Color.md @@ -154,6 +154,6 @@ XOR | [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] ## About Me ### 作者微博: @GcsSloop - + diff --git a/CustomView/README.md b/CustomView/README.md index 485bd509..9b611047 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -36,4 +36,4 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) - + From bb18cc0b9d5f022a2a4eeb4fca9f7825b92ef73a Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 03:38:23 +0800 Subject: [PATCH 300/615] Update --- CustomView/Advance/[1]CustomViewProcess.md | 2 +- CustomView/Advance/[2]Canvas_BasicGraphics.md | 2 +- CustomView/Advance/[3]Canvas_Convert.md | 2 +- CustomView/Advance/[4]Canvas_PictureText.md | 2 +- CustomView/Advance/[5]Path_Basic.md | 2 +- CustomView/Advance/[6]Path_Bezier.md | 2 +- CustomView/Advance/[7]Path_Over.md | 2 +- CustomView/Advance/[8]Path_Play.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CustomView/Advance/[1]CustomViewProcess.md b/CustomView/Advance/[1]CustomViewProcess.md index c4fe7973..f6687bb5 100644 --- a/CustomView/Advance/[1]CustomViewProcess.md +++ b/CustomView/Advance/[1]CustomViewProcess.md @@ -228,7 +228,7 @@ ViewGroup | ViewGroup xxLayout等 | 包含子View ### 作者微博: @GcsSloop - + ## 参考资料: diff --git a/CustomView/Advance/[2]Canvas_BasicGraphics.md b/CustomView/Advance/[2]Canvas_BasicGraphics.md index 773c4497..9fafb163 100644 --- a/CustomView/Advance/[2]Canvas_BasicGraphics.md +++ b/CustomView/Advance/[2]Canvas_BasicGraphics.md @@ -530,7 +530,7 @@ public class PieView extends View { ## About Me ### 作者微博: @GcsSloop - + ## 参考资料: diff --git a/CustomView/Advance/[3]Canvas_Convert.md b/CustomView/Advance/[3]Canvas_Convert.md index 0ec2282d..b462e3e2 100644 --- a/CustomView/Advance/[3]Canvas_Convert.md +++ b/CustomView/Advance/[3]Canvas_Convert.md @@ -440,7 +440,7 @@ public int saveLayerAlpha (float left, float top, float right, float bottom, int ## About Me ### 作者微博: @GcsSloop - + ****** ## 四.参考资料 diff --git a/CustomView/Advance/[4]Canvas_PictureText.md b/CustomView/Advance/[4]Canvas_PictureText.md index 94fecc07..ad2e637b 100644 --- a/CustomView/Advance/[4]Canvas_PictureText.md +++ b/CustomView/Advance/[4]Canvas_PictureText.md @@ -495,7 +495,7 @@ public void drawPosText (char[] text, int index, int count, float[] pos, Paint p ### 作者微博: @GcsSloop - + ## 参考资料 diff --git a/CustomView/Advance/[5]Path_Basic.md b/CustomView/Advance/[5]Path_Basic.md index 69a63c18..d3641a42 100644 --- a/CustomView/Advance/[5]Path_Basic.md +++ b/CustomView/Advance/[5]Path_Basic.md @@ -572,7 +572,7 @@ dst状态 | 效果 ### 作者微博: @GcsSloop - + ## 参考资料 diff --git a/CustomView/Advance/[6]Path_Bezier.md b/CustomView/Advance/[6]Path_Bezier.md index a202261b..26f38ea8 100644 --- a/CustomView/Advance/[6]Path_Bezier.md +++ b/CustomView/Advance/[6]Path_Bezier.md @@ -574,7 +574,7 @@ public class Bezier3 extends View { ### 作者微博: @GcsSloop - + ## 参考资料 [Path](http://developer.android.com/reference/android/graphics/Path.html)
diff --git a/CustomView/Advance/[7]Path_Over.md b/CustomView/Advance/[7]Path_Over.md index 58ee9a6e..be9818bc 100644 --- a/CustomView/Advance/[7]Path_Over.md +++ b/CustomView/Advance/[7]Path_Over.md @@ -394,7 +394,7 @@ Path中常用的方法到此已经结束,希望能够帮助大家加深对Path ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) - + ## 参考资料 [Path](https://developer.android.com/reference/android/graphics/Path.html)
diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[8]Path_Play.md index c2a307fe..181158c6 100644 --- a/CustomView/Advance/[8]Path_Play.md +++ b/CustomView/Advance/[8]Path_Play.md @@ -536,7 +536,7 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) - + ## 参考资料 [PathMeasure](https://developer.android.com/reference/android/graphics/PathMeasure.html)
From 0bcc71aa7b8680bc116193bfd3fa1bae895bff41 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 03:40:57 +0800 Subject: [PATCH 301/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 05a014ef..82e66990 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -1,5 +1,8 @@ # Matrix基础篇 +### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) +### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) + ## 目录 @@ -417,17 +420,19 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY); 特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... +## 总结 +## About Me +### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) + +## 参考资料 - - - - - - - - +[]()
+[]()
+[]()
+[]()
+[]()
From 9eb7caa17e640e7581f525bda91c69c24befbbfd Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 03:45:46 +0800 Subject: [PATCH 302/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 82e66990..213b612f 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -11,6 +11,9 @@ - [Matrix基本原理](#jiben) - [Matrix复合原理](#fuhe) - [Matrix方法表](#fangfa) +- [总结](#zongjie) +- [关于作者](#about) +- [参考资料](#ziliao)

## 前言 @@ -420,15 +423,18 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY); 特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... +

## 总结 +

## About Me ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) +

## 参考资料 []()
From 8bace16878483a34e76d917e5c6248e982b433e4 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 03:53:39 +0800 Subject: [PATCH 303/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 213b612f..3e935e2d 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -437,8 +437,12 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY);

## 参考资料 -[]()
-[]()
-[]()
-[]()
+[Matrix](https://developer.android.com/reference/android/graphics/Matrix.html)
+[Android中图像变换Matrix的原理、代码验证和应用](http://biandroid.iteye.com/blog/1399462)
+[Android中关于矩阵(Matrix)前乘后乘的一些认识](http://blog.csdn.net/linmiansheng/article/details/18820599)
+[维基百科-仿射变换](https://zh.wikipedia.org/wiki/%E4%BB%BF%E5%B0%84%E5%8F%98%E6%8D%A2)
+[维基百科-齐次坐标](https://zh.wikipedia.org/wiki/%E9%BD%90%E6%AC%A1%E5%9D%90%E6%A0%87)
+[维基百科-线性映射](https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E6%98%A0%E5%B0%84)
+[齐次坐标系入门级思考](https://oncemore2020.github.io/blog/homogeneous/)
+[仿射变换与齐次坐标](https://guangchun.wordpress.com/2011/10/12/affineandhomogeneous/)
[]()
From bf9d21073ee20a83712412386f54f5747cc6e0da Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 04:00:14 +0800 Subject: [PATCH 304/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index 3e935e2d..dea05f9f 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -426,6 +426,10 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY);

## 总结 +对于Matrix重在理解,理解了其中的原理之后用起来将会更加得心应手。 + +**学完了本篇之后,推荐配合鸿洋大大的视频课程 [ +打造个性的图片预览与多点触控](http://www.imooc.com/learn/239) 食用,定然能够让你对Matrix对理解更上一层楼。**

## About Me From 53b8628b1ab9f5bfedfb6df5a67d34d231685f78 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 06:30:44 +0800 Subject: [PATCH 305/615] Update --- CustomView/Advance/[9]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[9]Matrix_Basic.md index dea05f9f..d63dba52 100644 --- a/CustomView/Advance/[9]Matrix_Basic.md +++ b/CustomView/Advance/[9]Matrix_Basic.md @@ -1,4 +1,4 @@ -# Matrix基础篇 +# Matrix原理 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) From 604b20954a91746e91d278ba78d75b8e9cabd5ef Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 06:33:02 +0800 Subject: [PATCH 306/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 CustomView/Advance/[10]Matrix_Method.md diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md new file mode 100644 index 00000000..d2fbecc8 --- /dev/null +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -0,0 +1 @@ +# Matrix方法 From 80b4fabc76cee75fe6466ecb648ffef28b372145 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 06:35:30 +0800 Subject: [PATCH 307/615] Update --- .../{[1]CoordinateSystem.md => [01]CoordinateSystem.md} | 0 .../Base/{[2]AngleAndRadian.md => [02]AngleAndRadian.md} | 0 CustomView/Base/{[3]Color.md => [03]Color.md} | 0 CustomView/README.md | 6 +++--- 4 files changed, 3 insertions(+), 3 deletions(-) rename CustomView/Base/{[1]CoordinateSystem.md => [01]CoordinateSystem.md} (100%) rename CustomView/Base/{[2]AngleAndRadian.md => [02]AngleAndRadian.md} (100%) rename CustomView/Base/{[3]Color.md => [03]Color.md} (100%) diff --git a/CustomView/Base/[1]CoordinateSystem.md b/CustomView/Base/[01]CoordinateSystem.md similarity index 100% rename from CustomView/Base/[1]CoordinateSystem.md rename to CustomView/Base/[01]CoordinateSystem.md diff --git a/CustomView/Base/[2]AngleAndRadian.md b/CustomView/Base/[02]AngleAndRadian.md similarity index 100% rename from CustomView/Base/[2]AngleAndRadian.md rename to CustomView/Base/[02]AngleAndRadian.md diff --git a/CustomView/Base/[3]Color.md b/CustomView/Base/[03]Color.md similarity index 100% rename from CustomView/Base/[3]Color.md rename to CustomView/Base/[03]Color.md diff --git a/CustomView/README.md b/CustomView/README.md index 9b611047..0f2e00b4 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -5,9 +5,9 @@ ## 基础篇

- - - + + +

******* From 7b6f6f4e6a2f4cd1269c35381ce014ebd1b66245 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 06:41:14 +0800 Subject: [PATCH 308/615] Update --- ...omViewProcess.md => [01]CustomViewProcess.md} | 0 ...icGraphics.md => [02]Canvas_BasicGraphics.md} | 0 ...3]Canvas_Convert.md => [03]Canvas_Convert.md} | 0 ..._PictureText.md => [04]Canvas_PictureText.md} | 0 .../{[5]Path_Basic.md => [05]Path_Basic.md} | 0 .../{[6]Path_Bezier.md => [06]Path_Bezier.md} | 0 .../{[7]Path_Over.md => [07]Path_Over.md} | 0 .../{[8]Path_Play.md => [08]Path_Play.md} | 0 .../{[9]Matrix_Basic.md => [09]Matrix_Basic.md} | 0 CustomView/README.md | 16 ++++++++-------- 10 files changed, 8 insertions(+), 8 deletions(-) rename CustomView/Advance/{[1]CustomViewProcess.md => [01]CustomViewProcess.md} (100%) rename CustomView/Advance/{[2]Canvas_BasicGraphics.md => [02]Canvas_BasicGraphics.md} (100%) rename CustomView/Advance/{[3]Canvas_Convert.md => [03]Canvas_Convert.md} (100%) rename CustomView/Advance/{[4]Canvas_PictureText.md => [04]Canvas_PictureText.md} (100%) rename CustomView/Advance/{[5]Path_Basic.md => [05]Path_Basic.md} (100%) rename CustomView/Advance/{[6]Path_Bezier.md => [06]Path_Bezier.md} (100%) rename CustomView/Advance/{[7]Path_Over.md => [07]Path_Over.md} (100%) rename CustomView/Advance/{[8]Path_Play.md => [08]Path_Play.md} (100%) rename CustomView/Advance/{[9]Matrix_Basic.md => [09]Matrix_Basic.md} (100%) diff --git a/CustomView/Advance/[1]CustomViewProcess.md b/CustomView/Advance/[01]CustomViewProcess.md similarity index 100% rename from CustomView/Advance/[1]CustomViewProcess.md rename to CustomView/Advance/[01]CustomViewProcess.md diff --git a/CustomView/Advance/[2]Canvas_BasicGraphics.md b/CustomView/Advance/[02]Canvas_BasicGraphics.md similarity index 100% rename from CustomView/Advance/[2]Canvas_BasicGraphics.md rename to CustomView/Advance/[02]Canvas_BasicGraphics.md diff --git a/CustomView/Advance/[3]Canvas_Convert.md b/CustomView/Advance/[03]Canvas_Convert.md similarity index 100% rename from CustomView/Advance/[3]Canvas_Convert.md rename to CustomView/Advance/[03]Canvas_Convert.md diff --git a/CustomView/Advance/[4]Canvas_PictureText.md b/CustomView/Advance/[04]Canvas_PictureText.md similarity index 100% rename from CustomView/Advance/[4]Canvas_PictureText.md rename to CustomView/Advance/[04]Canvas_PictureText.md diff --git a/CustomView/Advance/[5]Path_Basic.md b/CustomView/Advance/[05]Path_Basic.md similarity index 100% rename from CustomView/Advance/[5]Path_Basic.md rename to CustomView/Advance/[05]Path_Basic.md diff --git a/CustomView/Advance/[6]Path_Bezier.md b/CustomView/Advance/[06]Path_Bezier.md similarity index 100% rename from CustomView/Advance/[6]Path_Bezier.md rename to CustomView/Advance/[06]Path_Bezier.md diff --git a/CustomView/Advance/[7]Path_Over.md b/CustomView/Advance/[07]Path_Over.md similarity index 100% rename from CustomView/Advance/[7]Path_Over.md rename to CustomView/Advance/[07]Path_Over.md diff --git a/CustomView/Advance/[8]Path_Play.md b/CustomView/Advance/[08]Path_Play.md similarity index 100% rename from CustomView/Advance/[8]Path_Play.md rename to CustomView/Advance/[08]Path_Play.md diff --git a/CustomView/Advance/[9]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md similarity index 100% rename from CustomView/Advance/[9]Matrix_Basic.md rename to CustomView/Advance/[09]Matrix_Basic.md diff --git a/CustomView/README.md b/CustomView/README.md index 0f2e00b4..94bc98bc 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -14,24 +14,24 @@ ## 进阶篇

- - - + + +

*******

- - - + + +

*******

- - + +

### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From e58052477ab24a33c14dab91ee776ba95b74f8c1 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 06:42:51 +0800 Subject: [PATCH 309/615] Update --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index a13d2da9..5bfe40f2 100644 --- a/README.md +++ b/README.md @@ -21,18 +21,18 @@ ## [自定义View](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) * 基础篇 - * [安卓自定义View基础 - 坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md) - * [安卓自定义View基础 - 角度弧度](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B2%5DAngleAndRadian.md) - * [安卓自定义View基础 - 颜色](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B3%5DColor.md) + * [安卓自定义View基础 - 坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B01%5DCoordinateSystem.md) + * [安卓自定义View基础 - 角度弧度](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B02%5DAngleAndRadian.md) + * [安卓自定义View基础 - 颜色](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B03%5DColor.md) * 进阶篇 - * [安卓自定义View进阶 - 分类和流程](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B1%5DCustomViewProcess.md) - * [安卓自定义View进阶 - 绘制基本图形](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md) - * [安卓自定义View进阶 - 画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) - * [安卓自定义View进阶 - 图片文字](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) - * [安卓自定义View进阶 - Path基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) - * [安卓自定义View进阶 - 贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) - * [安卓自定义View进阶 - Path完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) - * [安卓自定义View进阶 - Path玩出花样(PathMeasure)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B8%5DPath_Play.md) + * [安卓自定义View进阶 - 分类和流程](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B01%5DCustomViewProcess.md) + * [安卓自定义View进阶 - 绘制基本图形](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B02%5DCanvas_BasicGraphics.md) + * [安卓自定义View进阶 - 画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B03%5DCanvas_Convert.md) + * [安卓自定义View进阶 - 图片文字](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B04%5DCanvas_PictureText.md) + * [安卓自定义View进阶 - Path基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B05%5DPath_Basic.md) + * [安卓自定义View进阶 - 贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B06%5DPath_Bezier.md) + * [安卓自定义View进阶 - Path完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B07%5DPath_Over.md) + * [安卓自定义View进阶 - Path玩出花样(PathMeasure)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B08%5DPath_Play.md) ****** From 3375c6a01aea850929371117f85ca2831e835205 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 06:54:02 +0800 Subject: [PATCH 310/615] Update --- .gitignore | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index ccf2efe0..00000000 --- a/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -# Built application files -*.apk -*.ap_ - -# Files for the Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ - -# Gradle files -.gradle/ -build/ -/*/build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log From 2c2df4ab4bf18bc132d9796025a5d1a325291737 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 06:59:50 +0800 Subject: [PATCH 311/615] Update --- CustomView/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CustomView/README.md b/CustomView/README.md index 94bc98bc..e08eff71 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -32,6 +32,7 @@

+

### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From e83c274012dd50bc42a680575ea3f7616c1ab5c7 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 07:01:17 +0800 Subject: [PATCH 312/615] Update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5bfe40f2..607fce1f 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ * [安卓自定义View进阶 - 贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B06%5DPath_Bezier.md) * [安卓自定义View进阶 - Path完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B07%5DPath_Over.md) * [安卓自定义View进阶 - Path玩出花样(PathMeasure)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B08%5DPath_Play.md) + * [安卓自定义View进阶 - Matrix原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B09%5DMatrix_Basic.md) ****** From 5da6d0d8ae721a1466ea8462d3de8f1e0b041482 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 07:10:18 +0800 Subject: [PATCH 313/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index d63dba52..405b09ab 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -20,6 +20,9 @@ 本文内容偏向理论,和 [画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 有重叠的部分,本文会让你更加深入的了解其中的原理。 +本篇的主角Matrix,是一个一直在后台默默工作的劳动模范,虽然我们所有看到View背后都有着Matrix的功劳,但我们却很少见到它,本篇我们就看看它是何方神圣吧。 + +> 由于Google已经对这一部分已经做了很好的封装,所以跳过本部分对实际开发影响并不会太大,不想深究的粗略浏览即可,下一篇中将会详细讲解Matrix的具体用法和技巧。 ****** From b1d57a122256b8b3cc346e75980308a4cf45f4a3 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 07:18:42 +0800 Subject: [PATCH 314/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 405b09ab..af63de01 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -55,6 +55,21 @@ $$) **从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇讨论范围内,暂不过多叙述,会在之后对文章中详述其作用。** +**Matrix作用就是坐标映射,那么为什么需要Matrix呢? 举一个简单的例子:** + +我的的手机屏幕作为物理设备,其物理坐标系是从左上角开始的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系。 + +以下图为例,我们的内容区和屏幕坐标系还相差一个通知栏加一个标题栏的距离,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的物理坐标系来绘制,Matrix在此处的作用就是转换这些数值。 + +> +假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点。 + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f624vi3eb6j30rs0goab5.jpg) + +以上是仅作为一个简单的示例,实际上不论2D还是3D,我们要将图形显示在屏幕上,都离不开Matrix,所以说Matrix是一个在背后辛勤工作的劳模。 + + + ### Matrix优点 * 作用范围更广,Matrix在自定义View,图片,动画效果上均有运用,相比与之前讲对画布操作应用范围更广。 From 0d2e4c296864cae354d2ed45487df50b8fa50699 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 07:21:18 +0800 Subject: [PATCH 315/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index af63de01..690df369 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -70,14 +70,12 @@ $$) -### Matrix优点 +### Matrix特点 -* 作用范围更广,Matrix在自定义View,图片,动画效果上均有运用,相比与之前讲对画布操作应用范围更广。 +* 作用范围更广,Matrix在View,图片,动画效果等各个方面均有运用,相比与之前讲解等画布操作应用范围更广。 * 更加灵活,画布操作是对Matrix的封装,Matrix作为更接近底层的东西,必然要比画布操作更加灵活。 * 封装很好,Matrix本身对各个方法就做了很好的封装,让开发者可以很方便的操作Matrix。 - -### Matrix缺点 - +* * 难以深入理解,很难理解中各个数值的意义,以及操作规律,如果不了解矩阵,也很难理解前乘,后乘。

From 65327773cf0438a5b167d31ecddcc416f0f1042a Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 07:40:52 +0800 Subject: [PATCH 316/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 690df369..d247b30d 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -48,13 +48,6 @@ MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 \\right ] $$) -下面我们看一下2D画布中常用的四种操作(translate, scale, rotate, skew)都是由哪些参数控制的。 - -![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f60gwrhlnyj30c008zdgy.jpg) -![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f633hvklfnj30c008zdge.jpg) - -**从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇讨论范围内,暂不过多叙述,会在之后对文章中详述其作用。** - **Matrix作用就是坐标映射,那么为什么需要Matrix呢? 举一个简单的例子:** 我的的手机屏幕作为物理设备,其物理坐标系是从左上角开始的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系。 @@ -100,6 +93,13 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 基本变换有4种: 平移(translate)、缩放(scale)、旋转(rotate) 和 错切(skew)。 +下面我们看一下四种变换都是由哪些参数控制的。 + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f60gwrhlnyj30c008zdgy.jpg) +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f633hvklfnj30c008zdge.jpg) + +**从上图可以看到最后三个参数是控制透视的,这三个参数主要在3D效果中运用,通常为(0, 0, 1),不在本篇讨论范围内,暂不过多叙述,会在之后对文章中详述其作用。** + 由于我们以下大部分的计算都是基于矩阵乘法规则,如果你已经把线性代数还给了老师,请参考一下这里: **[维基百科-矩阵乘法](https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%99%A3%E4%B9%98%E6%B3%95)** From 9a16417d771005506d81269559e9dfe40a58b8ee Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 10:16:05 +0800 Subject: [PATCH 317/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 101 +++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index d247b30d..7527fda1 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -423,6 +423,107 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY); **组合操作构造Matrix时,个人建议尽量全部使用后乘或者全部使用前乘,这样操作顺序容易确定,出现问题也比较容易排查。
当然,由于矩阵乘法不满足交换律,前乘和后乘的结果是不同的,使用时应结合具体情景分析使用。** +### Pre与Post的区别 + +主要区别其实就是矩阵的乘法顺序不同,pre相当于矩阵的右乘,而post相当于矩阵的左乘,在图像处理中,越靠近右边的矩阵越先执行,所以pre操作会先执行,而post操作会后执行。 + +**假设我们需要先缩放再平移:** + +pre: + +``` +Matrix m = new Matrix(); +m.reset(); +m.preTranslate(tx, ty); //使用pre,越靠后越先执行。 +m.preScale(sx, sy); +``` + +用矩阵表示: + +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} + & &\\\\ + & Result Matrix &\\\\ + & & +\\end{1} +\\right ] + = + \\left [ +\\begin{matrix} + & &\\\\ + & Empty Matrix &\\\\ + & & +\\end{1} +\\right ] +\\cdot +\\left [ +\\begin{matrix} +1 & 0 & \\Delta x \\\\ +0 & 1 & \\Delta y \\\\ +0 & 0 & 1 +\\end{1} +\\right ] +\\cdot +\\left [ +\\begin{matrix} +sx & 0 & 0\\\\ +0 & sy & 0\\\\ +0 & 0 & 1 +\\end{1} +\\right ] +$$) + +post: + +``` +Matrix m = new Matrix(); +m.reset(); +m.postScale(sx, sy); //使用post,越靠前越先执行。 +m.postTranslate(tx, ty); +``` + +用矩阵表示: + +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} + & &\\\\ + & Result Matrix &\\\\ + & & +\\end{1} +\\right ] + = +\\left [ +\\begin{matrix} +1 & 0 & \\Delta x \\\\ +0 & 1 & \\Delta y \\\\ +0 & 0 & 1 +\\end{1} +\\right ] +\\cdot +\\left [ +\\begin{matrix} +sx & 0 & 0\\\\ +0 & sy & 0\\\\ +0 & 0 & 1 +\\end{1} +\\right ] +\\cdot + \\left [ +\\begin{matrix} + & &\\\\ + & Empty Matrix &\\\\ + & & +\\end{1} +\\right ] +$$) + +**由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致两次运算结果不同。** + +

## Matrix方法表 From 561b9d6abad8412aa9990938a09cbfbfa6f085eb Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 10:28:40 +0800 Subject: [PATCH 318/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 71 ++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 7527fda1..af0b1576 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -427,9 +427,14 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY); 主要区别其实就是矩阵的乘法顺序不同,pre相当于矩阵的右乘,而post相当于矩阵的左乘,在图像处理中,越靠近右边的矩阵越先执行,所以pre操作会先执行,而post操作会后执行。 -**假设我们需要先缩放再平移:** -pre: + +**假设我们需要先缩放再平移,下面我们用不同对方式来构造这一个矩阵:** + +> +**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致两次运算结果不同。** + +#### 1.pre: ``` Matrix m = new Matrix(); @@ -475,7 +480,7 @@ sx & 0 & 0\\\\ \\right ] $$) -post: +#### 2.post: ``` Matrix m = new Matrix(); @@ -521,7 +526,65 @@ sx & 0 & 0\\\\ \\right ] $$) -**由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致两次运算结果不同。** +#### 3.混合: + +``` +Matrix m = new Matrix(); +m.reset(); +m.preScale(sx, sy); +m.postTranslate(tx, ty); +``` + +或: + +``` +Matrix m = new Matrix(); +m.reset(); +m.postTranslate(tx, ty); +m.preScale(sx, sy); +``` + +> 由于此处只有两步操作,且指定了先后,所以代码上交换并不会影响结果。 + +用矩阵表示: + +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} + & &\\\\ + & Result Matrix &\\\\ + & & +\\end{1} +\\right ] + = +\\left [ +\\begin{matrix} +1 & 0 & \\Delta x \\\\ +0 & 1 & \\Delta y \\\\ +0 & 0 & 1 +\\end{1} +\\right ] +\\cdot + \\left [ +\\begin{matrix} + & &\\\\ + & Empty Matrix &\\\\ + & & +\\end{1} +\\right ] +\\cdot +\\left [ +\\begin{matrix} +sx & 0 & 0\\\\ +0 & sy & 0\\\\ +0 & 0 & 1 +\\end{1} +\\right ] +$$) + + +**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致两次运算结果不同。**

From cb6498cd4236e9b4af210677195e9e4067c632b3 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 10:36:00 +0800 Subject: [PATCH 319/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index af0b1576..13c2d061 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -432,11 +432,13 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY); **假设我们需要先缩放再平移,下面我们用不同对方式来构造这一个矩阵:** > -**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致两次运算结果不同。** +**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致运算结果不同。
** +**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致运算结果不同。
** +**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致运算结果不同。
** -#### 1.pre: +#### 1.仅用pre: -``` +``` java Matrix m = new Matrix(); m.reset(); m.preTranslate(tx, ty); //使用pre,越靠后越先执行。 @@ -480,9 +482,9 @@ sx & 0 & 0\\\\ \\right ] $$) -#### 2.post: +#### 2.仅用post: -``` +``` java Matrix m = new Matrix(); m.reset(); m.postScale(sx, sy); //使用post,越靠前越先执行。 @@ -528,7 +530,7 @@ $$) #### 3.混合: -``` +``` java Matrix m = new Matrix(); m.reset(); m.preScale(sx, sy); @@ -537,7 +539,7 @@ m.postTranslate(tx, ty); 或: -``` +``` java Matrix m = new Matrix(); m.reset(); m.postTranslate(tx, ty); From ad91d9d6474eaa04d93037a7c89fb3b1656d814f Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 19:48:00 +0800 Subject: [PATCH 320/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 13c2d061..c7caa7f3 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -431,10 +431,12 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY); **假设我们需要先缩放再平移,下面我们用不同对方式来构造这一个矩阵:** -> -**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致运算结果不同。
** -**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致运算结果不同。
** -**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致运算结果不同。
** + +> +**注意: +* 1.由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致运算结果不同。 +* 2.请构造顺序,顺序是会影响结果的。** + #### 1.仅用pre: @@ -586,7 +588,7 @@ sx & 0 & 0\\\\ $$) -**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致两次运算结果不同。** +**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则导致运算结果不同。**

From 0a0b7014667eb2048c14a39c67604f5e7d552134 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 20:41:50 +0800 Subject: [PATCH 321/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index c7caa7f3..e430f99c 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -433,9 +433,9 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY); > -**注意: +注意: * 1.由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致运算结果不同。 -* 2.请构造顺序,顺序是会影响结果的。** +* 2.请构造顺序,顺序是会影响结果的。 #### 1.仅用pre: From c34b0e635343e5c61c8b4c806b37571686b71be5 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 21:30:28 +0800 Subject: [PATCH 322/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index e430f99c..45c8ffc6 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -425,8 +425,25 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY); ### Pre与Post的区别 -主要区别其实就是矩阵的乘法顺序不同,pre相当于矩阵的右乘,而post相当于矩阵的左乘,在图像处理中,越靠近右边的矩阵越先执行,所以pre操作会先执行,而post操作会后执行。 +主要区别其实就是矩阵的乘法顺序不同,pre相当于矩阵的右乘,而post相当于矩阵的左乘。 +以下观点存在歧义,故做删除标注: + + +在图像处理中,越靠近右边的矩阵越先执行,所以pre操作会先执行,而post操作会后执行。 + + +在实际操作中,我们每一步都会得出计算结果,但是为什么还会用存在先后的说法? 这是因为矩阵乘法规则,用一个例子说明: + +> +```java +Matrix matrix = new Matrix(); +matrix.postScale(0.5f, 0.8f); +matrix.preTranslate(1000, 1000); +Log.e(TAG, "MatrixTest:3" + matrix.toShortString()); +``` +> +在上面的操作中,如果按照正常的思路,先缩放,后平移,缩放操作执行在前,不会影响到后续的平移操作,但是执行结果却发现平移距离变成了(500, 800),这一结果是符合矩阵乘法的运算规律的,也就是说缩放操作影响到了平移操作,**相当于先执行了平移操作,然后执行的缩放操作,因此才有pre操作会先执行,而post操作会后执行这一说法**。 **假设我们需要先缩放再平移,下面我们用不同对方式来构造这一个矩阵:** From 7851036ae608c2a90144719ba3dadf3c33b357b5 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 21:33:33 +0800 Subject: [PATCH 323/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 45c8ffc6..12cbd2f1 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -433,7 +433,7 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY); 在图像处理中,越靠近右边的矩阵越先执行,所以pre操作会先执行,而post操作会后执行。 -在实际操作中,我们每一步都会得出计算结果,但是为什么还会用存在先后的说法? 这是因为矩阵乘法规则,用一个例子说明: +在实际操作中,我们每一步操作都会得出计算结果,但是为什么还会用存在先后的说法? 这是因为矩阵乘法规则,用一个例子说明: > ```java From afced6b7aad3316a3e2e4a2c7dbce0fa5ee73fe7 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 21:40:27 +0800 Subject: [PATCH 324/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 12cbd2f1..369fa2ba 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -433,7 +433,7 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY); 在图像处理中,越靠近右边的矩阵越先执行,所以pre操作会先执行,而post操作会后执行。 -在实际操作中,我们每一步操作都会得出计算结果,但是为什么还会用存在先后的说法? 这是因为矩阵乘法规则,用一个例子说明: +在实际操作中,我们每一步操作都会得出准确的计算结果,但是为什么还会用存在先后的说法? 难道真的能够用pre和post影响计算顺序? 这是因为矩阵乘法规则,用一个例子说明: > ```java @@ -443,7 +443,9 @@ matrix.preTranslate(1000, 1000); Log.e(TAG, "MatrixTest:3" + matrix.toShortString()); ``` > -在上面的操作中,如果按照正常的思路,先缩放,后平移,缩放操作执行在前,不会影响到后续的平移操作,但是执行结果却发现平移距离变成了(500, 800),这一结果是符合矩阵乘法的运算规律的,也就是说缩放操作影响到了平移操作,**相当于先执行了平移操作,然后执行的缩放操作,因此才有pre操作会先执行,而post操作会后执行这一说法**。 +在上面的操作中,如果按照正常的思路,先缩放,后平移,缩放操作执行在前,不会影响到后续的平移操作,但是执行结果却发现平移距离变成了(500, 800)。 + +> 在上面例子中,计算顺序是没有问题的,先计算的缩放,然后计算的平移,而缩放影响到平移则是因为前一步缩放后的结果矩阵右乘了平移矩阵,这是符合矩阵乘法的运算规律的,也就是说缩放操作虽然在前却影响到了平移操作,**相当于先执行了平移操作,然后执行的缩放操作,因此才有pre操作会先执行,而post操作会后执行这一说法**。 **假设我们需要先缩放再平移,下面我们用不同对方式来构造这一个矩阵:** From eb4130c0fa387fa14f5ad68662c99b55a1789620 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 2 Aug 2016 21:55:41 +0800 Subject: [PATCH 325/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 369fa2ba..044cbaf4 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -433,7 +433,7 @@ matrix.postScale(0.5f, 0.5f, pivotX, pivotY); 在图像处理中,越靠近右边的矩阵越先执行,所以pre操作会先执行,而post操作会后执行。 -在实际操作中,我们每一步操作都会得出准确的计算结果,但是为什么还会用存在先后的说法? 难道真的能够用pre和post影响计算顺序? 这是因为矩阵乘法规则,用一个例子说明: +在实际操作中,我们每一步操作都会得出准确的计算结果,但是为什么还会用存在先后的说法? 难道真的能够用pre和post影响计算顺序? 实则不然,下面我们用一个例子说明: > ```java @@ -448,13 +448,14 @@ Log.e(TAG, "MatrixTest:3" + matrix.toShortString()); > 在上面例子中,计算顺序是没有问题的,先计算的缩放,然后计算的平移,而缩放影响到平移则是因为前一步缩放后的结果矩阵右乘了平移矩阵,这是符合矩阵乘法的运算规律的,也就是说缩放操作虽然在前却影响到了平移操作,**相当于先执行了平移操作,然后执行的缩放操作,因此才有pre操作会先执行,而post操作会后执行这一说法**。 -**假设我们需要先缩放再平移,下面我们用不同对方式来构造这一个矩阵:** +### 下面我们用不同对方式来构造一个矩阵: +**假设我们需要先缩放再平移。** -> 注意: -* 1.由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则可能导致运算结果不同。 -* 2.请构造顺序,顺序是会影响结果的。 +* 1.由于矩阵乘法不满足交换律,请保证使用初始矩阵(Initial Matrix),否则可能导致运算结果不同。 +* 2.注意构造顺序,顺序是会影响结果的。 +* 3.Initial Matrix是指new出来的新矩阵,或者reset后的矩阵,是一个单位矩阵。 #### 1.仅用pre: @@ -481,7 +482,7 @@ $$ \\left [ \\begin{matrix} & &\\\\ - & Empty Matrix &\\\\ + & Initial Matrix &\\\\ & & \\end{1} \\right ] @@ -543,7 +544,7 @@ sx & 0 & 0\\\\ \\left [ \\begin{matrix} & &\\\\ - & Empty Matrix &\\\\ + & Initial Matrix &\\\\ & & \\end{1} \\right ] @@ -592,7 +593,7 @@ $$ \\left [ \\begin{matrix} & &\\\\ - & Empty Matrix &\\\\ + & Initial Matrix &\\\\ & & \\end{1} \\right ] From c4813f5096333c5c18336935b219e1f59813214a Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 3 Aug 2016 01:25:55 +0800 Subject: [PATCH 326/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index d2fbecc8..4f60b3e5 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -1 +1,18 @@ # Matrix方法 + +本篇正式讲解Matrix中各个方法的用途,以及Matrix的部分实用技巧。 + +

+## 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 | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... + From 70c3ce002f8901bc5ce7b31a8c8eb005de64cf26 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 3 Aug 2016 23:50:15 +0800 Subject: [PATCH 327/615] Add Matrix Chart --- QuickChart/Matrix.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/QuickChart/Matrix.md b/QuickChart/Matrix.md index 01bf7cb8..12738f1c 100644 --- a/QuickChart/Matrix.md +++ b/QuickChart/Matrix.md @@ -1 +1,12 @@ # 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 | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... \ No newline at end of file From 0f4c85a2a60870191861e2f15bc2434be5cab910 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 3 Aug 2016 23:52:45 +0800 Subject: [PATCH 328/615] Add Matrix Chart Index --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 607fce1f..d6edb38d 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ * [Canvas常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Canvas.md) * [Path常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Path.md) +* [Matrix常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Matrix.md) * [贝塞尔曲线常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Bezier.md) ****** From 28c166e4d30e195b4ee5d136657555ce7d510bfd Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 4 Aug 2016 01:39:54 +0800 Subject: [PATCH 329/615] Add Title --- CustomView/Advance/[10]Matrix_Method.md | 28 +++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 4f60b3e5..3ac9a615 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -1,9 +1,14 @@ # Matrix方法 -本篇正式讲解Matrix中各个方法的用途,以及Matrix的部分实用技巧。 + +## 前言 + +在上一篇文章中,我们对Matrix做了一个简单的了解,偏向理论,在本文中则会详细的讲解Matrix的具体用法,以及Matrix的一些实用技巧。

-## Matrix 方法表 +## Matrix方法表 + +按照惯例,先放方法表做概览。 方法类别 | 相关API | 摘要 -----------|---------------------------------------------------------|------------------------ @@ -16,3 +21,22 @@ 特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... + +## Matrix方法详解 + +### 基本方法 + +### 数值操作 + +### 数值计算 + +### set pre 与 post + +### 特殊方法 + +### 矩阵相关 + +## Matrix实用技巧 + + + From 8ae592b9ef54b94553c42581a554f2a63c2a2ada Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 4 Aug 2016 02:42:03 +0800 Subject: [PATCH 330/615] Add Course of PlantUML(Mac) --- Course/HowToUsePlantUMLInAS(Mac).md | 78 +++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 Course/HowToUsePlantUMLInAS(Mac).md diff --git a/Course/HowToUsePlantUMLInAS(Mac).md b/Course/HowToUsePlantUMLInAS(Mac).md new file mode 100644 index 00000000..946389d3 --- /dev/null +++ b/Course/HowToUsePlantUMLInAS(Mac).md @@ -0,0 +1,78 @@ +# 在AndroidStudio中使用PlantUML(Mac) + +### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) + +## 前言 + +### 这是Mac平台设置教程,Windows平台戳这里:[在AndroidStudio中使用PlantUML(Windows)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/HowToUsePlantUMLInAS.md) + +**Unified Modeling Language (UML)又称统一建模语言或标准建模语言,用来描述 类(对象的)、对象、关联、职责、行为、接口、用例、包、顺序、协作,以及状态。是用来帮助自己理清众多类之间复杂关系的不二利器,也能帮助别人快速理解你的设计思路。** + +那么,我们怎么在AndroidStudio中创建自己的UML类图呢?接下来我就教大家如何用正确的姿势创建UML类图。 + +## 一.用正确的姿势安装panltUML插件 +### 1.File->Settings->Plugins->Browse repositories +![这里写图片描述](http://img.blog.csdn.net/20151130192101011) +### 2.在搜索框输入plantUML +![这里写图片描述](http://img.blog.csdn.net/20151130192547549) +### 3.导入插件 +#### (ps:由于我已经安装过了,所以没有Install plugin 按钮,未安装的都有这样一个按钮,如下,点击安装即可。) +![这里写图片描述](http://img.blog.csdn.net/20151130192907006) + +#### 如果以上步骤正确的完成,重启AndroidStudio 右键->new 的时候你会发现多了这么一堆东西,如果出现了这些说明plantUML已经正确的安装了。 +![这里写图片描述](http://img.blog.csdn.net/20151130193249965) + +#### 当然了,所有事情都不会是一帆风顺的,当你迫不及待的想创建一个文件试试的时候你会发现下面的情况。 +![这里写图片描述](http://img.blog.csdn.net/20151130193752721) +#### 想必此时你的内心一定和我当时一样,一万头草泥马奔腾而过,这都是什么东西!!! +#### 一切事情都是有原因的,而这个因为你还缺少一个必要的东西,就是大名鼎鼎的贝尔实验室开发的一个工具包:Graphviz。 +## 二,用正确的姿势安装Graphviz + +此处建议使用Homebrew自动下载安装,如果你还没有用过Homebrew来帮助你管理软件,参考这里: [Homebrew&HomebrewCask](https://github.com/GcsSloop/MacDeveloper/blob/master/Tools/Homebrew.md) + +安装好homebrew后直接输入如下命令,按下回车后等待片刻即可安装成功: + +``` +brew install graphviz +``` + +安装完成后,Homebrew会告诉你安装位置,请记好这个位置,你也可以用info命名查看安装位置: + +``` +brew info graphviz +``` + +我的安装位置在 `/usr/local/Cellar/graphviz/2.38.0` + +![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f6h4le3ao7j30fu0a6gol.jpg) + + +## 三.用正确的姿势设置plantUML + +### 1.点击右上角的设置按钮或进入File->Settings->Other Settings ->PlantUML或者在预览页面点击右上角的设置图标,如下: + +### 2.将文件路径填写为刚刚Graphviz的目录下bin目录中dot文件。 + +#### (我的为:/usr/local/Cellar/graphviz/2.38.0/bin/dot) + + +![](http://ww3.sinaimg.cn/large/005Xtdi2gw1f6h4mbnnhsj30te0g676i.jpg) + +### 3.点击OK 刷新一下界面就能看到结果了。 + +#### 讲到这里,就已经安装完成了,可以愉快的用代码来书写UML图了。 + +#### 什么?你说你还不会书写的语法?没关系,其实我也不会,不过我有一个好的教程推荐给你,相信你看完就明白啦。 + +## 四.用正确的姿势学习使用UML +### 1.[【PlantUML快速指南戳这里】](http://archive.3zso.com/archives/plantuml-quickstart.html) +### 2.注意,这个教程中的语法和AndroidStudio中基本一致,区别就是开始和结束标志不同。 + +####好了,到这里该教程正式结束,祝各位小伙伴能愉快的使用plantUML玩耍。 + +## About Me +### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) + + + + From c56db91ee610ab1f56cb847db6d804dd9c351379 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 4 Aug 2016 02:46:57 +0800 Subject: [PATCH 331/615] Update --- Course/HowToUsePlantUMLInAS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Course/HowToUsePlantUMLInAS.md b/Course/HowToUsePlantUMLInAS.md index baa7809a..eeaccbf0 100644 --- a/Course/HowToUsePlantUMLInAS.md +++ b/Course/HowToUsePlantUMLInAS.md @@ -4,6 +4,8 @@ ## 前言 +### 这是Windows平台设置教程,Mac平台戳这里:在AndroidStudio中使用PlantUML(Mac) + **Unified Modeling Language (UML)又称统一建模语言或标准建模语言,用来描述 类(对象的)、对象、关联、职责、行为、接口、用例、包、顺序、协作,以及状态。是用来帮助自己理清众多类之间复杂关系的不二利器,也能帮助别人快速理解你的设计思路。** 那么,我们怎么在AndroidStudio中创建自己的UML类图呢?接下来我就教大家如何用正确的姿势创建UML类图。 From 825a315091101d986f4cbdce82a1674c0ade14c7 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 4 Aug 2016 03:00:50 +0800 Subject: [PATCH 332/615] Update --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d6edb38d..8caedcf2 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,8 @@ ## [教程类](https://github.com/GcsSloop/AndroidNote/tree/master/Course/README.md) -* [在AndroidStudio中使用PlantUML](https://github.com/GcsSloop/AndroidNote/blob/master/Course/HowToUsePlantUMLInAS.md) +* [在AndroidStudio中使用PlantUML(Win)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/HowToUsePlantUMLInAS.md) +* [在AndroidStudio中使用PlantUML(Mac)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/HowToUsePlantUMLInAS(Mac).md) * [优雅的发布Android开源库(论JitPack的优越性)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/ReleaseLibraryByJitPack.md) ****** From d10398a5b60afb2ecf966a8c9bfca765418a5d93 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 4 Aug 2016 03:11:19 +0800 Subject: [PATCH 333/615] Update Course Index --- Course/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Course/README.md b/Course/README.md index 67b44aba..c7546a08 100644 --- a/Course/README.md +++ b/Course/README.md @@ -1,6 +1,8 @@ # 教程类 -**教程类** | -:---: | - | - | + +

+ + + +

From f769d6a059eddd26fac83311d5d362fac5122301 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 4 Aug 2016 03:13:48 +0800 Subject: [PATCH 334/615] Update --- ...{HowToUsePlantUMLInAS(Mac).md => HowToUsePlantUMLInAS[Mac].md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Course/{HowToUsePlantUMLInAS(Mac).md => HowToUsePlantUMLInAS[Mac].md} (100%) diff --git a/Course/HowToUsePlantUMLInAS(Mac).md b/Course/HowToUsePlantUMLInAS[Mac].md similarity index 100% rename from Course/HowToUsePlantUMLInAS(Mac).md rename to Course/HowToUsePlantUMLInAS[Mac].md From 5f98ea4e9269e96bd2f885d6e92090d65b8db0c0 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 4 Aug 2016 03:37:50 +0800 Subject: [PATCH 335/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8caedcf2..19e33b42 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ ## [教程类](https://github.com/GcsSloop/AndroidNote/tree/master/Course/README.md) * [在AndroidStudio中使用PlantUML(Win)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/HowToUsePlantUMLInAS.md) -* [在AndroidStudio中使用PlantUML(Mac)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/HowToUsePlantUMLInAS(Mac).md) +* [在AndroidStudio中使用PlantUML(Mac)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/HowToUsePlantUMLInAS%5BMac%5D.md) * [优雅的发布Android开源库(论JitPack的优越性)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/ReleaseLibraryByJitPack.md) ****** From c36947ff97b3a00ce38557cca4b3974d1fde8a8e Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 4 Aug 2016 03:38:24 +0800 Subject: [PATCH 336/615] Update --- Course/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Course/README.md b/Course/README.md index c7546a08..b9fd97f3 100644 --- a/Course/README.md +++ b/Course/README.md @@ -3,6 +3,6 @@

- +

From 79385efd5c8ea57535c883ffe046be95a0b575ac Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 5 Aug 2016 00:42:25 +0800 Subject: [PATCH 337/615] Add Code Source --- CustomView/Advance/Code/SearchView.java | 244 ++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 CustomView/Advance/Code/SearchView.java diff --git a/CustomView/Advance/Code/SearchView.java b/CustomView/Advance/Code/SearchView.java new file mode 100644 index 00000000..8f3a3a23 --- /dev/null +++ b/CustomView/Advance/Code/SearchView.java @@ -0,0 +1,244 @@ +/** + * Author: GcsSloop + *

+ * Created Date: 16/5/31 + *

+ * Copyright (C) 2016 GcsSloop. + *

+ * GitHub: https://github.com/GcsSloop + */ +public class SearchView extends View { + + // 画笔 + private Paint mPaint; + + // View 宽高 + private int mViewWidth; + private int mViewHeight; + + // 这个视图拥有的状态 + public static enum State { + NONE, + STARTING, + SEARCHING, + ENDING + } + + // 当前的状态(非常重要) + private State mCurrentState = State.NONE; + + // 放大镜与外部圆环 + private Path path_srarch; + private Path path_circle; + + // 测量Path 并截取部分的工具 + private PathMeasure mMeasure; + + // 默认的动效周期 2s + private int defaultDuration = 2000; + + // 控制各个过程的动画 + private ValueAnimator mStartingAnimator; + private ValueAnimator mSearchingAnimator; + private ValueAnimator mEndingAnimator; + + // 动画数值(用于控制动画状态,因为同一时间内只允许有一种状态出现,具体数值处理取决于当前状态) + private float mAnimatorValue = 0; + + // 动效过程监听器 + private ValueAnimator.AnimatorUpdateListener mUpdateListener; + private Animator.AnimatorListener mAnimatorListener; + + // 用于控制动画状态转换 + private Handler mAnimatorHandler; + + // 判断是否已经搜索结束 + private boolean isOver = false; + + private int count = 0; + + public SearchView(Context context) { + super(context); + + initPaint(); + + initPath(); + + initListener(); + + initHandler(); + + initAnimator(); + + // 进入开始动画 + mCurrentState = State.STARTING; + mStartingAnimator.start(); + + } + + private void initPaint() { + mPaint = new Paint(); + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setColor(Color.WHITE); + mPaint.setStrokeWidth(15); + mPaint.setStrokeCap(Paint.Cap.ROUND); + mPaint.setAntiAlias(true); + } + + private void initPath() { + path_srarch = new Path(); + path_circle = new Path(); + + mMeasure = new PathMeasure(); + + // 注意,不要到360度,否则内部会自动优化,测量不能取到需要的数值 + RectF oval1 = new RectF(-50, -50, 50, 50); // 放大镜圆环 + path_srarch.addArc(oval1, 45, 359.9f); + + RectF oval2 = new RectF(-100, -100, 100, 100); // 外部圆环 + path_circle.addArc(oval2, 45, -359.9f); + + float[] pos = new float[2]; + + mMeasure.setPath(path_circle, false); // 放大镜把手的位置 + mMeasure.getPosTan(0, pos, null); + + path_srarch.lineTo(pos[0], pos[1]); // 放大镜把手 + + Log.i("TAG", "pos=" + pos[0] + ":" + pos[1]); + } + + private void initListener() { + mUpdateListener = new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + mAnimatorValue = (float) animation.getAnimatedValue(); + invalidate(); + } + }; + + mAnimatorListener = new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + + } + + @Override + public void onAnimationEnd(Animator animation) { + // getHandle发消息通知动画状态更新 + mAnimatorHandler.sendEmptyMessage(0); + } + + @Override + public void onAnimationCancel(Animator animation) { + + } + + @Override + public void onAnimationRepeat(Animator animation) { + + } + }; + } + + private void initHandler() { + mAnimatorHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + switch (mCurrentState) { + case STARTING: + // 从开始动画转换好搜索动画 + isOver = false; + mCurrentState = State.SEARCHING; + mStartingAnimator.removeAllListeners(); + mSearchingAnimator.start(); + break; + case SEARCHING: + if (!isOver) { // 如果搜索未结束 则继续执行搜索动画 + mSearchingAnimator.start(); + Log.e("Update", "RESTART"); + + count++; + if (count>2){ // count大于2则进入结束状态 + isOver = true; + } + } else { // 如果搜索已经结束 则进入结束动画 + mCurrentState = State.ENDING; + mEndingAnimator.start(); + } + break; + case ENDING: + // 从结束动画转变为无状态 + mCurrentState = State.NONE; + break; + } + } + }; + } + + private void initAnimator() { + mStartingAnimator = ValueAnimator.ofFloat(0, 1).setDuration(defaultDuration); + mSearchingAnimator = ValueAnimator.ofFloat(0, 1).setDuration(defaultDuration); + mEndingAnimator = ValueAnimator.ofFloat(1, 0).setDuration(defaultDuration); + + mStartingAnimator.addUpdateListener(mUpdateListener); + mSearchingAnimator.addUpdateListener(mUpdateListener); + mEndingAnimator.addUpdateListener(mUpdateListener); + + mStartingAnimator.addListener(mAnimatorListener); + mSearchingAnimator.addListener(mAnimatorListener); + mEndingAnimator.addListener(mAnimatorListener); + } + + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mViewWidth = w; + mViewHeight = h; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + drawSearch(canvas); + } + + private void drawSearch(Canvas canvas) { + + mPaint.setColor(Color.WHITE); + + + canvas.translate(mViewWidth / 2, mViewHeight / 2); + + canvas.drawColor(Color.parseColor("#0082D7")); + + switch (mCurrentState) { + case NONE: + canvas.drawPath(path_srarch, mPaint); + break; + case STARTING: + mMeasure.setPath(path_srarch, false); + Path dst = new Path(); + mMeasure.getSegment(mMeasure.getLength() * mAnimatorValue, mMeasure.getLength(), dst, true); + canvas.drawPath(dst, mPaint); + break; + case SEARCHING: + mMeasure.setPath(path_circle, false); + Path dst2 = new Path(); + float stop = mMeasure.getLength() * mAnimatorValue; + float start = (float) (stop - ((0.5 - Math.abs(mAnimatorValue - 0.5)) * 200f)); + mMeasure.getSegment(start, stop, dst2, true); + canvas.drawPath(dst2, mPaint); + break; + case ENDING: + mMeasure.setPath(path_srarch, false); + Path dst3 = new Path(); + mMeasure.getSegment(mMeasure.getLength() * mAnimatorValue, mMeasure.getLength(), dst3, true); + canvas.drawPath(dst3, mPaint); + break; + } + } +} From 8f4cb78c9b9622fa80fd04c4dcc7619ad40a9b3a Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 5 Aug 2016 22:40:13 +0800 Subject: [PATCH 338/615] Add Basic Method --- CustomView/Advance/[10]Matrix_Method.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 3ac9a615..7a12d652 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -26,6 +26,16 @@ ### 基本方法 +基本方法没有什么内容,在此处简单介绍一下。 + +方法 | 简介 +---|--- +equals | 比较两个Matrix的数值是否相同 +hashCode | 获取Matrix的哈希值 +toString | 将Matrix转换为字符串
`Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}` +toShortString | 将Matrix转换为短字符串
`[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]` + + ### 数值操作 ### 数值计算 From aeaac3304e4569c8ada444dd3f0b5bed7474bf66 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 5 Aug 2016 22:41:34 +0800 Subject: [PATCH 339/615] Update Basic Method --- CustomView/Advance/[10]Matrix_Method.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 7a12d652..bcaa18d3 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -26,7 +26,7 @@ ### 基本方法 -基本方法没有什么内容,在此处简单介绍一下。 +基本方法内容比较简单,在此处简要介绍一下。 方法 | 简介 ---|--- From f7a57c3b704df41e07338e010511919f0d1b1334 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 6 Aug 2016 01:32:59 +0800 Subject: [PATCH 340/615] Add constructor method --- CustomView/Advance/[10]Matrix_Method.md | 45 +++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index bcaa18d3..8d77f408 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -24,6 +24,50 @@ ## Matrix方法详解 +### 构造方法 + +构造方法没有在上面表格中列出。 + +**无参构造** + +``` +Matrix () +``` +创建一个全新的Matrix,使用格式如下: + +``` +Matrix matrix = new Matrix(); +``` + +通过这种方式创建出来的并不是一个数值全部为空的矩阵,而是一个单位矩阵,如下: + +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} +1 & 0 & 0 \\\\ +0 & 1 & 0 \\\\ +0 & 0 & 1 +\\end{1} +\\right ] +$$) + + +**有参构造** + +``` +Matrix (Matrix src) +``` + +这种方法则需要一个已经存在的矩阵作为参数,如下: + +``` +Matrix matrix = new Matrix(src); +``` + +创建一个Matrix,并对src深拷贝(理解为新的matrix和src是两个对象,但内部数值相同即可)。 + + ### 基本方法 基本方法内容比较简单,在此处简要介绍一下。 @@ -38,6 +82,7 @@ toShortString | 将Matrix转换为短字符串
`[1.0, 0.0, 0.0][0.0, 1.0, 0. ### 数值操作 + ### 数值计算 ### set pre 与 post From 13ab0fcd9a3a9a888bcf59e9d7f222ffea9cc240 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 6 Aug 2016 02:13:49 +0800 Subject: [PATCH 341/615] Add value method --- CustomView/Advance/[10]Matrix_Method.md | 54 ++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 8d77f408..e8a87305 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -72,16 +72,58 @@ Matrix matrix = new Matrix(src); 基本方法内容比较简单,在此处简要介绍一下。 -方法 | 简介 ----|--- -equals | 比较两个Matrix的数值是否相同 -hashCode | 获取Matrix的哈希值 -toString | 将Matrix转换为字符串
`Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}` -toShortString | 将Matrix转换为短字符串
`[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]` +**1.equals** + +比较两个Matrix的数值是否相同。 + +**2.hashCode** + +获取Matrix的哈希值。 + +**3.toString** + +将Matrix转换为字符串: `Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}` + +**4.toShortString** + +将Matrix转换为短字符串: `[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]` ### 数值操作 +数值操作这一组方法可以帮助我们直接控制Matrix里面的数值。 + +**1.set** + +``` +void set (Matrix src) +``` + +没有返回值,有一个参数,作用是将参数Matrix的数值复制到当前Matrix中。如果参数为空,则重置当前Matrix,相当于`reset()`。 + +**2.reset** + +``` +void reset () +``` + +重置当前Matrix(将当前Matrix重置为单位矩阵)。 + +**3.setValues** + +``` +void setValues (float[] values) +``` + +setValues的参数是浮点型的一维数组,长度需要大于9,拷贝数组中的前9位数值赋值给当前Matrix。 + +**4.getValues** + +``` +void getValues (float[] values) +``` + +很显然,getValues和setValues是一对方法,参数也是浮点型的一维数组,长度需要大于9,将Matrix中的数值拷贝进参数的前9位中。 ### 数值计算 From 39a7ff5ce877165002a992fba986171c461cbb55 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 7 Aug 2016 02:57:40 +0800 Subject: [PATCH 342/615] Add value compute --- CustomView/Advance/[10]Matrix_Method.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index e8a87305..a995ade2 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -59,7 +59,7 @@ $$) Matrix (Matrix src) ``` -这种方法则需要一个已经存在的矩阵作为参数,如下: +这种方法则需要一个已经存在的矩阵作为参数,使用格式如下: ``` Matrix matrix = new Matrix(src); @@ -127,6 +127,22 @@ void getValues (float[] values) ### 数值计算 +**1.mapPoints** + +``` + +``` + +**2.mapRadius** + + + +**3.mapRect** + + + +**4.mapVectors** + ### set pre 与 post ### 特殊方法 From e450e90f849ce636a2b8e686211bdecad93720e6 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 7 Aug 2016 11:58:49 +0800 Subject: [PATCH 343/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index a995ade2..d84f13b3 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -130,9 +130,22 @@ void getValues (float[] values) **1.mapPoints** ``` +void mapPoints (float[] pts) +void mapPoints (float[] dst, float[] src) + +void mapPoints (float[] dst, int dstIndex,float[] src, int srcIndex, int pointCount) ``` +计算一组点基于当前Matrix变换后的位置,(由于是计算点,所以参数中的float数组长度一般都是偶数的)。 + +它有三个重载方法: + + + + + + **2.mapRadius** From b029bfa5eedc8d8464f83bd2680c16a2c6acedab Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 8 Aug 2016 04:55:52 +0800 Subject: [PATCH 344/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index d84f13b3..00106437 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -141,9 +141,11 @@ void mapPoints (float[] dst, int dstIndex,float[] src, int srcIndex, int pointCo 它有三个重载方法: +(1) `void mapPoints (float[] pts)` 方法仅有一个参数,pts数组作为参数传递原始数值,计算结果仍存放在pts中。 +(2) `void mapPoints (float[] dst, float[] src)` ,src作为参数传递原始数值,计算结果存放在dst中。 - +(3) `void mapPoints (float[] dst, int dstIndex,float[] src, int srcIndex, int pointCount)` 可以指定只计算一部分数值。 **2.mapRadius** From a3d1b1e12311c92c7ac9c18c5bacada6e94c5b95 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 8 Aug 2016 10:54:42 +0800 Subject: [PATCH 345/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 00106437..cf39d65a 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -143,8 +143,40 @@ void mapPoints (float[] dst, int dstIndex,float[] src, int srcIndex, int pointCo (1) `void mapPoints (float[] pts)` 方法仅有一个参数,pts数组作为参数传递原始数值,计算结果仍存放在pts中。 +示例: + +``` java + + // 初始数据为三个点 (0, 0) (80, 100) (400, 300) + float[] pts = new float[]{0, 0, 80, 100, 400, 300}; + + // 构造一个matrix,x坐标缩放0.5 + Matrix matrix = new Matrix(); + matrix.setScale(0.5f, 1f); + + // 输出pts计算之前数据 + Log.i(TAG, "before: "+ Arrays.toString(pts)); + + // 调用map方法计算 + matrix.mapPoints(pts); + + // 输出pts计算之后数据 + Log.i(TAG, "after : "+ Arrays.toString(pts)); +``` + +结果: + +``` +before: [0.0, 0.0, 80.0, 100.0, 400.0, 300.0] +after : [0.0, 0.0, 40.0, 100.0, 200.0, 300.0] +``` + (2) `void mapPoints (float[] dst, float[] src)` ,src作为参数传递原始数值,计算结果存放在dst中。 +``` +``` + + (3) `void mapPoints (float[] dst, int dstIndex,float[] src, int srcIndex, int pointCount)` 可以指定只计算一部分数值。 From d8e8d9eb56e970aad305be71cacf1769defdf756 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 8 Aug 2016 11:18:07 +0800 Subject: [PATCH 346/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 47 +++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index cf39d65a..b290034d 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -137,7 +137,7 @@ void mapPoints (float[] dst, float[] src) void mapPoints (float[] dst, int dstIndex,float[] src, int srcIndex, int pointCount) ``` -计算一组点基于当前Matrix变换后的位置,(由于是计算点,所以参数中的float数组长度一般都是偶数的)。 +计算一组点基于当前Matrix变换后的位置,(由于是计算点,所以参数中的float数组长度一般都是偶数的,若为奇数,则最后一个数值不参与计算)。 它有三个重载方法: @@ -171,14 +171,55 @@ before: [0.0, 0.0, 80.0, 100.0, 400.0, 300.0] after : [0.0, 0.0, 40.0, 100.0, 200.0, 300.0] ``` -(2) `void mapPoints (float[] dst, float[] src)` ,src作为参数传递原始数值,计算结果存放在dst中。 +(2) `void mapPoints (float[] dst, float[] src)` ,src作为参数传递原始数值,计算结果存放在dst中,src不变。 -``` +如果原始数据需要保留则一般使用这种方法。 + +示例: + +``` java + // 初始数据为三个点 (0, 0) (80, 100) (400, 300) + float[] src = new float[]{0, 0, 80, 100, 400, 300}; + float[] dst = new float[6]; + + // 构造一个matrix,x坐标缩放0.5 + Matrix matrix = new Matrix(); + matrix.setScale(0.5f, 1f); + + // 输出计算之前数据 + Log.i(TAG, "before: src="+ Arrays.toString(src)); + Log.i(TAG, "before: dst="+ Arrays.toString(dst)); + + // 调用map方法计算 + matrix.mapPoints(dst,src); + + // 输出计算之后数据 + Log.i(TAG, "after : src="+ Arrays.toString(src)); + Log.i(TAG, "after : dst="+ Arrays.toString(dst)); ``` +结果: + +``` +before: src=[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 mapPoints (float[] dst, int dstIndex,float[] src, int srcIndex, int pointCount)` 可以指定只计算一部分数值。 +示例: + +``` java + +``` + +结果: + +``` + +``` **2.mapRadius** From 0eb83b878a304ba7c50dac9ff73c085ee9931ed4 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 9 Aug 2016 00:19:12 +0800 Subject: [PATCH 347/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index b290034d..bc5094c5 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -209,6 +209,15 @@ after : dst=[0.0, 0.0, 40.0, 100.0, 200.0, 300.0] (3) `void mapPoints (float[] dst, int dstIndex,float[] src, int srcIndex, int pointCount)` 可以指定只计算一部分数值。 +参数 | 摘要 +---|--- +dst | 目标数据 +dstIndex | 目标数据存储位置起始下标 +src | 源数据 +srcIndex | 源数据存储位置起始下标 +pointCount | 计算的点个数 + + 示例: ``` java From e059189b07584834696cf4847f23cd33db571a87 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 9 Aug 2016 01:26:13 +0800 Subject: [PATCH 348/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 26 ++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index bc5094c5..3fcc2ae4 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -220,13 +220,37 @@ pointCount | 计算的点个数 示例: -``` java +> +将第二、三个点计算后存储进dst最开始位置。 +``` java + // 初始数据为三个点 (0, 0) (80, 100) (400, 300) + float[] src = new float[]{0, 0, 80, 100, 400, 300}; + float[] dst = new float[6]; + + // 构造一个matrix,x坐标缩放0.5 + Matrix matrix = new Matrix(); + matrix.setScale(0.5f, 1f); + + // 输出计算之前数据 + Log.i(TAG, "before: src="+ Arrays.toString(src)); + Log.i(TAG, "before: dst="+ Arrays.toString(dst)); + + // 调用map方法计算 + matrix.mapPoints(dst, 0, src, 2, 2); + + // 输出计算之后数据 + Log.i(TAG, "after : src="+ Arrays.toString(src)); + Log.i(TAG, "after : dst="+ Arrays.toString(dst)); ``` 结果: ``` +before: src=[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] ``` From bb09904f2717558264885b142c07f388eedc8180 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 9 Aug 2016 01:27:50 +0800 Subject: [PATCH 349/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 3fcc2ae4..be84b4d3 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -236,7 +236,7 @@ pointCount | 计算的点个数 Log.i(TAG, "before: src="+ Arrays.toString(src)); Log.i(TAG, "before: dst="+ Arrays.toString(dst)); - // 调用map方法计算 + // 调用map方法计算(最后一个2表示两个点,并非两个数值) matrix.mapPoints(dst, 0, src, 2, 2); // 输出计算之后数据 From cade19ee89d11239fd779b280b75fd4b7713fc1e Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 9 Aug 2016 01:29:06 +0800 Subject: [PATCH 350/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index be84b4d3..f2bb5a99 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -236,7 +236,7 @@ pointCount | 计算的点个数 Log.i(TAG, "before: src="+ Arrays.toString(src)); Log.i(TAG, "before: dst="+ Arrays.toString(dst)); - // 调用map方法计算(最后一个2表示两个点,并非两个数值) + // 调用map方法计算(最后一个2表示两个点,即四个数值,并非两个数值) matrix.mapPoints(dst, 0, src, 2, 2); // 输出计算之后数据 @@ -251,7 +251,6 @@ before: src=[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.mapRadius** From a60b674cef6668a2f270025bf63c547a0bd91590 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 10 Aug 2016 02:23:38 +0800 Subject: [PATCH 351/615] Update canvas chart --- QuickChart/Canvas.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QuickChart/Canvas.md b/QuickChart/Canvas.md index 066f0967..edc90448 100644 --- a/QuickChart/Canvas.md +++ b/QuickChart/Canvas.md @@ -6,9 +6,9 @@ 绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧
**相关链接 :**
[【Canvas-颜色与基本形状】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md) 绘制图片 | drawBitmap, drawPicture | 绘制位图和图片
**相关链接:**
[【Canvas-图片文字】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) 绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字
**相关链接:**
[【Canvas-图片文字】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) -绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数
**相关链接:**
[【Path-基本操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md)
[【Path-贝塞尔曲线】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md)
[【Path-完结篇(伪)】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) +绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数
**相关链接:**
[【Path-基本操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md)
[【Path-贝塞尔曲线】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md)
[【Path-完结篇(伪)】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md)
[【Path-Path玩出花样(PathMeasure)】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B08%5DPath_Play.md) 顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 画布剪裁 | clipPath, clipRect | 设置画布的显示区域 画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 会滚到指定状态、 获取保存次数
**相关链接:**
[【Canvas-画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切
**相关链接:**
[【基础-坐标系】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md)
[【基础-角度弧度】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B2%5DAngleAndRadian.md)
[【Canvas-画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) -Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放等操作的都是图像矩阵Matrix,只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 +Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放等操作的都是图像矩阵Matrix,只不过Matrix比较难以理解和使用,故封装了一些常用的方法。
[【Matrix-原理】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B09%5DMatrix_Basic.md) From 66b3b5a9f37de4e6c1c52e3cf09bf3e510e43f76 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 10 Aug 2016 02:25:03 +0800 Subject: [PATCH 352/615] Update matrix chart --- QuickChart/Matrix.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/QuickChart/Matrix.md b/QuickChart/Matrix.md index 12738f1c..4d7742a2 100644 --- a/QuickChart/Matrix.md +++ b/QuickChart/Matrix.md @@ -9,4 +9,8 @@ 前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘变换 后乘(post) | postConcat postRotate postScale postSkew postTranslate | 后乘变换 特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 -矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... \ No newline at end of file +矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... + +## 相关文章 + +* [Matrix原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B09%5DMatrix_Basic.md) From 02495513f96050755282ba6fece3db37d00dd16e Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 10 Aug 2016 02:26:57 +0800 Subject: [PATCH 353/615] Update chart index --- QuickChart/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/QuickChart/README.md b/QuickChart/README.md index 77d6afb4..50800265 100644 --- a/QuickChart/README.md +++ b/QuickChart/README.md @@ -1,7 +1,7 @@ # 速查表 -序号 | 内容 -:---:|--------------- - 01 | [Canvas常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Canvas.md) - 02 | [Path常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Path.md) - 03 | [贝塞尔曲线常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Bezier.md) + +* [Canvas常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Canvas.md) +* [Path常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Path.md) +* [Matrix常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Matrix.md) +* [贝塞尔曲线常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Bezier.md) From 0044e5ed94bf2cd1b4916b436ff2fe445d5b6ccf Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 10 Aug 2016 11:23:19 +0800 Subject: [PATCH 354/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index f2bb5a99..8b851202 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -255,10 +255,36 @@ after : dst=[40.0, 100.0, 200.0, 300.0, 0.0, 0.0] **2.mapRadius** +测量半径,此处测量的是平均半径。 + +示例: + +``` + 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 +``` **3.mapRect** +测量矩形变换后位置。 **4.mapVectors** From 3ada722f75372ee0a47c6dd10eb384b89e5633f5 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 11 Aug 2016 19:01:21 +0800 Subject: [PATCH 355/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 8b851202..e56b8c8a 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -209,8 +209,8 @@ after : dst=[0.0, 0.0, 40.0, 100.0, 200.0, 300.0] (3) `void mapPoints (float[] dst, int dstIndex,float[] src, int srcIndex, int pointCount)` 可以指定只计算一部分数值。 -参数 | 摘要 ----|--- +参数 | 摘要 +-----------|--- dst | 目标数据 dstIndex | 目标数据存储位置起始下标 src | 源数据 @@ -255,7 +255,7 @@ after : dst=[40.0, 100.0, 200.0, 300.0, 0.0, 0.0] **2.mapRadius** -测量半径,此处测量的是平均半径。 +测量半径,由于圆可能会因为画布变换变成椭圆,所以此处测量的是平均半径。 示例: From b4c34c278fd386cccc0e3ddc578d7da9d1839687 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 11 Aug 2016 20:55:53 +0800 Subject: [PATCH 356/615] Fix code view --- CustomView/Advance/[10]Matrix_Method.md | 27 ++++++++++++++++--------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index e56b8c8a..eb819b2c 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -30,12 +30,12 @@ **无参构造** -``` +``` java Matrix () ``` 创建一个全新的Matrix,使用格式如下: -``` +``` java Matrix matrix = new Matrix(); ``` @@ -55,13 +55,13 @@ $$) **有参构造** -``` +``` java Matrix (Matrix src) ``` 这种方法则需要一个已经存在的矩阵作为参数,使用格式如下: -``` +``` java Matrix matrix = new Matrix(src); ``` @@ -95,7 +95,7 @@ Matrix matrix = new Matrix(src); **1.set** -``` +``` java void set (Matrix src) ``` @@ -103,7 +103,7 @@ void set (Matrix src) **2.reset** -``` +``` java void reset () ``` @@ -111,7 +111,7 @@ void reset () **3.setValues** -``` +``` java void setValues (float[] values) ``` @@ -119,7 +119,7 @@ setValues的参数是浮点型的一维数组,长度需要大于9,拷贝数 **4.getValues** -``` +``` java void getValues (float[] values) ``` @@ -129,7 +129,7 @@ void getValues (float[] values) **1.mapPoints** -``` +``` java void mapPoints (float[] pts) void mapPoints (float[] dst, float[] src) @@ -255,11 +255,15 @@ after : dst=[40.0, 100.0, 200.0, 300.0, 0.0, 0.0] **2.mapRadius** +``` java +float mapRadius (float radius) +``` + 测量半径,由于圆可能会因为画布变换变成椭圆,所以此处测量的是平均半径。 示例: -``` +``` java float radius = 100; float result = 0; @@ -284,6 +288,9 @@ mapRadius: 70.71068 **3.mapRect** +``` java +``` + 测量矩形变换后位置。 From 32ae474803883f4ad05d6d2e5eea1f4532f5bf07 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 12 Aug 2016 19:24:01 +0800 Subject: [PATCH 357/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index eb819b2c..727ebaa0 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -289,6 +289,17 @@ mapRadius: 70.71068 **3.mapRect** ``` java + RectF rect = new RectF(400, 400, 1000, 800); + + // 构造一个matrix,x坐标缩放0.5 + Matrix matrix = new Matrix(); + matrix.setScale(0.5f, 1f); + + Log.i(TAG, "mapRadius: "+rect.toString()); + + matrix.mapRect(rect); + + Log.i(TAG, "mapRadius: "+rect.toString()); ``` 测量矩形变换后位置。 From 60ddd57d379bf5f50515bc70c87d0c3562477b00 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 12 Aug 2016 22:01:01 +0800 Subject: [PATCH 358/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 727ebaa0..74457a1d 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -288,6 +288,18 @@ mapRadius: 70.71068 **3.mapRect** +``` +boolean mapRect (RectF rect) + +boolean mapRect (RectF dst, RectF src) +``` + +测量矩形变换后位置。 + +(1) `boolean mapRect (RectF rect)` 测量rect并将测量结果放入rect中,返回值是判断矩形(Rect)变换后是否仍为矩形。 + +示例: + ``` java RectF rect = new RectF(400, 400, 1000, 800); @@ -302,7 +314,12 @@ mapRadius: 70.71068 Log.i(TAG, "mapRadius: "+rect.toString()); ``` -测量矩形变换后位置。 +结果: + +``` +RectF(400.0, 400.0, 1000.0, 800.0) +RectF(200.0, 400.0, 500.0, 800.0) +``` **4.mapVectors** From acce0bc6f8bb86c2b53ee13a2b49098dd4c6817c Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 12 Aug 2016 22:07:56 +0800 Subject: [PATCH 359/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 34 +++++++++++++++---------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 74457a1d..06160a8c 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -296,31 +296,37 @@ boolean mapRect (RectF dst, RectF src) 测量矩形变换后位置。 -(1) `boolean mapRect (RectF rect)` 测量rect并将测量结果放入rect中,返回值是判断矩形(Rect)变换后是否仍为矩形。 +(1) `boolean mapRect (RectF rect)` 测量rect并将测量结果放入rect中,返回值是判断矩形经过变换后是否仍为矩形。 示例: ``` java - RectF rect = new RectF(400, 400, 1000, 800); - - // 构造一个matrix,x坐标缩放0.5 - Matrix matrix = new Matrix(); - matrix.setScale(0.5f, 1f); - - Log.i(TAG, "mapRadius: "+rect.toString()); - - matrix.mapRect(rect); - - Log.i(TAG, "mapRadius: "+rect.toString()); + RectF rect = new RectF(400, 400, 1000, 800); + + // 构造一个matrix + Matrix 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); ``` 结果: ``` -RectF(400.0, 400.0, 1000.0, 800.0) -RectF(200.0, 400.0, 500.0, 800.0) +mapRadius: RectF(400.0, 400.0, 1000.0, 800.0) +mapRadius: RectF(600.0, 400.0, 1300.0, 800.0) +isRect: false ``` +> +由于使用了错切,所以返回结果为false。 + **4.mapVectors** From e2ceb6da227e348f03ad89f4889bba1c79348067 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 12 Aug 2016 22:09:54 +0800 Subject: [PATCH 360/615] Fix code view --- CustomView/Advance/[10]Matrix_Method.md | 143 ++++++++++++------------ 1 file changed, 71 insertions(+), 72 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 06160a8c..7b84a23e 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -146,22 +146,21 @@ void mapPoints (float[] dst, int dstIndex,float[] src, int srcIndex, int pointCo 示例: ``` java +// 初始数据为三个点 (0, 0) (80, 100) (400, 300) +float[] pts = new float[]{0, 0, 80, 100, 400, 300}; - // 初始数据为三个点 (0, 0) (80, 100) (400, 300) - float[] pts = new float[]{0, 0, 80, 100, 400, 300}; - - // 构造一个matrix,x坐标缩放0.5 - Matrix matrix = new Matrix(); - matrix.setScale(0.5f, 1f); - - // 输出pts计算之前数据 - Log.i(TAG, "before: "+ Arrays.toString(pts)); - - // 调用map方法计算 - matrix.mapPoints(pts); - - // 输出pts计算之后数据 - Log.i(TAG, "after : "+ Arrays.toString(pts)); +// 构造一个matrix,x坐标缩放0.5 +Matrix matrix = new Matrix(); +matrix.setScale(0.5f, 1f); + +// 输出pts计算之前数据 +Log.i(TAG, "before: "+ Arrays.toString(pts)); + +// 调用map方法计算 +matrix.mapPoints(pts); + +// 输出pts计算之后数据 +Log.i(TAG, "after : "+ Arrays.toString(pts)); ``` 结果: @@ -178,24 +177,24 @@ after : [0.0, 0.0, 40.0, 100.0, 200.0, 300.0] 示例: ``` java - // 初始数据为三个点 (0, 0) (80, 100) (400, 300) - float[] src = new float[]{0, 0, 80, 100, 400, 300}; - float[] dst = new float[6]; +// 初始数据为三个点 (0, 0) (80, 100) (400, 300) +float[] src = new float[]{0, 0, 80, 100, 400, 300}; +float[] dst = new float[6]; - // 构造一个matrix,x坐标缩放0.5 - Matrix matrix = new Matrix(); - matrix.setScale(0.5f, 1f); +// 构造一个matrix,x坐标缩放0.5 +Matrix matrix = new Matrix(); +matrix.setScale(0.5f, 1f); - // 输出计算之前数据 - Log.i(TAG, "before: src="+ Arrays.toString(src)); - Log.i(TAG, "before: dst="+ Arrays.toString(dst)); +// 输出计算之前数据 +Log.i(TAG, "before: src="+ Arrays.toString(src)); +Log.i(TAG, "before: dst="+ Arrays.toString(dst)); - // 调用map方法计算 - matrix.mapPoints(dst,src); +// 调用map方法计算 +matrix.mapPoints(dst,src); - // 输出计算之后数据 - Log.i(TAG, "after : src="+ Arrays.toString(src)); - Log.i(TAG, "after : dst="+ Arrays.toString(dst)); +// 输出计算之后数据 +Log.i(TAG, "after : src="+ Arrays.toString(src)); +Log.i(TAG, "after : dst="+ Arrays.toString(dst)); ``` 结果: @@ -224,24 +223,24 @@ pointCount | 计算的点个数 将第二、三个点计算后存储进dst最开始位置。 ``` java - // 初始数据为三个点 (0, 0) (80, 100) (400, 300) - float[] src = new float[]{0, 0, 80, 100, 400, 300}; - float[] dst = new float[6]; - - // 构造一个matrix,x坐标缩放0.5 - Matrix matrix = new Matrix(); - matrix.setScale(0.5f, 1f); - - // 输出计算之前数据 - Log.i(TAG, "before: src="+ Arrays.toString(src)); - Log.i(TAG, "before: dst="+ Arrays.toString(dst)); - - // 调用map方法计算(最后一个2表示两个点,即四个数值,并非两个数值) - matrix.mapPoints(dst, 0, src, 2, 2); - - // 输出计算之后数据 - Log.i(TAG, "after : src="+ Arrays.toString(src)); - Log.i(TAG, "after : dst="+ Arrays.toString(dst)); +// 初始数据为三个点 (0, 0) (80, 100) (400, 300) +float[] src = new float[]{0, 0, 80, 100, 400, 300}; +float[] dst = new float[6]; + +// 构造一个matrix,x坐标缩放0.5 +Matrix matrix = new Matrix(); +matrix.setScale(0.5f, 1f); + +// 输出计算之前数据 +Log.i(TAG, "before: src="+ Arrays.toString(src)); +Log.i(TAG, "before: dst="+ Arrays.toString(dst)); + +// 调用map方法计算(最后一个2表示两个点,即四个数值,并非两个数值) +matrix.mapPoints(dst, 0, src, 2, 2); + +// 输出计算之后数据 +Log.i(TAG, "after : src="+ Arrays.toString(src)); +Log.i(TAG, "after : dst="+ Arrays.toString(dst)); ``` 结果: @@ -264,18 +263,18 @@ float mapRadius (float radius) 示例: ``` java - 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); +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); ``` 结果: @@ -301,19 +300,19 @@ boolean mapRect (RectF dst, RectF src) 示例: ``` java - RectF rect = new RectF(400, 400, 1000, 800); - - // 构造一个matrix - Matrix 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); +RectF rect = new RectF(400, 400, 1000, 800); + +// 构造一个matrix +Matrix 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); ``` 结果: From bc09c5d4ce3917bc25e2985540e048bdb90588dd Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 13 Aug 2016 18:11:53 +0800 Subject: [PATCH 361/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 7b84a23e..e824f931 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -326,9 +326,12 @@ isRect: false > 由于使用了错切,所以返回结果为false。 +(2) `boolean mapRect (RectF dst, RectF src)` 测量src并将测量结果放入dst中,返回值是判断矩形经过变换后是否仍为矩形,和之前没有什么太大区别,此处就不啰嗦了。 **4.mapVectors** + + ### set pre 与 post ### 特殊方法 From 4fcba0f4e026e47620e733793c5898482805d318 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 13 Aug 2016 18:27:14 +0800 Subject: [PATCH 362/615] Update value compute --- CustomView/Advance/[10]Matrix_Method.md | 39 +++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index e824f931..dc4f8b34 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -330,7 +330,46 @@ isRect: false **4.mapVectors** +测量向量。 +``` java +void mapVectors (float[] vecs) + +void mapVectors (float[] dst, float[] src) + +void mapVectors (float[] dst, int dstIndex, float[] src, int srcIndex, int vectorCount) +``` + +`mapVectors` 与 `mapPoints` 基本上是相同的,可以直接参照上面的`mapPoints`使用方法。 + +而两者唯一的区别就是`mapVectors`不会受到位移的影响,这符合向量的定律,如果你不了解的话,请找到以前教过你的老师然后把学费要回来。 + +区别: + +``` java +float[] src = new float[]{1000, 800}; +float[] dst = new float[2]; + +// 构造一个matrix +Matrix 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)); +``` + +结果: + +``` +mapVectors: [500.0, 800.0] +mapPoints: [600.0, 900.0] +``` ### set pre 与 post From 0717112460c855f5cdf082a29e9bce79fcb86287 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 13 Aug 2016 18:29:34 +0800 Subject: [PATCH 363/615] Update matrix core --- CustomView/Advance/[10]Matrix_Method.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index dc4f8b34..3b0a592e 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -371,7 +371,9 @@ mapVectors: [500.0, 800.0] mapPoints: [600.0, 900.0] ``` -### set pre 与 post +### set、pre 与 post + +这一部分是Matrix的重点, ### 特殊方法 From defe0e622597efb3478204cc1c71371373d12da1 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 14 Aug 2016 00:55:04 +0800 Subject: [PATCH 364/615] Update --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 19e33b42..7d25f221 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,12 @@ ****** +## 传送门 + +通往异世界的传送门,空间折跃准备完毕,[点击开始传送](https://github.com/GcsSloop/AndroidNote/tree/magic-world)。 + +****** + ## 版权声明 * 所有原创文章(未进行特殊标识的均属于原创) 的著作权属于 **GcsSloop**。 From 6f7d57061093d91a397961d82021d26c8d951a44 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 14 Aug 2016 10:16:03 +0800 Subject: [PATCH 365/615] Update --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7d25f221..2aeda0dd 100644 --- a/README.md +++ b/README.md @@ -75,11 +75,13 @@ * [LeafLoading - 进度条](https://github.com/GcsSloop/LeafLoading) * [Rotate3dAnimation - 3D旋转动画(修正版)](https://github.com/GcsSloop/Rotate3dAnimation) -****** +[![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f6t21eozlyj305k01vjra.jpg)](https://github.com/GcsSloop/AndroidNote/blob/magic-world/CONTRIBUTE.md) ## 传送门 -通往异世界的传送门,空间折跃准备完毕,[点击开始传送](https://github.com/GcsSloop/AndroidNote/tree/magic-world)。 +通往异世界的传送门,请谨慎使用。 + +时空折跃准备完毕,[点击开始传送](https://github.com/GcsSloop/AndroidNote/tree/magic-world)。 ****** From 7d480b0aaa3f877d5015a68a13e41e725fbb7f8b Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 15 Aug 2016 00:32:15 +0800 Subject: [PATCH 366/615] Update matrix core --- CustomView/Advance/[10]Matrix_Method.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 3b0a592e..9c908b67 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -373,7 +373,9 @@ mapPoints: [600.0, 900.0] ### set、pre 与 post -这一部分是Matrix的重点, +这一部分是Matrix的重点,也是最常用的一部分,不过并不困难, 可以参考 []() 和 []() 这两篇文章的内容来学习。 + + ### 特殊方法 From e6d92d73849da3b142e9e18be5d437ac6ec9f686 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 16 Aug 2016 01:10:39 +0800 Subject: [PATCH 367/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2aeda0dd..8fd93231 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,6 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) - + [▲ 回到顶部](#top) From 10154f59de57c83a4a0b6ba323cbd099942c6275 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 16 Aug 2016 02:57:27 +0800 Subject: [PATCH 368/615] Fix about --- CustomView/Base/[01]CoordinateSystem.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Base/[01]CoordinateSystem.md b/CustomView/Base/[01]CoordinateSystem.md index 00ac0ba8..9e1b1363 100644 --- a/CustomView/Base/[01]CoordinateSystem.md +++ b/CustomView/Base/[01]CoordinateSystem.md @@ -63,5 +63,5 @@ ### 作者微博: @GcsSloop - + From 4fae14f153ff4432a3469f0a95fd35fa22827926 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 17 Aug 2016 02:54:17 +0800 Subject: [PATCH 369/615] Fix link and format --- CustomView/Base/[01]CoordinateSystem.md | 6 +++++- CustomView/Base/[02]AngleAndRadian.md | 6 ++++-- CustomView/Base/[03]Color.md | 28 ++++++++++++++++++++----- CustomView/README.md | 2 +- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/CustomView/Base/[01]CoordinateSystem.md b/CustomView/Base/[01]CoordinateSystem.md index 9e1b1363..9db00f30 100644 --- a/CustomView/Base/[01]CoordinateSystem.md +++ b/CustomView/Base/[01]CoordinateSystem.md @@ -1,7 +1,7 @@ # 安卓中的坐标系 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) +### [【本系列相关文章】](http://www.gcssloop.com/1970/01/CustomViewIndex/) ## 一.屏幕坐标系和数学坐标系的区别 @@ -29,11 +29,13 @@ getBottom(); //获取子View右下角距父View顶部的距离 getRight(); //获取子View右下角距父View左侧的距离 ``` + **如下图所示:** ![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f1qzqwvkkbj308c0dwgm9.jpg) ## 三.MotionEvent中 get 和 getRaw 的区别 + ``` event.getX(); //触摸点相对于其所在组件坐标系的坐标 event.getY(); @@ -42,6 +44,7 @@ event.getRawY(); ``` + **如下图所示:** > PS:其中相同颜色的内容是对应的,其中为了显示方便,蓝色箭头向左稍微偏移了一点. @@ -57,6 +60,7 @@ 3 | MotionEvent中get和getRaw的区别 ## 五.参考文章: + [Android 屏幕(View)坐标系统](http://blog.csdn.net/wangjinyu501/article/details/21827341) ## About Me diff --git a/CustomView/Base/[02]AngleAndRadian.md b/CustomView/Base/[02]AngleAndRadian.md index 5b4ee7db..dab77f5a 100644 --- a/CustomView/Base/[02]AngleAndRadian.md +++ b/CustomView/Base/[02]AngleAndRadian.md @@ -1,7 +1,7 @@ # 角度与弧度 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) +### [【本系列相关文章】](http://www.gcssloop.com/1970/01/CustomViewIndex/) 安卓中角度(angle)与弧度(radian)的有关问题。 @@ -64,6 +64,7 @@ C = 2πr; ## 四.一些细节问题 + 由于默认屏幕坐标系和常见数学坐标系的小差别([坐标系问题点这里](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md)),所以在角上必然也会存在一些区别,例如: **在常见的数学坐标系中角度增大方向为逆时针,** @@ -73,9 +74,10 @@ C = 2πr; ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f1s2wnsewfj308c0dwt94.jpg) ## About Me + ### 作者微博: @GcsSloop - + diff --git a/CustomView/Base/[03]Color.md b/CustomView/Base/[03]Color.md index aeb8a6f4..77694a0c 100644 --- a/CustomView/Base/[03]Color.md +++ b/CustomView/Base/[03]Color.md @@ -1,7 +1,8 @@ # 颜色 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) + +### [【本系列相关文章】](http://www.gcssloop.com/1970/01/CustomViewIndex/) 简要介绍安卓中的颜色相关内容,包括颜色的定义,创建颜色的几种方式,以及颜色的混合模式等。 @@ -38,18 +39,25 @@ RGB 从0x00到0xff表示颜色从浅到深。 **当RGB全取最小值(0或0x000000)时颜色为黑色,全取最大值(255或0xffffff)时颜色为白色** ## 二.几种创建或使用颜色的方式 + ### 1.java中定义颜色 + ``` java int color = Color.GRAY; //灰色 ``` + 由于Color类提供的颜色仅为有限的几个,通常还是用ARGB值进行表示。 + ``` java int color = Color.argb(127, 255, 0, 0); //半透明红色 int color = 0xaaff0000; //带有透明度的红色 ``` + ### 2.在xml文件中定义颜色 + 在/res/values/color.xml 文件中如下定义: + ``` xml @@ -57,9 +65,11 @@ RGB 从0x00到0xff表示颜色从浅到深。 #00ff00 ``` + 详解: 在以上xml文件中定义了两个颜色,红色和蓝色,是没有alpha(透明)通道的。 定义颜色以‘#’开头,后面跟十六进制的值,有如下几种定义方式: + ``` java #f00 //低精度 - 不带透明通道红色 #af00 //低精度 - 带透明通道红色 @@ -69,16 +79,20 @@ RGB 从0x00到0xff表示颜色从浅到深。 ``` ### 3.在java文件中引用xml中定义的颜色: + ``` java int color = getResources().getColor(R.color.mycolor); ``` + ### 4.在xml文件(layout或style)中引用或者创建颜色 + ``` xml ``` + ``` java android:background="@color/red" //引用在/res/values/color.xml 中定义的颜色 @@ -86,19 +100,22 @@ RGB 从0x00到0xff表示颜色从浅到深。 ``` ## 三.取色工具 + 颜色都是用RGB值定义的,而我们一般是无法直观的知道自己需要颜色的值,需要借用取色工具直接从图片或者其他地方获取颜色的RGB值。 ### 1.屏幕取色工具 + 取色调色工具,可以从屏幕取色或者使用调色板调制颜色,非常小而精简。 -[点击这里获取屏幕取色工具](http://pan.baidu.com/s/1gdWkN0B) +**[点击这里获取屏幕取色工具](http://pan.baidu.com/s/1gdWkN0B)** ### 2.Picpick + 功能更加强大的工具:PicPick。 PicPick具备了截取全屏、活动窗口、指定区域、固定区域、手绘区域功能,支持滚动截屏,屏幕取色,支持双显示器,具备白板、屏幕标尺、直角座标或极座标显示与测量,具备强大的图像编辑和标注功能。 -[点击这里获取PicPick](http://ngwin.com/picpick) +**[点击这里获取PicPick](http://ngwin.com/picpick)** ## 四.颜色混合模式(Alpha通道相关) @@ -110,7 +127,7 @@ PicPick具备了截取全屏、活动窗口、指定区域、固定区域、手 **(RGB通道) 最终颜色 = 绘制的颜色 + (1 - 绘制颜色的透明度) × Canvas上的原有颜色。** -注意: +**注意:** 1.这里我们一般把每个通道的取值从0(ox00)到255(0xff)映射到0到1的浮点数表示。 @@ -152,8 +169,9 @@ XOR | [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] [【安卓图形动画】](http://www.cnblogs.com/zhucai/p/android-graphics-animation.html) ## About Me + ### 作者微博: @GcsSloop - + diff --git a/CustomView/README.md b/CustomView/README.md index e08eff71..f4fe7725 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -37,4 +37,4 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) - + From 94e6ff53f3f01d51ead6b622272da958a3dd2401 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 17 Aug 2016 23:11:31 +0800 Subject: [PATCH 370/615] Update matrix core --- CustomView/Advance/[10]Matrix_Method.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 9c908b67..8cd70480 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -373,7 +373,9 @@ mapPoints: [600.0, 900.0] ### set、pre 与 post -这一部分是Matrix的重点,也是最常用的一部分,不过并不困难, 可以参考 []() 和 []() 这两篇文章的内容来学习。 +对于四种基本变换 平移(translate)、缩放(scale)、旋转(rotate)、 错切(skew) 它们每一种都三种操作方法,分别为 设置(set)、 前乘(pre) 和 后乘 (post)。 + +关于四种基本变换的知识和三种对应操作的区别,可以参考 []() 和 []() 这两篇文章的内容来。 From 0eaca005a23055fd40c6c45b8c1670cb8a392268 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 18 Aug 2016 19:01:35 +0800 Subject: [PATCH 371/615] Add links --- CustomView/Advance/[10]Matrix_Method.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 8cd70480..6df68fee 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -1,5 +1,8 @@ # Matrix方法 +### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) +### 相关文章: [自定义View目录](http://www.gcssloop.com/1970/01/CustomViewIndex/) + ## 前言 From 8ba08e8ec9fd0ffff3b0554556c2b306eb434937 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 18 Aug 2016 22:22:57 +0800 Subject: [PATCH 372/615] Add links --- CustomView/Advance/[10]Matrix_Method.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 6df68fee..81e5d5c8 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -378,7 +378,11 @@ mapPoints: [600.0, 900.0] 对于四种基本变换 平移(translate)、缩放(scale)、旋转(rotate)、 错切(skew) 它们每一种都三种操作方法,分别为 设置(set)、 前乘(pre) 和 后乘 (post)。 -关于四种基本变换的知识和三种对应操作的区别,可以参考 []() 和 []() 这两篇文章的内容来。 +**关于四种基本变换的知识和三种对应操作的区别,详细可以参考 [Canvas之画布操作](http://www.gcssloop.com/2015/02/Canvas_Convert/) 和 [Matrix原理](http://www.gcssloop.com/2015/02/Matrix_Basic/) 这两篇文章的内容。** + + + + From 66f77c3371cb6adb35250b6ee3fa96d8c27e74d8 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 18 Aug 2016 23:07:25 +0800 Subject: [PATCH 373/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 81e5d5c8..d0ffb343 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -392,5 +392,6 @@ mapPoints: [600.0, 900.0] ## Matrix实用技巧 +## About - +## 参考资料 From 16ba9d3962e4fe0ff693cd6e248dbd98199513ac Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 19 Aug 2016 11:40:32 +0800 Subject: [PATCH 374/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=BA=90=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/Code/CheckView.java | 182 ++++++++++++++++++++++++ CustomView/Advance/Code/CheckView.md | 185 +++++++++++++++++++++++++ 2 files changed, 367 insertions(+) create mode 100644 CustomView/Advance/Code/CheckView.java create mode 100644 CustomView/Advance/Code/CheckView.md diff --git a/CustomView/Advance/Code/CheckView.java b/CustomView/Advance/Code/CheckView.java new file mode 100644 index 00000000..be82e5d9 --- /dev/null +++ b/CustomView/Advance/Code/CheckView.java @@ -0,0 +1,182 @@ +package com.sloop.canvas; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; + +/** + *

+ */ +public class CheckView extends View { + + private static final int ANIM_NULL = 0; //动画状态-没有 + private static final int ANIM_CHECK = 1; //动画状态-开启 + private static final int ANIM_UNCHECK = 2; //动画状态-结束 + + private Context mContext; // 上下文 + private int mWidth, mHeight; // 宽高 + private Handler mHandler; // handler + + private Paint mPaint; + private Bitmap okBitmap; + + private int animCurrentPage = -1; // 当前页码 + private int animMaxPage = 13; // 总页数 + private int animDuration = 500; // 动画时长 + private int animState = ANIM_NULL; // 动画状态 + + private boolean isCheck = false; // 是否只选中状态 + + public CheckView(Context context) { + super(context, null); + + } + + public CheckView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + /** + * 初始化 + * @param context + */ + private void init(Context context) { + mContext = context; + + mPaint = new Paint(); + mPaint.setColor(0xffFF5317); + mPaint.setStyle(Paint.Style.FILL); + mPaint.setAntiAlias(true); + + okBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.checkres); + + mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + if (animCurrentPage < animMaxPage && animCurrentPage >= 0) { + invalidate(); + if (animState == ANIM_NULL) + return; + if (animState == ANIM_CHECK) { + + animCurrentPage++; + } else if (animState == ANIM_UNCHECK) { + animCurrentPage--; + } + + this.sendEmptyMessageDelayed(0, animDuration / animMaxPage); + Log.e("AAA", "Count=" + animCurrentPage); + } else { + if (isCheck) { + animCurrentPage = animMaxPage - 1; + } else { + animCurrentPage = -1; + } + invalidate(); + animState = ANIM_NULL; + } + } + }; + } + + + /** + * View大小确定 + * @param w + * @param h + * @param oldw + * @param oldh + */ + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mWidth = w; + mHeight = h; + } + + /** + * 绘制内容 + * @param canvas + */ + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + // 移动坐标系到画布中央 + canvas.translate(mWidth / 2, mHeight / 2); + + // 绘制背景圆形 + canvas.drawCircle(0, 0, 240, mPaint); + + // 得出图像边长 + int sideLength = okBitmap.getHeight(); + + // 得到图像选区 和 实际绘制位置 + Rect src = new Rect(sideLength * animCurrentPage, 0, sideLength * (animCurrentPage + 1), sideLength); + Rect dst = new Rect(-200, -200, 200, 200); + + // 绘制 + canvas.drawBitmap(okBitmap, src, dst, null); + } + + + /** + * 选择 + */ + public void check() { + if (animState != ANIM_NULL || isCheck) + return; + animState = ANIM_CHECK; + animCurrentPage = 0; + mHandler.sendEmptyMessageDelayed(0, animDuration / animMaxPage); + isCheck = true; + } + + /** + * 取消选择 + */ + public void unCheck() { + if (animState != ANIM_NULL || (!isCheck)) + return; + animState = ANIM_UNCHECK; + animCurrentPage = animMaxPage - 1; + mHandler.sendEmptyMessageDelayed(0, animDuration / animMaxPage); + isCheck = false; + } + + /** + * 设置动画时长 + * @param animDuration + */ + public void setAnimDuration(int animDuration) { + if (animDuration <= 0) + return; + this.animDuration = animDuration; + } + + /** + * 设置背景圆形颜色 + * @param color + */ + public void setBackgroundColor(int color){ + mPaint.setColor(color); + } +} \ No newline at end of file diff --git a/CustomView/Advance/Code/CheckView.md b/CustomView/Advance/Code/CheckView.md new file mode 100644 index 00000000..3e78d123 --- /dev/null +++ b/CustomView/Advance/Code/CheckView.md @@ -0,0 +1,185 @@ +``` java +package com.sloop.canvas; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; + +/** + * + */ +public class CheckView extends View { + + private static final int ANIM_NULL = 0; //动画状态-没有 + private static final int ANIM_CHECK = 1; //动画状态-开启 + private static final int ANIM_UNCHECK = 2; //动画状态-结束 + + private Context mContext; // 上下文 + private int mWidth, mHeight; // 宽高 + private Handler mHandler; // handler + + private Paint mPaint; + private Bitmap okBitmap; + + private int animCurrentPage = -1; // 当前页码 + private int animMaxPage = 13; // 总页数 + private int animDuration = 500; // 动画时长 + private int animState = ANIM_NULL; // 动画状态 + + private boolean isCheck = false; // 是否只选中状态 + + public CheckView(Context context) { + super(context, null); + + } + + public CheckView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + /** + * 初始化 + * @param context + */ + private void init(Context context) { + mContext = context; + + mPaint = new Paint(); + mPaint.setColor(0xffFF5317); + mPaint.setStyle(Paint.Style.FILL); + mPaint.setAntiAlias(true); + + okBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.checkres); + + mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + if (animCurrentPage < animMaxPage && animCurrentPage >= 0) { + invalidate(); + if (animState == ANIM_NULL) + return; + if (animState == ANIM_CHECK) { + + animCurrentPage++; + } else if (animState == ANIM_UNCHECK) { + animCurrentPage--; + } + + this.sendEmptyMessageDelayed(0, animDuration / animMaxPage); + Log.e("AAA", "Count=" + animCurrentPage); + } else { + if (isCheck) { + animCurrentPage = animMaxPage - 1; + } else { + animCurrentPage = -1; + } + invalidate(); + animState = ANIM_NULL; + } + } + }; + } + + + /** + * View大小确定 + * @param w + * @param h + * @param oldw + * @param oldh + */ + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mWidth = w; + mHeight = h; + } + + /** + * 绘制内容 + * @param canvas + */ + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + // 移动坐标系到画布中央 + canvas.translate(mWidth / 2, mHeight / 2); + + // 绘制背景圆形 + canvas.drawCircle(0, 0, 240, mPaint); + + // 得出图像边长 + int sideLength = okBitmap.getHeight(); + + // 得到图像选区 和 实际绘制位置 + Rect src = new Rect(sideLength * animCurrentPage, 0, sideLength * (animCurrentPage + 1), sideLength); + Rect dst = new Rect(-200, -200, 200, 200); + + // 绘制 + canvas.drawBitmap(okBitmap, src, dst, null); + } + + + /** + * 选择 + */ + public void check() { + if (animState != ANIM_NULL || isCheck) + return; + animState = ANIM_CHECK; + animCurrentPage = 0; + mHandler.sendEmptyMessageDelayed(0, animDuration / animMaxPage); + isCheck = true; + } + + /** + * 取消选择 + */ + public void unCheck() { + if (animState != ANIM_NULL || (!isCheck)) + return; + animState = ANIM_UNCHECK; + animCurrentPage = animMaxPage - 1; + mHandler.sendEmptyMessageDelayed(0, animDuration / animMaxPage); + isCheck = false; + } + + /** + * 设置动画时长 + * @param animDuration + */ + public void setAnimDuration(int animDuration) { + if (animDuration <= 0) + return; + this.animDuration = animDuration; + } + + /** + * 设置背景圆形颜色 + * @param color + */ + public void setBackgroundColor(int color){ + mPaint.setColor(color); + } +} + +``` \ No newline at end of file From 4f2d7ab6324486b2b994db9748d11e31fb888c16 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 19 Aug 2016 11:41:41 +0800 Subject: [PATCH 375/615] Update --- CustomView/Advance/Code/CheckView.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/Code/CheckView.md b/CustomView/Advance/Code/CheckView.md index 3e78d123..1c7044b9 100644 --- a/CustomView/Advance/Code/CheckView.md +++ b/CustomView/Advance/Code/CheckView.md @@ -1,3 +1,5 @@ +## CheckView源代码 + ``` java package com.sloop.canvas; @@ -182,4 +184,4 @@ public class CheckView extends View { } } -``` \ No newline at end of file +``` From de0eb87b651bd7d328df0c09a3c9e81b8e47dfe1 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 19 Aug 2016 11:46:07 +0800 Subject: [PATCH 376/615] Fix text --- CustomView/Advance/[04]Canvas_PictureText.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[04]Canvas_PictureText.md b/CustomView/Advance/[04]Canvas_PictureText.md index ad2e637b..3b8c604c 100644 --- a/CustomView/Advance/[04]Canvas_PictureText.md +++ b/CustomView/Advance/[04]Canvas_PictureText.md @@ -461,7 +461,7 @@ Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域 -不过嘛,虽然虽然这个方法也比较容易理解,但是关于这个方法我个人是不推荐使用的,因为坑比较的,主要有一下几点: +不过嘛,虽然虽然这个方法也比较容易理解,但是关于这个方法我个人是不推荐使用的,因为坑比较多,主要有一下几点: 序号 | 反对理由 -----|---------------------- From 8b1187c87fefece6013c32403b02275a5b56da9e Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 19 Aug 2016 12:19:36 +0800 Subject: [PATCH 377/615] Update --- CustomView/Advance/[04]Canvas_PictureText.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/[04]Canvas_PictureText.md b/CustomView/Advance/[04]Canvas_PictureText.md index 3b8c604c..8dc25299 100644 --- a/CustomView/Advance/[04]Canvas_PictureText.md +++ b/CustomView/Advance/[04]Canvas_PictureText.md @@ -166,6 +166,7 @@ public void drawPicture (Picture picture, RectF dst) 和使用Picture的draw方法不同,Canvas的drawPicture不会影响Canvas状态。 **简单示例:** + ``` java canvas.drawPicture(mPicture,new RectF(0,0,mPicture.getWidth(),200)); ``` @@ -175,6 +176,7 @@ public void drawPicture (Picture picture, RectF dst) **PS:对照上一张图片,可以比较明显的看出,绘制的内容根据选区进行了缩放。 ** **3.将Picture包装成为PictureDrawable,使用PictureDrawable的draw方法绘制。** + ``` // 包装成为Drawable PictureDrawable drawable = new PictureDrawable(mPicture); From b10c0c7d9c65684b531cdbc255dcb7ca46dc0ff2 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 19 Aug 2016 18:57:54 +0800 Subject: [PATCH 378/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 44 ++++++++++--------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index d0ffb343..0d2344ef 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -3,26 +3,19 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### 相关文章: [自定义View目录](http://www.gcssloop.com/1970/01/CustomViewIndex/) - -## 前言 - 在上一篇文章中,我们对Matrix做了一个简单的了解,偏向理论,在本文中则会详细的讲解Matrix的具体用法,以及Matrix的一些实用技巧。 -

## 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 | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... +| 方法类别 | 相关API | 摘要 | +| -------- | ---------------------------------------- | -------------------------- | +| 设置(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 | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... | ## Matrix方法详解 @@ -44,8 +37,7 @@ Matrix matrix = new Matrix(); 通过这种方式创建出来的并不是一个数值全部为空的矩阵,而是一个单位矩阵,如下: -![](http://latex.codecogs.com/png.latex? -$$ +![](http://latex.codecogs.com/png.latex?$$ \\left [ \\begin{matrix} 1 & 0 & 0 \\\\ @@ -211,19 +203,19 @@ after : dst=[0.0, 0.0, 40.0, 100.0, 200.0, 300.0] (3) `void mapPoints (float[] dst, int dstIndex,float[] src, int srcIndex, int pointCount)` 可以指定只计算一部分数值。 -参数 | 摘要 ------------|--- -dst | 目标数据 -dstIndex | 目标数据存储位置起始下标 -src | 源数据 -srcIndex | 源数据存储位置起始下标 -pointCount | 计算的点个数 +| 参数 | 摘要 | +| ---------- | ------------ | +| dst | 目标数据 | +| dstIndex | 目标数据存储位置起始下标 | +| src | 源数据 | +| srcIndex | 源数据存储位置起始下标 | +| pointCount | 计算的点个数 | 示例: > -将第二、三个点计算后存储进dst最开始位置。 +>将第二、三个点计算后存储进dst最开始位置。 ``` java // 初始数据为三个点 (0, 0) (80, 100) (400, 300) @@ -327,7 +319,7 @@ isRect: false ``` > -由于使用了错切,所以返回结果为false。 +>由于使用了错切,所以返回结果为false。 (2) `boolean mapRect (RectF dst, RectF src)` 测量src并将测量结果放入dst中,返回值是判断矩形经过变换后是否仍为矩形,和之前没有什么太大区别,此处就不啰嗦了。 @@ -382,7 +374,7 @@ mapPoints: [600.0, 900.0] - +dd From 8580a7fb4fa84b4eb6a0ff174186edd163d19000 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 19 Aug 2016 21:16:52 +0800 Subject: [PATCH 379/615] Add matrix core --- CustomView/Advance/[10]Matrix_Method.md | 32 +++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 0d2344ef..77d227c9 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -9,13 +9,13 @@ 按照惯例,先放方法表做概览。 -| 方法类别 | 相关API | 摘要 | -| -------- | ---------------------------------------- | -------------------------- | +| 方法类别 | 相关API | 摘要 | +| :------: | ---------------------------------------- | :------------------------- | | 设置(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 | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... | +| 特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 | +| 矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... | ## Matrix方法详解 @@ -37,14 +37,14 @@ Matrix matrix = new Matrix(); 通过这种方式创建出来的并不是一个数值全部为空的矩阵,而是一个单位矩阵,如下: -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} -1 & 0 & 0 \\\\ -0 & 1 & 0 \\\\ +![](http://latex.codecogs.com/png.latex?$$ +\left [ +\begin{matrix} +1 & 0 & 0 \\\ +0 & 1 & 0 \\\ 0 & 0 & 1 -\\end{1} -\\right ] +\end{1} +\right ] $$) @@ -372,9 +372,17 @@ mapPoints: [600.0, 900.0] **关于四种基本变换的知识和三种对应操作的区别,详细可以参考 [Canvas之画布操作](http://www.gcssloop.com/2015/02/Canvas_Convert/) 和 [Matrix原理](http://www.gcssloop.com/2015/02/Matrix_Basic/) 这两篇文章的内容。** +由于之前的文章已经详细的讲解过了它们的原理与用法,所以此处就简要的介绍一下: +| 方法 | 简介 | +| ---- | ------------------------------------ | +| set | 设置,会覆盖掉之前的数值,导致之前的操作失效。 | +| pre | 前乘,相当于矩阵的右乘, `M' = M * S` (S指为特殊矩阵) | +| post | 后乘,相当于矩阵的左乘,`M' = S * M` (S指为特殊矩阵) | -dd +**Matrix 相关的一些坑:** + +- 1.一开始从Canvas中获取到到Matrix并不是初始矩阵,而是经过偏移后到矩阵。 From 356b873daed67765f4ad2602af93e00aa0a59c41 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 20 Aug 2016 02:38:52 +0800 Subject: [PATCH 380/615] Add matrix --- CustomView/Advance/[10]Matrix_Method.md | 44 ++++++++++++++++++++----- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 77d227c9..19f842f2 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -38,13 +38,13 @@ Matrix matrix = new Matrix(); 通过这种方式创建出来的并不是一个数值全部为空的矩阵,而是一个单位矩阵,如下: ![](http://latex.codecogs.com/png.latex?$$ -\left [ -\begin{matrix} -1 & 0 & 0 \\\ -0 & 1 & 0 \\\ +\\left [ +\\begin{matrix} +1 & 0 & 0 \\\\ +0 & 1 & 0 \\\\ 0 & 0 & 1 -\end{1} -\right ] +\\end{1} +\\right ] $$) @@ -380,14 +380,42 @@ mapPoints: [600.0, 900.0] | pre | 前乘,相当于矩阵的右乘, `M' = M * S` (S指为特殊矩阵) | | post | 后乘,相当于矩阵的左乘,`M' = S * M` (S指为特殊矩阵) | -**Matrix 相关的一些坑:** +**Matrix 相关的重要知识:** -- 1.一开始从Canvas中获取到到Matrix并不是初始矩阵,而是经过偏移后到矩阵。 +- 1.一开始从Canvas中获取到到Matrix并不是初始矩阵,而是经过偏移后到矩阵,且偏移距离就是距离屏幕左上角的位置。 +- > 这个可以用于判定View在屏幕上的绝对位置,View可以根据所处位置做出调整。 + +- 2.构造Matrix时使用的是矩阵乘法,前乘(pre)与后乘(post)结果差别很大。 + +- > 这个直接参见上一篇文章 [Matrix原理](http://www.gcssloop.com/2015/02/Matrix_Basic/) 即可。 + +- 3.受矩阵乘法影响,后面的执行的操作可能会影响到之前的操作。 + +- > 使用时需要注意构造顺序。 ### 特殊方法 +这一类方法看似不起眼,但拿来稍微加工一下就可能制作意想不到的效果。 + +**1.setPolyToPoly** + +```java +boolean setPolyToPoly ( + float[] src, + int srcIndex, + float[] dst, + int dstIndex, + int pointCount) +``` + + + + + + + ### 矩阵相关 ## Matrix实用技巧 From 808dbf837c736c3c29e3525526a074d635d31dbd Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 20 Aug 2016 23:00:35 +0800 Subject: [PATCH 381/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 19f842f2..9bdb80a6 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -410,9 +410,7 @@ boolean setPolyToPoly ( int pointCount) ``` - - - +这个可以用于制作一些很特殊的效果。 From 9be9dcde9f6cb43e938e256db1c682c12742d033 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 21 Aug 2016 04:14:09 +0800 Subject: [PATCH 382/615] Update --- README.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8fd93231..a32f70b1 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,9 @@ > #### PS:点击分类标题可以查看该分类的详细信息。 -## 目录 - -- [自定义View](#custom_view) -- [教程类](#教程类) -- [速查表](#速查表) -- [混沌水晶](#混沌水晶) -- [开源库](#开源库) -- [版权声明](#版权声明) +## [博客](http://www.gcssloop.com/#blog) + + ****** From 4c8c508db10b52c1f8f72e216a7cb90f03c0a666 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 21 Aug 2016 04:25:57 +0800 Subject: [PATCH 383/615] Update --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a32f70b1..10e2f71f 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ ## [博客](http://www.gcssloop.com/#blog) +新开的博客,在博客中可以获得更好的阅读体验,同时在博客的评论区可以更及时的向我反馈文章中的问题。 + ****** From d63ebc2462b57e1a15a5736b2e6387cc1f69fc20 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 21 Aug 2016 22:14:20 +0800 Subject: [PATCH 384/615] Update setPolyToPoly --- CustomView/Advance/[10]Matrix_Method.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 9bdb80a6..7dd78416 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -403,14 +403,18 @@ mapPoints: [600.0, 900.0] ```java boolean setPolyToPoly ( - float[] src, - int srcIndex, - float[] dst, - int dstIndex, - int pointCount) + float[] src, // 原始数组 src [x,y],存储内容为一组点 + int srcIndex, // 原始数组开始位置 + float[] dst, // 目标数组 dst [x,y],存储内容为一组点 + int dstIndex, // 目标数组开始位置 + int pointCount) // 要使用点的数量 取值范围是: 0到4 ``` -这个可以用于制作一些很特殊的效果。 +Poly全称是Polygon,多边形的意思,了解了意思大致就能知道这个方法是做什么用的了,应该与PS中自由变换差不多。 + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f71ppx7q0lg30go0b44ga.gif) + +> 从参数我们可以了解到setPolyToPoly最多可以支持4个点,也就是图形的四个角,可以通过这四个角将图片变换成其他形状。 From 5236acbb91836729af5f0b409794212428207f03 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 22 Aug 2016 17:57:48 +0800 Subject: [PATCH 385/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 7dd78416..d64524b4 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -414,7 +414,9 @@ Poly全称是Polygon,多边形的意思,了解了意思大致就能知道这 ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f71ppx7q0lg30go0b44ga.gif) -> 从参数我们可以了解到setPolyToPoly最多可以支持4个点,也就是图形的四个角,可以通过这四个角将图片变换成其他形状。 +> 从参数我们可以了解到setPolyToPoly最多可以支持4个点,也就是图形的四个角,可以通过这四个角将视图从矩形变换成其他形状。 + +简单示例: From fd7db2b0d5ee3e54bc9a130becb78e246c5ef171 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 22 Aug 2016 20:30:39 +0800 Subject: [PATCH 386/615] Update --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 10e2f71f..9630a7fd 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,8 @@ * [LeafLoading - 进度条](https://github.com/GcsSloop/LeafLoading) * [Rotate3dAnimation - 3D旋转动画(修正版)](https://github.com/GcsSloop/Rotate3dAnimation) -[![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f6t21eozlyj305k01vjra.jpg)](https://github.com/GcsSloop/AndroidNote/blob/magic-world/CONTRIBUTE.md) +[![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f72pfdbrh5j305k01vt8m.jpg)](http://www.gcssloop.com/1970/01/contribute/) + ## 传送门 From efc3bff2dd426e5016206215b09c58360b793cad Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 23 Aug 2016 01:07:38 +0800 Subject: [PATCH 387/615] Update --- CustomView/Advance/Res/poly_test.jpg | Bin 0 -> 449872 bytes CustomView/Advance/[10]Matrix_Method.md | 49 +++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 CustomView/Advance/Res/poly_test.jpg diff --git a/CustomView/Advance/Res/poly_test.jpg b/CustomView/Advance/Res/poly_test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..645400084997749af616ecfbf0f43556f2e8eb39 GIT binary patch literal 449872 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%0D(uUm7A-6Tppy@!EguYV{XtZ@RnWxt$0RJ?sY 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

S~?%<0)i5>eNM`0kTW!jwjVu$%EFzC z4;`!*UvC7PoqOI`gdPTcv>Ipj8N==LlkD0)HCGv97;LGWG6ro2^qEUB;2E7rUBnt( zP7+uTXbf$^Dh8rcz=QCkEcvZgYX_ozhL88CJdC{@^~35LCDW&sminl;e_S$QL1c8q zAV!=h>`kN>`ZyN6CEF%kJ5%8_9o&1c9eJLg5cnEHW=t(H?75gQH?t-!LsN%OQYe1u z7A^dTGQ{pgRP|PdsGR{>ESLI?j|ek{d&az|=FxCzm#&m1E~MgZvv1CtN}GMETq-x=t0# z%Dsr}d^|bo-E`;&g}yxXdXjjAzcGhZ5WuZWzb=;XK-*6iG$CWCQYQ?c`PGj83m7eS zY0qA#db5c@D(Le3)IBE2*sQC0lAZ(eQ$nx%$Qsrj7vM{@g{8JwX**!3{HY$|w5PAG zULyc>k4m^t#hz!#{{V*`W5D6E)n@#6E9Gj1>|R_$6iHltAye|=EzY&l;QsX_`>H

R^zKWq$K;bE7apOvb!b-Nvy|q=piC3tPPIw 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

wpB`^rSOY-DD4+9pa4UES&;1yeg6m~YQs=M4 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
ny{O{<9VKYHe3~y>RuRWq@P9< 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 literal 0 HcmV?d00001 diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index d64524b4..586e9d2a 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -410,7 +410,7 @@ boolean setPolyToPoly ( int pointCount) // 要使用点的数量 取值范围是: 0到4 ``` -Poly全称是Polygon,多边形的意思,了解了意思大致就能知道这个方法是做什么用的了,应该与PS中自由变换差不多。 +Poly全称是Polygon,多边形的意思,了解了意思大致就能知道这个方法是做什么用的了,应该与PS中自由变换中的扭曲有点类似。 ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f71ppx7q0lg30go0b44ga.gif) @@ -418,6 +418,53 @@ Poly全称是Polygon,多边形的意思,了解了意思大致就能知道这 简单示例: +```java +public class MstrixSetPolyToPolyTest extends View { + + private Bitmap mBitmap; // 要绘制的图片 + private Matrix mPolyMatrix; // 测试setPolyToPoly用的Matrix + + public MstrixSetPolyToPolyTest(Context context) { + super(context); + + initBitmapAndMatrix(); + } + + private void initBitmapAndMatrix() { + mBitmap = BitmapFactory.decodeResource(getResources(), + R.drawable.poly_test); + + mPolyMatrix = new Matrix(); + + + float[] src = {0, 0, // 左上 + mBitmap.getWidth(), 0, // 右上 + mBitmap.getWidth(), mBitmap.getHeight(), // 右下 + 0, mBitmap.getHeight()}; // 左下 + + float[] dst = {0, 0, // 左上 + mBitmap.getWidth(), 400, // 右上 + mBitmap.getWidth(), mBitmap.getHeight() - 200, // 右下 + 0, mBitmap.getHeight()}; // 左下 + + // 核心要点 + mPolyMatrix.setPolyToPoly(src, 0, dst, 0, src.length >> 1); // src.length >> 1 为位移运算 相当于处以2 + + // 此处为了更好的显示对图片进行了等比缩放和平移 + mPolyMatrix.postScale(0.26f, 0.26f); + mPolyMatrix.postTranslate(0,200); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + // 根据Matrix绘制一个变换后的图片 + canvas.drawBitmap(mBitmap, mPolyMatrix, null); + } +} +``` + ### 矩阵相关 From 7cf4b8307b708ebc50268e8cd37bd40f84303ef6 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 23 Aug 2016 05:48:03 +0800 Subject: [PATCH 388/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 124 ++++++++++++++++++++++-- QuickChart/Matrix.md | 20 ++-- 2 files changed, 127 insertions(+), 17 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 586e9d2a..d96698e5 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -9,13 +9,16 @@ 按照惯例,先放方法表做概览。 -| 方法类别 | 相关API | 摘要 | -| :------: | ---------------------------------------- | :------------------------- | +| 方法类别 | 相关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 | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... | +| 特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 | +| 矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... | ## Matrix方法详解 @@ -419,12 +422,12 @@ Poly全称是Polygon,多边形的意思,了解了意思大致就能知道这 简单示例: ```java -public class MstrixSetPolyToPolyTest extends View { +public class MatrixSetPolyToPolyTest extends View { private Bitmap mBitmap; // 要绘制的图片 private Matrix mPolyMatrix; // 测试setPolyToPoly用的Matrix - public MstrixSetPolyToPolyTest(Context context) { + public MatrixSetPolyToPolyTest(Context context) { super(context); initBitmapAndMatrix(); @@ -450,7 +453,7 @@ public class MstrixSetPolyToPolyTest extends View { // 核心要点 mPolyMatrix.setPolyToPoly(src, 0, dst, 0, src.length >> 1); // src.length >> 1 为位移运算 相当于处以2 - // 此处为了更好的显示对图片进行了等比缩放和平移 + // 此处为了更好的显示对图片进行了等比缩放和平移(图片本身有点大) mPolyMatrix.postScale(0.26f, 0.26f); mPolyMatrix.postTranslate(0,200); } @@ -465,12 +468,119 @@ public class MstrixSetPolyToPolyTest extends View { } ``` +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f730v51dowj308c0etgm0.jpg) + +> **用setPolyToPoly这个方法可以制造类似于3D的透视效果。** + + + +**2.setRectToRect** + +```JAVA +boolean setRectToRect (RectF src, // 源区域 + RectF dst, // 目标区域 + Matrix.ScaleToFit stf) // 缩放适配模式 +``` + +简单来说就是将源矩形的内容填充到目标矩形中,然而在大多数的情况下,源矩形和目标矩形的长宽比是不一致的,到底该如何填充呢,这个填充的模式就由第三个参数 `stf` 来确定。 + +ScaleToFit 是一个枚举类型,共包含了四种模式: + +| 模式 | 摘要 | +| ------ | -------------------------- | +| CENTER | 居中,对src等比例缩放,将其居中放置在dst中。 | +| START | 顶部,对src等比例缩放,将其放置在dst的左上角。 | +| END | 底部,对src等比例缩放,将其放置在dst的右下角。 | +| FILL | 充满,拉伸src的宽和高,使其完全填充满dst。 | + +下面我们看一下不同宽高比的src与dst在不同模式下是怎样的。 + +> 假设灰色部分是dst,橙色部分是src,由于是测试不同宽高比,示例中让dst保持不变,看两种宽高比的src在不同模式下填充的位置。 + +| 状态 src | ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f737xedthmj308c050glf.jpg) | +| ------- | :--------------------------------------: | +| CENTER | ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f737xqulh9j308c050t8k.jpg) | +| START | ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f737y0ts9oj308c050glg.jpg) | +| END | ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f737zi7tm1j308c050a9w.jpg) | +| FILL | ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f737yj8pcrj308c0500sl.jpg) | + + + +下面用代码演示一下居中的示例: + +```java +public class MatrixSetRectToRectTest extends View { + + private static final String TAG = "MatrixSetRectToRectTest"; + + private int mViewWidth, mViewHeight; + + private Bitmap mBitmap; // 要绘制的图片 + private Matrix mRectMatrix; // 测试etRectToRect用的Matrix + + public MatrixSetRectToRectTest(Context context) { + super(context); + + mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rect_test); + mRectMatrix = new Matrix(); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mViewWidth = w; + mViewHeight = h; + + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + RectF src= new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight() ); + RectF dst = new RectF(0, 0, mViewWidth, mViewHeight ); + + // 核心要点 + mRectMatrix.setRectToRect(src,dst, Matrix.ScaleToFit.CENTER); + + // 根据Matrix绘制一个变换后的图片 + canvas.drawBitmap(mBitmap, mRectMatrix, new Paint()); + } +} +``` + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f7385r77wmj308c0etgm8.jpg) + + + +**3.rectStaysRect** + +判断矩形经过变换后是否仍为矩形,假如Matrix进行了平移、缩放则画布仅仅是位置和大小改变,矩形变换后仍然为矩形,但Matrix进行了非90度倍数的旋转或者错切,则矩形变换后就不再是矩形了,这个很好理解,不过多赘述,顺便说一下,前面的`mapRect`方法的返回值就是`rectStaysRect`的返回值。 + + + +**4.setSinCos** + +设置sinCos值,这个是控制Matrix旋转的,由于Matrix已经封装好了Rotate方法,所以这个并不常用,也不过多讲解。 + ### 矩阵相关 +矩阵相关的函数就属于哪一种非常靠近底层的东西了,向我们做App的一般不需要直接接触到这些东西,想要弄明白这个可以回去请教你们的线性代数老师,这里仅作概述。 + +| 方法 | 摘要 | +| ---------- | -------------- | +| invert | 求矩阵的逆矩阵 | +| isAffine | 判断当前矩阵是否为仿射矩阵。 | +| isIdentity | 判断当前矩阵是否为单位矩阵。 | + ## Matrix实用技巧 +通过前面的代码和示例,我们已经了解了Matrix大部分方法是如何使用的,这些基本的原理和方法通过组合可能会创造出神奇的东西,下面我就简要介绍几种我想到的小技巧,更多的大家可以开启自己的脑洞来发挥。 + +### 1.根据位置绘制不同的内容 + ## About ## 参考资料 diff --git a/QuickChart/Matrix.md b/QuickChart/Matrix.md index 4d7742a2..4f5c2905 100644 --- a/QuickChart/Matrix.md +++ b/QuickChart/Matrix.md @@ -1,15 +1,15 @@ # 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 | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... +| 方法类别 | 相关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 | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... | ## 相关文章 From d0635ffa31b262470c77b9335f020ffffe8d0608 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 24 Aug 2016 04:36:18 +0800 Subject: [PATCH 389/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 234 ++++++++++++++++++++++-- 1 file changed, 221 insertions(+), 13 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index d96698e5..eb3d7fd6 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -18,7 +18,7 @@ | 前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘变换 | | 后乘(post) | postConcat postRotate postScale postSkew postTranslate | 后乘变换 | | 特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 | -| 矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... | +| 矩阵相关 | invert isAffine(API21) isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... | ## Matrix方法详解 @@ -371,7 +371,7 @@ mapPoints: [600.0, 900.0] ### set、pre 与 post -对于四种基本变换 平移(translate)、缩放(scale)、旋转(rotate)、 错切(skew) 它们每一种都三种操作方法,分别为 设置(set)、 前乘(pre) 和 后乘 (post)。 +对于四种基本变换 平移(translate)、缩放(scale)、旋转(rotate)、 错切(skew) 它们每一种都三种操作方法,分别为 设置(set)、 前乘(pre) 和 后乘 (post)。而它们的基础是Concat,通过先构造出特殊矩阵然后用原始矩阵Concat特殊矩阵,达到变换的结果。 **关于四种基本变换的知识和三种对应操作的区别,详细可以参考 [Canvas之画布操作](http://www.gcssloop.com/2015/02/Canvas_Convert/) 和 [Matrix原理](http://www.gcssloop.com/2015/02/Matrix_Basic/) 这两篇文章的内容。** @@ -557,30 +557,238 @@ public class MatrixSetRectToRectTest extends View { **3.rectStaysRect** -判断矩形经过变换后是否仍为矩形,假如Matrix进行了平移、缩放则画布仅仅是位置和大小改变,矩形变换后仍然为矩形,但Matrix进行了非90度倍数的旋转或者错切,则矩形变换后就不再是矩形了,这个很好理解,不过多赘述,顺便说一下,前面的`mapRect`方法的返回值就是`rectStaysRect`的返回值。 +判断矩形经过变换后是否仍为矩形,假如Matrix进行了平移、缩放则画布仅仅是位置和大小改变,矩形变换后仍然为矩形,但Matrix进行了非90度倍数的旋转或者错切,则矩形变换后就不再是矩形了,这个很好理解,不过多赘述,顺便说一下,前面的`mapRect`方法的返回值就是根据`rectStaysRect`来判断的。 **4.setSinCos** -设置sinCos值,这个是控制Matrix旋转的,由于Matrix已经封装好了Rotate方法,所以这个并不常用,也不过多讲解。 +设置sinCos值,这个是控制Matrix旋转的,由于Matrix已经封装好了Rotate方法,所以这个并不常用,在此仅作概述。 + +```java +// 方法一 +void setSinCos (float sinValue, // 旋转角度的sin值 + float cosValue) // 旋转角度的cos值 + +// 方法二 +void setSinCos (float sinValue, // 旋转角度的sin值 + float cosValue, // 旋转角度的cos值 + float px, // 中心位置x坐标 + float py) // 中心位置y坐标 +``` + +简单测试: + +```java +Matrix matrix = new Matrix(); +// 旋转90度 +// sin90=1 +// cos90=0 +matrix.setSinCos(1f, 0f); + +Log.i(TAG, "setSinCos:"+matrix.toShortString()); + +// 重置 +matrix.reset(); + +// 旋转90度 +matrix.setRotate(90); + +Log.i(TAG, "setRotate:"+matrix.toShortString()); +``` + +结果: + +```shell +setSinCos:[0.0, -1.0, 0.0][1.0, 0.0, 0.0][0.0, 0.0, 1.0] +setRotate:[0.0, -1.0, 0.0][1.0, 0.0, 0.0][0.0, 0.0, 1.0] +``` + + ### 矩阵相关 -矩阵相关的函数就属于哪一种非常靠近底层的东西了,向我们做App的一般不需要直接接触到这些东西,想要弄明白这个可以回去请教你们的线性代数老师,这里仅作概述。 +矩阵相关的函数就属于哪一种非常靠近底层的东西了,大部分开发者很少直接接触这些东西,想要弄明白这个可以回去请教你们的线性代数老师,这里也仅作概述。 + +| 方法 | 摘要 | +| ---------- | ------------------------------- | +| invert | 求矩阵的逆矩阵 | +| isAffine | 判断当前矩阵是否为仿射矩阵,API21(5.0)才添加的方法。 | +| isIdentity | 判断当前矩阵是否为单位矩阵。 | + +**1.invert** + +求矩阵的逆矩阵,简而言之就是计算与之前相反的矩阵,如果之前是平移200px,则求的矩阵为反向平移200px,如果之前是缩小到0.5f,则结果是放大到2倍。 + +```java +boolean invert (Matrix inverse) +``` + +简单测试: + +```java +Matrix matrix = new Matrix(); +Matrix invert = new Matrix(); +matrix.setTranslate(200,500); + +Log.e(TAG, "before - matrix "+matrix.toShortString() ); + +Boolean result = matrix.invert(invert); + +Log.e(TAG, "after - result "+result ); +Log.e(TAG, "after - matrix "+matrix.toShortString() ); +Log.e(TAG, "after - invert "+invert.toShortString() ); +``` + +结果: + +```shell +before - matrix [1.0, 0.0, 200.0][0.0, 1.0, 500.0][0.0, 0.0, 1.0] +after - result true +after - matrix [1.0, 0.0, 200.0][0.0, 1.0, 500.0][0.0, 0.0, 1.0] +after - invert [1.0, 0.0, -200.0][0.0, 1.0, -500.0][0.0, 0.0, 1.0] +``` + + + +**2.isAffine** + +判断矩阵是否是仿射矩阵, 貌似并没有太大卵用,因为你无论如何操作结果始终都为true。 + +这是为什么呢?因为迄今为止我们使用的所有变换都是仿射变换,那变换出来的矩阵自然是仿射矩阵喽。 + +判断是否是仿射矩阵最重要的一点就是,直线是否仍为直线,简单想一下就知道,不论平移,旋转,错切,缩放,直线变换后最终仍为直线,要想让`isAffine`的结果变为false,除非你能把直线掰弯,我目前还没有找到能够掰弯的方法,所以我仍是直男(就算找到了,我依旧是直男)。 + +简单测试: + +```java +Matrix matrix = new Matrix(); +Log.i(TAG,"isAffine="+matrix.isAffine()); + +matrix.postTranslate(200,0); +matrix.postScale(0.5f, 1); +matrix.postSkew(0,1); +matrix.postRotate(56); + +Log.i(TAG,"isAffine="+matrix.isAffine()); +``` + +结果: + +```shell +isAffine=true +isAffine=true +``` + + + +**3.isIdentity** + +判断是否为单位矩阵,什么是单位矩阵呢,就是文章一开始的那个: + +![](http://latex.codecogs.com/png.latex?$$ +\\left [ +\\begin{matrix} +1 & 0 & 0 \\\\ +0 & 1 & 0 \\\\ +0 & 0 & 1 +\\end{1} +\\right ] +$$) + +新创建的Matrix和重置后的Matrix都是单位矩阵,不过,只要随意操作一步,就不在是单位矩阵了。 + +简单测试: + +```java +Matrix matrix = new Matrix(); +Log.i(TAG,"isIdentity="+matrix.isIdentity()); + +matrix.postTranslate(200,0); + +Log.i(TAG,"isIdentity="+matrix.isIdentity()); +``` + +结果: + +```shell +isIdentity=true +isIdentity=false +``` + -| 方法 | 摘要 | -| ---------- | -------------- | -| invert | 求矩阵的逆矩阵 | -| isAffine | 判断当前矩阵是否为仿射矩阵。 | -| isIdentity | 判断当前矩阵是否为单位矩阵。 | ## Matrix实用技巧 -通过前面的代码和示例,我们已经了解了Matrix大部分方法是如何使用的,这些基本的原理和方法通过组合可能会创造出神奇的东西,下面我就简要介绍几种我想到的小技巧,更多的大家可以开启自己的脑洞来发挥。 +通过前面的代码和示例,我们已经了解了Matrix大部分方法是如何使用的,这些基本的原理和方法通过组合可能会创造出神奇的东西,网上有很多教程讲Bitmap利用Matrix变换来制作镜像倒影等,这都属于Matrix的基本应用,我就不在赘述了,下面我简要介绍几种然并卵的小技巧,更多的大家可以开启自己的脑洞来发挥。 + +### 1.获取View在屏幕上的绝对位置 + +在之前的文章[Matrix原理](http://www.gcssloop.com/2015/02/Matrix_Basic/)中我们提到过Matrix最根本的作用就是坐标映射,将View的相对坐标映射为屏幕的绝对坐标,也提到过我们在onDraw函数的canvas中获取到到Matrix并不是单位矩阵,结合这两点,聪明的你肯定想到了我们可以从canvas的Matrix入手取得View在屏幕上的绝对位置。 + +不过,这也仅仅是一个然并卵的小技巧而已,使用`getLocationOnScreen`同样可以获取View在屏幕的位置,但如果你是想让下一任接盘侠弄不明白你在做什么或者是被同事打死的话,尽管这么做。 + +简单示例: + +```java +@Override +protected void onDraw(Canvas canvas) { + float[] values = new float[9]; + int[] location1 = new int[2]; + + Matrix matrix = canvas.getMatrix(); + matrix.getValues(values); + + location1[0] = (int) values[2]; + location1[1] = (int) values[5]; + Log.i(TAG, "location1 = " + Arrays.toString(location1)); + + int[] location2 = new int[2]; + this.getLocationOnScreen(location2); + Log.i(TAG, "location2 = " + Arrays.toString(location2)); +} +``` + +结果: + +```shell +location1 = [0, 243] +location2 = [0, 243] +``` + +### 2.利用setPolyToPoly制造3D效果 + +这个全凭大家想象力啦,不过我搜了一下还真搜到了好东西,之前鸿洋大大发过一篇博文详细讲解了利用setPolyToPoly制造的折叠效果布局,大家直接到他的博客去看吧,我就不写了。 -### 1.根据位置绘制不同的内容 +> 图片引用自鸿洋大大的博客,稍作了一下处理。 -## About +![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f74bvmz52mg308c0bbb29.gif) + +博文链接: + +**[Android FoldingLayout 折叠布局 原理及实现(一)](http://blog.csdn.net/lmj623565791/article/details/44278417)** + +**[Android FoldingLayout 折叠布局 原理及实现(二)](http://blog.csdn.net/lmj623565791/article/details/44283093)** + +## 总结 + +本篇基本讲解了Matrix相关的所有方法,应该是目前对Matrix讲解最全面的一篇中文文章了,建议配合上一篇[Matrix原理](http://www.gcssloop.com/2015/02/Matrix_Basic/)食用效果更佳。 + +由于本人水平有限,可能出于误解或者笔误难免出错,如果发现有问题或者对文中内容存在疑问欢迎在下面评论区告诉我,请对问题描述尽量详细,以帮助我可以快速找到问题根源。 + +## About Me + +### 作者微博: @GcsSloop + + ## 参考资料 + +[Matrix](https://developer.android.com/reference/android/graphics/Matrix.html) + +[Matrix.ScaleToFit](https://developer.android.com/reference/android/graphics/Matrix.ScaleToFit.html) + +[Android中图像变换Matrix的原理、代码验证和应用](http://biandroid.iteye.com/blog/1399462) + +[Understanding Affine Transformations With Matrix Mathematics](http://code.tutsplus.com/tutorials/understanding-affine-transformations-with-matrix-mathematics--active-10884) + From 8512a87877973c4a376fc2d9753949af839be7ed Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 24 Aug 2016 04:43:47 +0800 Subject: [PATCH 390/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index eb3d7fd6..cecd8f0f 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -1,4 +1,4 @@ -# Matrix方法 +# Matrix详解 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### 相关文章: [自定义View目录](http://www.gcssloop.com/1970/01/CustomViewIndex/) From 8cc56c88787ebae192ce5e3a4143fadf618d7943 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 24 Aug 2016 04:48:48 +0800 Subject: [PATCH 391/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index cecd8f0f..22907d9a 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -499,12 +499,12 @@ ScaleToFit 是一个枚举类型,共包含了四种模式: > 假设灰色部分是dst,橙色部分是src,由于是测试不同宽高比,示例中让dst保持不变,看两种宽高比的src在不同模式下填充的位置。 -| 状态 src | ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f737xedthmj308c050glf.jpg) | -| ------- | :--------------------------------------: | -| CENTER | ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f737xqulh9j308c050t8k.jpg) | -| START | ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f737y0ts9oj308c050glg.jpg) | -| END | ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f737zi7tm1j308c050a9w.jpg) | -| FILL | ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f737yj8pcrj308c0500sl.jpg) | +| src(原始状态) | ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f737xedthmj308c050glf.jpg) | +| :-------: | :--------------------------------------: | +| CENTER | ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f737xqulh9j308c050t8k.jpg) | +| START | ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f737y0ts9oj308c050glg.jpg) | +| END | ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f737zi7tm1j308c050a9w.jpg) | +| FILL | ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f737yj8pcrj308c0500sl.jpg) | From fa3240cd9674758e0ab679a90bcf59328d61a8b3 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 24 Aug 2016 04:53:39 +0800 Subject: [PATCH 392/615] Update --- CustomView/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CustomView/README.md b/CustomView/README.md index f4fe7725..16f99046 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -35,6 +35,12 @@

+******* + +

+ +

+ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From d319959dbff2ea3a411acae594117bd63d24183d Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 24 Aug 2016 04:55:42 +0800 Subject: [PATCH 393/615] Update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9630a7fd..a8126e62 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ * [安卓自定义View进阶 - Path完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B07%5DPath_Over.md) * [安卓自定义View进阶 - Path玩出花样(PathMeasure)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B08%5DPath_Play.md) * [安卓自定义View进阶 - Matrix原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B09%5DMatrix_Basic.md) + * [安卓自定义View进阶 - Matrix详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B10%5DMatrix_Method.md) ****** From 4f7316eaaa8f0ed63d25c39f70ffd3767913265d Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 25 Aug 2016 00:53:50 +0800 Subject: [PATCH 394/615] Update --- .../Advance/[02]Canvas_BasicGraphics.md | 61 +++++++++---------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/CustomView/Advance/[02]Canvas_BasicGraphics.md b/CustomView/Advance/[02]Canvas_BasicGraphics.md index 9fafb163..bd60cebc 100644 --- a/CustomView/Advance/[02]Canvas_BasicGraphics.md +++ b/CustomView/Advance/[02]Canvas_BasicGraphics.md @@ -19,18 +19,18 @@ Canvas我们可以称之为画布,能够在上面绘制各种东西,是安 ## 二.Canvas的常用操作速查表 -操作类型 | 相关API | 备注 ---- | --- | --- -绘制颜色 | drawColor, drawRGB, drawARGB | 使用单一颜色填充整个画布 -绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧 -绘制图片 | drawBitmap, drawPicture | 绘制位图和图片 -绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字 -绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数 -顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 -画布剪裁 | clipPath, clipRect | 设置画布的显示区域 -画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数 -画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 -Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放等操作的都是图像矩阵Matrix,只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 +| 操作类型 | 相关API | 备注 | +| ---------- | ---------------------------------------- | ---------------------------------------- | +| 绘制颜色 | drawColor, drawRGB, drawARGB | 使用单一颜色填充整个画布 | +| 绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧 | +| 绘制图片 | drawBitmap, drawPicture | 绘制位图和图片 | +| 绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字 | +| 绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数 | +| 顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 | +| 画布剪裁 | clipPath, clipRect | 设置画布的显示区域 | +| 画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数 | +| 画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 | +| Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放等操作的都是图像矩阵Matrix,只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 | > PS: Canvas常用方法在上面表格中已经全部列出了,当然还存在一些其他的方法未列出,具体可以参考官方文档 [Canvas](http://developer.android.com/reference/android/graphics/Canvas.html) @@ -49,7 +49,7 @@ Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放 ``` - + > 关于颜色的更多资料请参考[基础篇_颜色](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView%2FBase%2F%5B3%5DColor.md) ****** @@ -94,7 +94,6 @@ Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放 - ****** ### 绘制直线: @@ -109,7 +108,6 @@ Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放 - ****** ### 绘制矩形: @@ -191,7 +189,6 @@ Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放 其中灰色部分是我们所选定的矩形,而里面的圆角矩形则变成了一个椭圆,实际上在rx为宽度的一半,ry为高度的一半时,刚好是一个椭圆,通过上面我们分析的原理推算一下就能得到,而当rx大于宽度的一半,ry大于高度的一半时,实际上是无法计算出圆弧的,所以drawRoundRect对大于该数值的参数进行了限制(修正),凡是大于一半的参数均按照一半来处理。 - ****** ### 绘制椭圆: @@ -358,12 +355,12 @@ FILL_AND_STROKE //描边加填充 > 画布操作详细内容会在下一篇文章中讲解, 不是本文重点,但以下示例中可能会用到,所以此处简要介绍一下。 -相关操作 | 简要介绍 -----------|------------------------ -save | 保存当前画布状态 -restore | 回滚到上一次保存的状态 -translate | 相对于当前位置位移 -rotate | 旋转 +| 相关操作 | 简要介绍 | +| --------- | ----------- | +| save | 保存当前画布状态 | +| restore | 回滚到上一次保存的状态 | +| translate | 相对于当前位置位移 | +| rotate | 旋转 | ### 制作一个饼状图 @@ -409,20 +406,20 @@ PS: 以上省略了get set方法 ### 自定义View: 先按照自定义View流程梳理一遍(确定各个步骤应该做的事情): -步骤 | 关键字 | 作用 -:---:|-------------- | ----------------------- - 1 | 构造函数 | 初始化(初始化画笔Paint) - 2 | onMeasure | 测量View的大小(暂时不用关心) - 3 | onSizeChanged | 确定View大小(记录当前View的宽高) - 4 | onLayout | 确定子View布局(无子View,不关心) - 5 | onDraw | 实际绘制内容(绘制饼状图) - 6 | 提供接口 | 提供接口(提供设置数据的接口) +| 步骤 | 关键字 | 作用 | +| :--: | ------------- | --------------------- | +| 1 | 构造函数 | 初始化(初始化画笔Paint) | +| 2 | onMeasure | 测量View的大小(暂时不用关心) | +| 3 | onSizeChanged | 确定View大小(记录当前View的宽高) | +| 4 | onLayout | 确定子View布局(无子View,不关心) | +| 5 | onDraw | 实际绘制内容(绘制饼状图) | +| 6 | 提供接口 | 提供接口(提供设置数据的接口) | 代码如下: ``` java public class PieView extends View { - // 颜色表 + // 颜色表(注意: 此处定义颜色使用的是ARGB,带Alpha通道的) private int[] mColors = {0xFFCCFF00, 0xFF6495ED, 0xFFE32636, 0xFF800000, 0xFF808000, 0xFFFF8C69, 0xFF808080, 0xFFE6B800, 0xFF7CFC00}; // 饼状图初始绘制角度 @@ -524,7 +521,7 @@ public class PieView extends View { > **PS: 这个饼状图并没有添加百分比等数据,仅作为示例使用。** ## 总结: - + 其实自定义View只要按照流程一步步的走,也是比较容易的。不过里面也有不少坑,这些坑还是自己踩过印象比较深,建议大家不要直接copy源码,自己手打体验一下。 ## About Me From 7c9c2747dec357557e770279082329f44e4fc401 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 26 Aug 2016 05:46:41 +0800 Subject: [PATCH 395/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 22907d9a..e8759fd6 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -402,7 +402,7 @@ mapPoints: [600.0, 900.0] 这一类方法看似不起眼,但拿来稍微加工一下就可能制作意想不到的效果。 -**1.setPolyToPoly** +#### 1.setPolyToPoly ```java boolean setPolyToPoly ( @@ -472,7 +472,27 @@ public class MatrixSetPolyToPolyTest extends View { -> **用setPolyToPoly这个方法可以制造类似于3D的透视效果。** +文章发出后有小伙伴在GitHub上提出疑问,说此处讲解到并不清楚,尤其是最后的一个参数,所以特此补充一下内容。 + +我们知道`pointCount`支持点的个数为0到4个,四个一般指图形的四个角,属于最常用的一种情形,但前面几种是什么情况呢? + +> 发布此文的时候之所以没有讲解0到3的情况,是因为前面的几种情况在实际开发中基本不会出现,除非是极其特殊的情况,~~才不是因为偷懒呢,哼。~~ + + + +| pointCount | 摘要 | +| :--------: | --------------------- | +| 0 | 相当于`reset` | +| 1 | 相当于`translate` | +| 2 | 可以作 缩放、旋转、平移 变换 | +| 3 | 可以作 缩放、旋转、平移、错切 变换 | +| 4 | 可以作 缩放、旋转、平移、错切以及任何形变 | + +> 从上表我们可以观察出一个规律, 随着`pointCount`数值增大setPolyToPoly的可以操作性也越来越强,这不是废话么,可调整点数多了能干的事情自然也多了。 +> +> 只列一个表格就算交代完毕了显得诚意不足,为了彰显诚意,接下来详细的讲解一下。 + +魔力不足,正在蓄力中... From 274ef10bd4b0767d83858d7158874a9dc08d2b06 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 27 Aug 2016 14:54:24 +0800 Subject: [PATCH 396/615] Update Index --- CustomView/Advance/[10]Matrix_Method.md | 42 +++++++++++++------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index e8759fd6..416aebd6 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -27,7 +27,7 @@ 构造方法没有在上面表格中列出。 -**无参构造** +#### 无参构造 ``` java Matrix () @@ -51,7 +51,7 @@ Matrix matrix = new Matrix(); $$) -**有参构造** +#### 有参构造 ``` java Matrix (Matrix src) @@ -70,19 +70,19 @@ Matrix matrix = new Matrix(src); 基本方法内容比较简单,在此处简要介绍一下。 -**1.equals** +#### 1.equals 比较两个Matrix的数值是否相同。 -**2.hashCode** +#### 2.hashCode 获取Matrix的哈希值。 -**3.toString** +#### 3.toString 将Matrix转换为字符串: `Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}` -**4.toShortString** +#### 4.toShortString 将Matrix转换为短字符串: `[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]` @@ -91,7 +91,7 @@ Matrix matrix = new Matrix(src); 数值操作这一组方法可以帮助我们直接控制Matrix里面的数值。 -**1.set** +#### 1.set ``` java void set (Matrix src) @@ -99,7 +99,7 @@ void set (Matrix src) 没有返回值,有一个参数,作用是将参数Matrix的数值复制到当前Matrix中。如果参数为空,则重置当前Matrix,相当于`reset()`。 -**2.reset** +#### 2.reset ``` java void reset () @@ -107,7 +107,7 @@ void reset () 重置当前Matrix(将当前Matrix重置为单位矩阵)。 -**3.setValues** +#### 3.setValues ``` java void setValues (float[] values) @@ -115,7 +115,7 @@ void setValues (float[] values) setValues的参数是浮点型的一维数组,长度需要大于9,拷贝数组中的前9位数值赋值给当前Matrix。 -**4.getValues** +#### 4.getValues ``` java void getValues (float[] values) @@ -125,7 +125,7 @@ void getValues (float[] values) ### 数值计算 -**1.mapPoints** +#### 1.mapPoints ``` java void mapPoints (float[] pts) @@ -250,7 +250,7 @@ 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.mapRadius** +#### 2.mapRadius ``` java float mapRadius (float radius) @@ -283,7 +283,7 @@ mapRadius: 70.71068 ``` -**3.mapRect** +#### 3.mapRect ``` boolean mapRect (RectF rect) @@ -326,7 +326,7 @@ isRect: false (2) `boolean mapRect (RectF dst, RectF src)` 测量src并将测量结果放入dst中,返回值是判断矩形经过变换后是否仍为矩形,和之前没有什么太大区别,此处就不啰嗦了。 -**4.mapVectors** +#### 4.mapVectors 测量向量。 @@ -492,11 +492,13 @@ public class MatrixSetPolyToPolyTest extends View { > > 只列一个表格就算交代完毕了显得诚意不足,为了彰显诚意,接下来详细的讲解一下。 + + 魔力不足,正在蓄力中... -**2.setRectToRect** +#### 2.setRectToRect ```JAVA boolean setRectToRect (RectF src, // 源区域 @@ -575,13 +577,13 @@ public class MatrixSetRectToRectTest extends View { -**3.rectStaysRect** +#### 3.rectStaysRect 判断矩形经过变换后是否仍为矩形,假如Matrix进行了平移、缩放则画布仅仅是位置和大小改变,矩形变换后仍然为矩形,但Matrix进行了非90度倍数的旋转或者错切,则矩形变换后就不再是矩形了,这个很好理解,不过多赘述,顺便说一下,前面的`mapRect`方法的返回值就是根据`rectStaysRect`来判断的。 -**4.setSinCos** +#### 4.setSinCos 设置sinCos值,这个是控制Matrix旋转的,由于Matrix已经封装好了Rotate方法,所以这个并不常用,在此仅作概述。 @@ -636,7 +638,7 @@ setRotate:[0.0, -1.0, 0.0][1.0, 0.0, 0.0][0.0, 0.0, 1.0] | isAffine | 判断当前矩阵是否为仿射矩阵,API21(5.0)才添加的方法。 | | isIdentity | 判断当前矩阵是否为单位矩阵。 | -**1.invert** +#### 1.invert 求矩阵的逆矩阵,简而言之就是计算与之前相反的矩阵,如果之前是平移200px,则求的矩阵为反向平移200px,如果之前是缩小到0.5f,则结果是放大到2倍。 @@ -671,7 +673,7 @@ after - invert [1.0, 0.0, -200.0][0.0, 1.0, -500.0][0.0, 0.0, 1.0] -**2.isAffine** +#### 2.isAffine 判断矩阵是否是仿射矩阵, 貌似并没有太大卵用,因为你无论如何操作结果始终都为true。 @@ -702,7 +704,7 @@ isAffine=true -**3.isIdentity** +#### 3.isIdentity 判断是否为单位矩阵,什么是单位矩阵呢,就是文章一开始的那个: From 0d195b397308321f400563d82f9aea78334a4f46 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 28 Aug 2016 02:27:41 +0800 Subject: [PATCH 397/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 38 ++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 416aebd6..fea40a3d 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -476,7 +476,7 @@ public class MatrixSetPolyToPolyTest extends View { 我们知道`pointCount`支持点的个数为0到4个,四个一般指图形的四个角,属于最常用的一种情形,但前面几种是什么情况呢? -> 发布此文的时候之所以没有讲解0到3的情况,是因为前面的几种情况在实际开发中基本不会出现,除非是极其特殊的情况,~~才不是因为偷懒呢,哼。~~ +> 发布此文的时候之所以没有讲解0到3的情况,是因为前面的几种情况在实际开发中很少会出现, ~~才不是因为偷懒呢,哼。~~ @@ -494,6 +494,42 @@ public class MatrixSetPolyToPolyTest extends View { +**为什么说前面几种情况在实际开发中很少出现?** + +作为开发人员,写出来的代码出了要让机器"看懂",没有歧义之外,最重要的还是让人看懂,以方便后期的维护修改,从上边的表格中可以看出,前面的几种种情况都可以有更直观的替代方法,只有四个参数的情况下的特殊形变是没有替代方法的。 + + + +**pointCount为0** + +pointCount为0和`reset`是等价的,而不是保持matrix不变,在最底层的实现中可以看到这样的代码: + +```c++ +if (0 == count) { + this->reset(); + return true; +} +``` + + + +**pointCount为1** + +pointCount为0和`translate`是等价的,在最底层的实现中可以看到这样的代码: + +```c++ +if (1 == count) { + this->setTranslate(dst[0].fX - src[0].fX, dst[0].fY - src[0].fY); + return true; +} +``` + +> 平移的距离是dst - src. + + + + + 魔力不足,正在蓄力中... From 36ad37e95c5ff9f4a96d8b7d64bd851ba5bd4a03 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 28 Aug 2016 23:31:18 +0800 Subject: [PATCH 398/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index fea40a3d..d0d1345f 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -500,6 +500,14 @@ public class MatrixSetPolyToPolyTest extends View { +**控制点的选取和作用范围:** + +控制点你可以选择任何位置,不过为了便于理解和使用,一般会选择特殊点,例如:图形的四个角,边线的中心点以及图形的中心点,当然了,只要是你觉得方便的点都可以选取。不过又一点需要注意,选取点和映射点都应当是不重复且相同的 + +关于作用范围当然是设置了Matrix的全部范围,如果你将这个Matrix赋值给了Canvas,它的作用范围就是整个Canvas,如果你赋值给了Bitmap,它的作用范围就是整张图片。但是如果你仅仅测量并改变了图片的一部分,那么剩余的部分将会延续下去。 + + + **pointCount为0** pointCount为0和`reset`是等价的,而不是保持matrix不变,在最底层的实现中可以看到这样的代码: @@ -528,6 +536,10 @@ if (1 == count) { +**pointCount为2** + +当pointCount为2的时候,可以做缩放、平移和旋转,对于这两个控制点 + 魔力不足,正在蓄力中... From e3238a2284aed01d34919041798aa2731784cb97 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 29 Aug 2016 20:30:57 +0800 Subject: [PATCH 399/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index d0d1345f..f59d44b2 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -502,11 +502,13 @@ public class MatrixSetPolyToPolyTest extends View { **控制点的选取和作用范围:** -控制点你可以选择任何位置,不过为了便于理解和使用,一般会选择特殊点,例如:图形的四个角,边线的中心点以及图形的中心点,当然了,只要是你觉得方便的点都可以选取。不过又一点需要注意,选取点和映射点都应当是不重复且相同的 +控制点你可以选择任何位置,不过为了便于理解和使用,一般会选择特殊点,例如:图形的四个角,边线的中心点以及图形的中心点,当然了,只要是你觉得方便的点都可以选取。不过有一点需要注意,**选取点和映射点都应当是不重复的,如果选取了重复的点会直接导致测量失效,这也意味着,你不允许将一个方形映射为三角形(可以接近于三角形)**。 -关于作用范围当然是设置了Matrix的全部范围,如果你将这个Matrix赋值给了Canvas,它的作用范围就是整个Canvas,如果你赋值给了Bitmap,它的作用范围就是整张图片。但是如果你仅仅测量并改变了图片的一部分,那么剩余的部分将会延续下去。 +关于作用范围当然是设置了Matrix的全部范围,如果你将这个Matrix赋值给了Canvas,它的作用范围就是整个Canvas,如果你赋值给了Bitmap,它的作用范围就是整张图片。但是如果你仅仅测量并改变了图片的一部分,那么剩余的部分也会改变,不过并不推荐这么做,因为这样做你可能会得到一些异常的结果,这是底层逻辑导致的,由于其是根据你选取的映射区域来反向推导构建出来的Matrix,所以在你选取的区域直接结果是没有问题的,但在区域之外的结果可能与你想要的会存在差别。 +***** +**以下示例的src均为图片大小,dst根据手势变化。** **pointCount为0** From 81f66e9e37f26840d4efbbe4b5321078dce1fe85 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 30 Aug 2016 03:21:34 +0800 Subject: [PATCH 400/615] 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 f59d44b2..d227a655 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 From f5f80177928ce03ab2edd93826be612460bb5fd4 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 30 Aug 2016 04:16:19 +0800 Subject: [PATCH 401/615] Add Test Code --- CustomView/Advance/Code/SetPolyToPoly.java | 129 +++++++++++++ CustomView/Advance/Code/SetPolyToPoly.md | 213 +++++++++++++++++++++ 2 files changed, 342 insertions(+) create mode 100644 CustomView/Advance/Code/SetPolyToPoly.java create mode 100644 CustomView/Advance/Code/SetPolyToPoly.md diff --git a/CustomView/Advance/Code/SetPolyToPoly.java b/CustomView/Advance/Code/SetPolyToPoly.java new file mode 100644 index 00000000..d905ae91 --- /dev/null +++ b/CustomView/Advance/Code/SetPolyToPoly.java @@ -0,0 +1,129 @@ +package com.gcssloop.canvas; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +import com.gcssloop.view.utils.CanvasAidUtils; + +/** + * Author: GcsSloop + *

+ * Created Date: 16/8/26 + *

+ * Copyright (C) 2016 GcsSloop. + *

+ * GitHub: https://github.com/GcsSloop + */ +public class SetPolyToPoly extends View{ + private static final String TAG = "SetPolyToPoly"; + + private int testPoint = 0; + private int triggerRadius = 180; // 触发半径为180px + + private Bitmap mBitmap; // 要绘制的图片 + private Matrix mPolyMatrix; // 测试setPolyToPoly用的Matrix + + private float[] src = new float[8]; + private float[] dst = new float[8]; + + private Paint pointPaint; + + public SetPolyToPoly(Context context) { + this(context, null); + } + + public SetPolyToPoly(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SetPolyToPoly(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initBitmapAndMatrix(); + } + + private void initBitmapAndMatrix() { + mBitmap = BitmapFactory.decodeResource(getResources(), + R.drawable.poly_test2); + + float[] temp = {0, 0, // 左上 + mBitmap.getWidth(), 0, // 右上 + mBitmap.getWidth(), mBitmap.getHeight(), // 右下 + 0, mBitmap.getHeight()}; // 左下 + src = temp.clone(); + dst = temp.clone(); + + pointPaint = new Paint(); + pointPaint.setAntiAlias(true); + pointPaint.setStrokeWidth(50); + pointPaint.setColor(0xffd19165); + pointPaint.setStrokeCap(Paint.Cap.ROUND); + + mPolyMatrix = new Matrix(); + mPolyMatrix.setPolyToPoly(src, 0, src, 0, 4); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + + switch (event.getAction()){ + case MotionEvent.ACTION_MOVE: + float tempX = event.getX(); + float tempY = event.getY(); + + // 根据触控位置改变dst + for (int i=0; i 4 || testPoint < 0 ? 4 : testPoint; + dst = src.clone(); + resetPolyMatrix(this.testPoint); + invalidate(); + } +} diff --git a/CustomView/Advance/Code/SetPolyToPoly.md b/CustomView/Advance/Code/SetPolyToPoly.md new file mode 100644 index 00000000..3988fac2 --- /dev/null +++ b/CustomView/Advance/Code/SetPolyToPoly.md @@ -0,0 +1,213 @@ +# Matrix setPolyTOPoly 测试代码 + +## SetPolyToPoly.java + +```java +public class SetPolyToPoly extends View{ + private static final String TAG = "SetPolyToPoly"; + + private int testPoint = 0; + private int triggerRadius = 180; // 触发半径为180px + + private Bitmap mBitmap; // 要绘制的图片 + private Matrix mPolyMatrix; // 测试setPolyToPoly用的Matrix + + private float[] src = new float[8]; + private float[] dst = new float[8]; + + private Paint pointPaint; + + public SetPolyToPoly(Context context) { + this(context, null); + } + + public SetPolyToPoly(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SetPolyToPoly(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initBitmapAndMatrix(); + } + + private void initBitmapAndMatrix() { + mBitmap = BitmapFactory.decodeResource(getResources(), + R.drawable.poly_test2); + + float[] temp = {0, 0, // 左上 + mBitmap.getWidth(), 0, // 右上 + mBitmap.getWidth(), mBitmap.getHeight(), // 右下 + 0, mBitmap.getHeight()}; // 左下 + src = temp.clone(); + dst = temp.clone(); + + pointPaint = new Paint(); + pointPaint.setAntiAlias(true); + pointPaint.setStrokeWidth(50); + pointPaint.setColor(0xffd19165); + pointPaint.setStrokeCap(Paint.Cap.ROUND); + + mPolyMatrix = new Matrix(); + mPolyMatrix.setPolyToPoly(src, 0, src, 0, 4); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + + switch (event.getAction()){ + case MotionEvent.ACTION_MOVE: + float tempX = event.getX(); + float tempY = event.getY(); + + // 根据触控位置改变dst + for (int i=0; i 4 || testPoint < 0 ? 4 : testPoint; + dst = src.clone(); + resetPolyMatrix(this.testPoint); + invalidate(); + } +} +``` + +***** + +## 布局文件 + +``` xml + + + + + + + + + + + + + + + + + +``` + +***** + +## MainActivity + +``` java +setContentView(R.layout.activity_main); + +final SetPolyToPoly poly = (SetPolyToPoly) findViewById(R.id.poly); + +RadioGroup group = (RadioGroup) findViewById(R.id.group); +assert group != null; +group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(RadioGroup group, int checkedId) { + switch (group.getCheckedRadioButtonId()){ + case R.id.point0: poly.setTestPoint(0); break; + case R.id.point1: poly.setTestPoint(1); break; + case R.id.point2: poly.setTestPoint(2); break; + case R.id.point3: poly.setTestPoint(3); break; + case R.id.point4: poly.setTestPoint(4); break; + } + } +}); +``` + +***** + +## 依赖的库 + +绘制坐标系部分依赖了一个开源库。 + +* [ViewSupport](https://github.com/GcsSloop/ViewSupport ) + + From 5dfb11d0b6e281569b2f19386976d28b57494658 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 30 Aug 2016 04:19:35 +0800 Subject: [PATCH 402/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index d227a655..a46027af 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -560,6 +560,8 @@ if (1 == count) { 上面已经用图例比较详细的展示了不同操控点个数的情况,如果你依旧存在疑问,可以获取代码自己试一下。 +#### [点击此处查看setPolyToPoly测试代码](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/Code/SetPolyToPoly.md) + #### 2.setRectToRect ```JAVA From db567af9d248450646c9df346b1aebadb4afa11c Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 30 Aug 2016 04:34:48 +0800 Subject: [PATCH 403/615] Update --- CustomView/Advance/[10]Matrix_Method.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index a46027af..6d7b0a0c 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -508,7 +508,7 @@ public class MatrixSetPolyToPolyTest extends View { ***** -**一下用示例演示一下,所有示例的src均为图片大小,dst根据手势变化。** +**接下来用示例演示一下,所有示例的src均为图片大小,dst根据手势变化。** **pointCount为0** From d2191236700a0521bd566ddc09a4eec8aea7c2e6 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 31 Aug 2016 00:35:16 +0800 Subject: [PATCH 404/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 CustomView/Advance/[11]Matrix_3D_Camera.md diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md new file mode 100644 index 00000000..e69de29b From 9c160464b8bb47b4d2416d29dfb6d6ebbbd0a38f Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 31 Aug 2016 17:03:04 +0800 Subject: [PATCH 405/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index e69de29b..f194327f 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -0,0 +1,2 @@ +# Matrix相机 + From 2c6d676f4d60e1f82f2d544dc96d45628fc962e1 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 1 Sep 2016 04:51:26 +0800 Subject: [PATCH 406/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index f194327f..6f6c55e0 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -1,2 +1,14 @@ # Matrix相机 +### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) +### 相关文章: [自定义View目录](http://www.gcssloop.com/1970/01/CustomViewIndex/) + + + + +## About Me + +### 作者微博: @GcsSloop + + + From cc43b6832a6c16c7990916f03d02b7e6a04efe8b Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 2 Sep 2016 20:02:14 +0800 Subject: [PATCH 407/615] Update --- LICENSE | 202 -------------------------------------------------------- 1 file changed, 202 deletions(-) delete mode 100644 LICENSE diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 8f71f43f..00000000 --- a/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - From b4ee510630fe8e17dd4b16b28654f9437a296074 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 3 Sep 2016 04:11:43 +0800 Subject: [PATCH 408/615] Update --- QuickChart/Matrix.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/QuickChart/Matrix.md b/QuickChart/Matrix.md index 4f5c2905..5aecb593 100644 --- a/QuickChart/Matrix.md +++ b/QuickChart/Matrix.md @@ -9,8 +9,9 @@ | 前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘变换 | | 后乘(post) | postConcat postRotate postScale postSkew postTranslate | 后乘变换 | | 特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 | -| 矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... | +| 矩阵相关 | invert isAffine(API21) isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... | ## 相关文章 -* [Matrix原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B09%5DMatrix_Basic.md) +* [Matrix原理](http://www.gcssloop.com/2015/02/Matrix_Basic/) +* [Matrix详解](http://www.gcssloop.com/2015/02/Matrix_Method/) From 9b71511ecb89da70f9773ca3abd52b1de567c8fd Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 5 Sep 2016 05:22:40 +0800 Subject: [PATCH 409/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index 6f6c55e0..8b51ce7e 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -1,9 +1,9 @@ -# Matrix相机 +# Matrix-Camera ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### 相关文章: [自定义View目录](http://www.gcssloop.com/1970/01/CustomViewIndex/) - +前面用了两篇文章帮助大家了解了Matrix的作用、原理以及用法。本文继续讲解Matrix相关的知识,如题,本文的主角是Camera,翻译过来叫做相机,但这个并不是我们拍照用的相机。 ## About Me From 9e2d1bccf95c3be6f54f469ce273751695359846 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 5 Sep 2016 10:19:33 +0800 Subject: [PATCH 410/615] Update --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index a8126e62..949bad49 100644 --- a/README.md +++ b/README.md @@ -73,9 +73,6 @@ * [LeafLoading - 进度条](https://github.com/GcsSloop/LeafLoading) * [Rotate3dAnimation - 3D旋转动画(修正版)](https://github.com/GcsSloop/Rotate3dAnimation) -[![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f72pfdbrh5j305k01vt8m.jpg)](http://www.gcssloop.com/1970/01/contribute/) - - ## 传送门 通往异世界的传送门,请谨慎使用。 @@ -105,6 +102,6 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) - + [▲ 回到顶部](#top) From 93c58ff689f37e0ffe45bfb7eb0b55c2c5aa4114 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 6 Sep 2016 16:03:06 +0800 Subject: [PATCH 411/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index 8b51ce7e..efaed864 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -3,7 +3,7 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### 相关文章: [自定义View目录](http://www.gcssloop.com/1970/01/CustomViewIndex/) -前面用了两篇文章帮助大家了解了Matrix的作用、原理以及用法。本文继续讲解Matrix相关的知识,如题,本文的主角是Camera,翻译过来叫做相机,但这个并不是我们拍照用的相机。 +看标题就知道本篇依旧属于Matrix,不过后面多了一个Camera,Camera我们都知道是相机的意思,不过本文中的相机并不是现实中的相机,而是专业给Matrix拍照的相机。 ## About Me From 412aea3e74b00831b9ee08637efb881860d52b56 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 7 Sep 2016 03:04:13 +0800 Subject: [PATCH 412/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index efaed864..359f4269 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -3,7 +3,27 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### 相关文章: [自定义View目录](http://www.gcssloop.com/1970/01/CustomViewIndex/) -看标题就知道本篇依旧属于Matrix,不过后面多了一个Camera,Camera我们都知道是相机的意思,不过本文中的相机并不是现实中的相机,而是专业给Matrix拍照的相机。 +本篇依旧属于Matrix,主要讲解Camera,Android下有很相机应用,其中的美颜相机更是不少,不过今天这个Camera可不是我们平时拍照的那个相机,而是graphic包下的Camera,专业给Matrix拍照的相机,不过既然是相机,作用都是类似的,主要是将3D的内容拍扁变成2D的内容。 + +众所周知,我们的手机屏幕是一个2D的平面,所以也没办法直接显示3D的信息,因此我们看到的所有3D效果都是3D在2D平面的投影而已,而本文中的Camera主要作用就是这个,将3D信息转换为2D平面上的投影,我们应用中大多数3D效果都离不开这个类,而它将3D转换为2D投影的桥梁则是Matrix。 + + + +## Camera常用方法表 + +按照惯例,先放表。 + + + +| 返回值 | 方法 | +| ---- | ---------------------------------------- | +| | Camera()
构造方法,创建一个空的Camera。 | +| void | applyToCanvas(Canvas canvas)
将当前的Camera变换应用到Canvas。 | +| | | +| | | +| | | + + ## About Me From ec03e665324ce73ab2c21f4340c3f1957902ea17 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 8 Sep 2016 00:30:02 +0800 Subject: [PATCH 413/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 39 ++++++++++++++++------ 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index 359f4269..d816d3d4 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -1,28 +1,47 @@ # Matrix-Camera ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### 相关文章: [自定义View目录](http://www.gcssloop.com/1970/01/CustomViewIndex/) +### 相关文章: [自定义View目录](http://www.gcssloop.com/customview/CustomViewIndex/) 本篇依旧属于Matrix,主要讲解Camera,Android下有很相机应用,其中的美颜相机更是不少,不过今天这个Camera可不是我们平时拍照的那个相机,而是graphic包下的Camera,专业给Matrix拍照的相机,不过既然是相机,作用都是类似的,主要是将3D的内容拍扁变成2D的内容。 -众所周知,我们的手机屏幕是一个2D的平面,所以也没办法直接显示3D的信息,因此我们看到的所有3D效果都是3D在2D平面的投影而已,而本文中的Camera主要作用就是这个,将3D信息转换为2D平面上的投影,我们应用中大多数3D效果都离不开这个类,而它将3D转换为2D投影的桥梁则是Matrix。 +众所周知,我们的手机屏幕是一个2D的平面,所以也没办法直接显示3D的信息,因此我们看到的所有3D效果都是3D在2D平面的投影而已,而本文中的Camera主要作用就是这个,将3D信息转换为2D平面上的投影,实际上这个类更像是一个操作Matrix的工具类,使用Camera和Matrix可以在不使用OpenGL的情况下制作出简单的3D效果。 ## Camera常用方法表 -按照惯例,先放表。 +| 方法类别 | 相关 | 简介 | +| ---- | ---------------------------------------- | -------------- | +| 基本方法 | [save](#基本方法)、[restore](#基本方法) | 保存、 回滚 | +| 常用方法 | getMatrix、applyToCanvas | 获取Matrix、应用到画布 | +| 旋转 | rotate、rotateX、rotateY、rotateZ | 各种旋转 | +| 平移 | translate | 位移 | +| 相机位置 | setLocation、getLocationX、getLocationY、getLocationZ | 设置与获取相机位置 | +> Camera的方法并不是特别多,很多内容与之前的讲解的Canvas和Matrix类似,不过又稍有不同,之前的画布操作和Matrix主要是作用于2D空间,而Camera则主要作用于3D空间。 -| 返回值 | 方法 | -| ---- | ---------------------------------------- | -| | Camera()
构造方法,创建一个空的Camera。 | -| void | applyToCanvas(Canvas canvas)
将当前的Camera变换应用到Canvas。 | -| | | -| | | -| | | +## 基本方法 + +基本方法就有两个`save` 和`restore`,主要作用为`保存当前状态和恢复到上一次保存的状态`,通常成对使用,常用格式如下: + +```java +camera.save(); // 保存状态 +... // 具体操作 +camera.retore(); // 回滚状态 +``` + + + +## 常用方法 + +这两个方法是Camera中最基础也是最常用的方法。 + +#### getMatrix + +获取当前状态下的矩阵。 From cc6abbe1c32339b13c1e2acbc7def3c9fd1fe539 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 9 Sep 2016 23:30:30 +0800 Subject: [PATCH 414/615] =?UTF-8?q?=E8=AE=A9Jitpack=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Course/jitpack-javadoc.md | 103 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 Course/jitpack-javadoc.md diff --git a/Course/jitpack-javadoc.md b/Course/jitpack-javadoc.md new file mode 100644 index 00000000..b5d1af09 --- /dev/null +++ b/Course/jitpack-javadoc.md @@ -0,0 +1,103 @@ +# 让JitPack支持Javadoc + +很早之前写过一篇[用JitPack发布Android开源库](http://www.gcssloop.com/course/PublishLibraryByJitPack/)的文章,有小伙伴反应说**发到JitPack上的开源库没有文档注释,使用起来很不方便。** + +这算是我的失误,上一篇文章只是讲解了如何使用JitPack发布开源库,最终发布的只有arr(即编译好的动态链接库),不仅没有文档注释,也没有源码,本次就教大家如何在发布同时添加上源码和注释。 + +由于JitPack本身就是一个自定义Maven仓库,所以配置方式与Maven类似。 + + + +### 配置项目的 build.gradle + +项目的 build.gradle 配置和上一篇一样,没有变化。 + +```java +buildscript { + dependencies { + // 重点就是下面这一行(上面两行是为了定位这一行的添加位置) + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' +``` + + + +### 配置 Library 的 build.gradle + +完整示例(重点内容已经用注释标出): + +```java +apply plugin: 'com.android.library' +apply plugin: 'com.github.dcendents.android-maven' // 添加这个 + +group='com.github.GcsSloop' // 指定group,com.github.<用户名> + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.3" + + defaultConfig { + minSdkVersion 7 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' + compile 'com.android.support:appcompat-v7:23.4.0' +} + +//--------------------------------------------- + +// 指定编码 +tasks.withType(JavaCompile) { + options.encoding = "UTF-8" +} + +// 打包源码 +task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' +} + +task javadoc(type: Javadoc) { + failOnError false + source = android.sourceSets.main.java.sourceFiles + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + classpath += configurations.compile +} + +// 制作文档(Javadoc) +task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir +} + +artifacts { + archives sourcesJar + archives javadocJar +} +``` + + + +### 发布参照上一篇文章: [使用JitPack发布开源库](http://www.gcssloop.com/course/PublishLibraryByJitPack/) + + + +### 查看在线文档 + +如果你在JitPack配置了文档支持,你可以在线查看。 + +查看地址是 `https://jitpack.io/com/github/USER/REPO/VERSION/javadoc/` + +例如我的一个开源库: https://jitpack.io/com/github/GcsSloop/ViewSupport/v1.2.2/javadoc/ + From 4f8d9422b9f65c9d9f66e1703394525062d955c3 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 9 Sep 2016 23:31:04 +0800 Subject: [PATCH 415/615] Update --- Course/jitpack-javadoc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Course/jitpack-javadoc.md b/Course/jitpack-javadoc.md index b5d1af09..b396ca0f 100644 --- a/Course/jitpack-javadoc.md +++ b/Course/jitpack-javadoc.md @@ -1,4 +1,4 @@ -# 让JitPack支持Javadoc +# 让JitPack支持Javadoc和源码 很早之前写过一篇[用JitPack发布Android开源库](http://www.gcssloop.com/course/PublishLibraryByJitPack/)的文章,有小伙伴反应说**发到JitPack上的开源库没有文档注释,使用起来很不方便。** From 105497a49e4010f5513fa050cc6bb17279799553 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 9 Sep 2016 23:36:38 +0800 Subject: [PATCH 416/615] Update --- Course/jitpack-javadoc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Course/jitpack-javadoc.md b/Course/jitpack-javadoc.md index b396ca0f..1d1882d0 100644 --- a/Course/jitpack-javadoc.md +++ b/Course/jitpack-javadoc.md @@ -1,4 +1,4 @@ -# 让JitPack支持Javadoc和源码 +# 用JitPack发布时添加文档和源码 很早之前写过一篇[用JitPack发布Android开源库](http://www.gcssloop.com/course/PublishLibraryByJitPack/)的文章,有小伙伴反应说**发到JitPack上的开源库没有文档注释,使用起来很不方便。** From 4aa30d0e6372c275738c485c3e358c2a8c1aca94 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 9 Sep 2016 23:38:47 +0800 Subject: [PATCH 417/615] Update --- Course/jitpack-javadoc.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Course/jitpack-javadoc.md b/Course/jitpack-javadoc.md index 1d1882d0..d43ac8a6 100644 --- a/Course/jitpack-javadoc.md +++ b/Course/jitpack-javadoc.md @@ -1,10 +1,8 @@ # 用JitPack发布时添加文档和源码 -很早之前写过一篇[用JitPack发布Android开源库](http://www.gcssloop.com/course/PublishLibraryByJitPack/)的文章,有小伙伴反应说**发到JitPack上的开源库没有文档注释,使用起来很不方便。** +很早之前写过一篇[用JitPack发布Android开源库](http://www.gcssloop.com/course/PublishLibraryByJitPack/)的文章,有小伙伴反应说**发到JitPack上的开源库没有文档注释,使用起来很不方便**,这算是我的失误,上一篇文章只是讲解了如何使用JitPack发布开源库,最终发布的只有arr(即编译好的动态链接库),不仅没有文档注释(Javadoc),也没有源码(sources),本次就教大家如何在发布同时添加上注释和源码。 -这算是我的失误,上一篇文章只是讲解了如何使用JitPack发布开源库,最终发布的只有arr(即编译好的动态链接库),不仅没有文档注释,也没有源码,本次就教大家如何在发布同时添加上源码和注释。 - -由于JitPack本身就是一个自定义Maven仓库,所以配置方式与Maven类似。 +**由于JitPack本身就是一个自定义Maven仓库,所以配置方式与Maven基本一样。** From 609017e7fa8b7fe4889f9915393a08a7519c0fd6 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 9 Sep 2016 23:45:51 +0800 Subject: [PATCH 418/615] Update --- Course/jitpack-javadoc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Course/jitpack-javadoc.md b/Course/jitpack-javadoc.md index d43ac8a6..611a9b1f 100644 --- a/Course/jitpack-javadoc.md +++ b/Course/jitpack-javadoc.md @@ -93,7 +93,7 @@ artifacts { ### 查看在线文档 -如果你在JitPack配置了文档支持,你可以在线查看。 +如果你在JitPack配置了文档和源码支持,在引用同时就能看到源码的文档,不仅如此,你也可以在线查看。 查看地址是 `https://jitpack.io/com/github/USER/REPO/VERSION/javadoc/` From d5bdf70e9500e18374f9d399fef5c320b635207a Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 10 Sep 2016 01:57:36 +0800 Subject: [PATCH 419/615] Update --- Course/jitpack-javadoc.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Course/jitpack-javadoc.md b/Course/jitpack-javadoc.md index 611a9b1f..0adc2dd5 100644 --- a/Course/jitpack-javadoc.md +++ b/Course/jitpack-javadoc.md @@ -1,6 +1,6 @@ -# 用JitPack发布时添加文档和源码 +# 用JitPack发布时附加文档和源码 -很早之前写过一篇[用JitPack发布Android开源库](http://www.gcssloop.com/course/PublishLibraryByJitPack/)的文章,有小伙伴反应说**发到JitPack上的开源库没有文档注释,使用起来很不方便**,这算是我的失误,上一篇文章只是讲解了如何使用JitPack发布开源库,最终发布的只有arr(即编译好的动态链接库),不仅没有文档注释(Javadoc),也没有源码(sources),本次就教大家如何在发布同时添加上注释和源码。 +很早之前写过一篇[用JitPack发布Android开源库](http://www.gcssloop.com/course/PublishLibraryByJitPack/)的文章,有小伙伴反馈说**发布到JitPack上的开源库没有文档注释,使用起来很不方便**,这是我的失误,上一篇文章只是讲解了如何使用JitPack发布开源库,最终发布的只有arr(即编译好的动态链接库),不仅没有文档注释(Javadoc),也没有源码(sources),本次就教大家如何在发布同时添加上注释和源码。 **由于JitPack本身就是一个自定义Maven仓库,所以配置方式与Maven基本一样。** From bb5dc7eac153632fa0f9cce394205896d1867793 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 10 Sep 2016 16:32:52 +0800 Subject: [PATCH 420/615] Update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 949bad49..d24d60d0 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ * [在AndroidStudio中使用PlantUML(Win)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/HowToUsePlantUMLInAS.md) * [在AndroidStudio中使用PlantUML(Mac)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/HowToUsePlantUMLInAS%5BMac%5D.md) * [优雅的发布Android开源库(论JitPack的优越性)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/ReleaseLibraryByJitPack.md) +* [用JitPack发布时附加文档和源码](https://github.com/GcsSloop/AndroidNote/blob/master/Course/jitpack-javadoc.md) ****** From 5c67d6c3ad9e32b541e5f59bde6bdd333050c83d Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 10 Sep 2016 16:36:53 +0800 Subject: [PATCH 421/615] Update --- Course/jitpack-javadoc.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Course/jitpack-javadoc.md b/Course/jitpack-javadoc.md index 0adc2dd5..bf7176dd 100644 --- a/Course/jitpack-javadoc.md +++ b/Course/jitpack-javadoc.md @@ -99,3 +99,5 @@ artifacts { 例如我的一个开源库: https://jitpack.io/com/github/GcsSloop/ViewSupport/v1.2.2/javadoc/ +在线API文档样式: +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f7o8gabelfj31400mbjy0.jpg) \ No newline at end of file From 293548e207b9d996db5de5929911657b91c873e7 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 10 Sep 2016 16:39:39 +0800 Subject: [PATCH 422/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 59 ++++++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index d816d3d4..1d70668c 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -13,16 +13,51 @@ | 方法类别 | 相关 | 简介 | | ---- | ---------------------------------------- | -------------- | -| 基本方法 | [save](#基本方法)、[restore](#基本方法) | 保存、 回滚 | +| 基本方法 | save、restore | 保存、 回滚 | | 常用方法 | getMatrix、applyToCanvas | 获取Matrix、应用到画布 | -| 旋转 | rotate、rotateX、rotateY、rotateZ | 各种旋转 | +| 旋转 | rotat (API 21)、rotateX、rotateY、rotateZ | 各种旋转 | | 平移 | translate | 位移 | -| 相机位置 | setLocation、getLocationX、getLocationY、getLocationZ | 设置与获取相机位置 | +| 相机位置 | setLocation (API 12)、getLocationX (API 16)、getLocationY (API 16)、getLocationZ (API 16) | 设置与获取相机位置 | > Camera的方法并不是特别多,很多内容与之前的讲解的Canvas和Matrix类似,不过又稍有不同,之前的画布操作和Matrix主要是作用于2D空间,而Camera则主要作用于3D空间。 +## 基础概念 + +在具体讲解方法之前,先补充几个基础概念,以便于后面理解。 + +#### 3D坐标系 + +我们Camera使用的3维坐标系是**左手坐标系,即左手手臂指向x轴正方向,四指弯曲指向y轴正方向,此时展开大拇指指向的方向是z轴正方向**。 + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f7mruav2nhj308c05iglp.jpg) + +> 至于为什么要用左手坐标系呢?~~大概是因为赶工的时候右手不方便比划吧,大雾。~~实际上不同平台上使用的坐标系也有不同,有的是左手,有的是右手,貌似并没有统一的标准,只需要记住 Android 平台上面使用的是左手坐标系即可。 + +不过此处需要注意一下 Android 中 2D坐标系 和 3D坐标系 的一些差别。 + +| 坐标系 | 2D坐标系 | 3D坐标系 | +| ------- | :---: | :----: | +| 原点默认位置 | 左上角 | 左上角 | +| X 轴默认方向 | 右 | 右 | +| Y 轴默认方向 | 下 | 上 | +| Z 轴默认方向 | 无 | 垂直屏幕向内 | + +3D坐标系在屏幕中各个坐标轴默认方向展示: + +> 注意y轴默认方向是向上,而2D则是向下。 + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f7nxn8hcqqj308c0ea74a.jpg) + +#### 三维投影 + +**三维投影**是将三维空间中的点映射到二维平面上的方法。由于目前绝大多数图形数据的显示方式仍是二维的,因此三维投影的应用相当广泛,尤其是在计算机图形学,工程学和工程制图中。 + + + + + ## 基本方法 基本方法就有两个`save` 和`restore`,主要作用为`保存当前状态和恢复到上一次保存的状态`,通常成对使用,常用格式如下: @@ -41,9 +76,25 @@ camera.retore(); // 回滚状态 #### getMatrix -获取当前状态下的矩阵。 +```java +void getMatrix (Matrix matrix) +``` + +计算当前状态下矩阵对应的状态,并将计算后的矩阵赋值给参数matrix。 + +#### applyToCanvas + +```java +void applyToCanvas (Canvas canvas) +``` + +计算当前状态下单矩阵对应的状态,并将计算后的矩阵应用到指定的canvas上。 + + +## 旋转方法 +旋转是Camera制作3D效果的核心(其实从),不过它制作出来的并不能算是真正的3D,而是伪3D,因为没有厚度, ## About Me From 76a4a7e513d3d685d4a18b64e95e9bf8e51eb59b Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 11 Sep 2016 03:30:28 +0800 Subject: [PATCH 423/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index 1d70668c..8a57de2c 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -50,11 +50,22 @@ ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f7nxn8hcqqj308c0ea74a.jpg) + + #### 三维投影 -**三维投影**是将三维空间中的点映射到二维平面上的方法。由于目前绝大多数图形数据的显示方式仍是二维的,因此三维投影的应用相当广泛,尤其是在计算机图形学,工程学和工程制图中。 +> **三维投影**是将三维空间中的点映射到二维平面上的方法。由于目前绝大多数图形数据的显示方式仍是二维的,因此三维投影的应用相当广泛,尤其是在计算机图形学,工程学和工程制图中。 + +三维投影一般有两种,**正交投影** 和 **透视投影**。 + +* 正交投影就是我们数学上学过的 "正视图、正视图、侧视图、俯视图" 这些东西。 +* 透视投影则更像拍照片,符合**近大远小**的关系,有立体感,**我们此处使用的就是透视投影。** + + +#### 摄像机 +如果你了解过Unity,那么你对摄像机这一个概念应该会理解的比较透彻。在一个虚拟的3D的立体空间中,由于我们无法直接用眼睛去观察这一个空间,所以要借助摄像机采集信息,制成2D影像供我们观察。简单来说,**摄像机就是我们观察虚拟3D空间的眼睛**。 From 39f6f69e4176d4defd636639a3300968c0af62c0 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 12 Sep 2016 07:05:14 +0800 Subject: [PATCH 424/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 112 +++++++++++++++++++-- 1 file changed, 106 insertions(+), 6 deletions(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index 8a57de2c..3525abea 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -15,8 +15,8 @@ | ---- | ---------------------------------------- | -------------- | | 基本方法 | save、restore | 保存、 回滚 | | 常用方法 | getMatrix、applyToCanvas | 获取Matrix、应用到画布 | -| 旋转 | rotat (API 21)、rotateX、rotateY、rotateZ | 各种旋转 | | 平移 | translate | 位移 | +| 旋转 | rotat (API 21)、rotateX、rotateY、rotateZ | 各种旋转 | | 相机位置 | setLocation (API 12)、getLocationX (API 16)、getLocationY (API 16)、getLocationZ (API 16) | 设置与获取相机位置 | > Camera的方法并不是特别多,很多内容与之前的讲解的Canvas和Matrix类似,不过又稍有不同,之前的画布操作和Matrix主要是作用于2D空间,而Camera则主要作用于3D空间。 @@ -35,7 +35,7 @@ > 至于为什么要用左手坐标系呢?~~大概是因为赶工的时候右手不方便比划吧,大雾。~~实际上不同平台上使用的坐标系也有不同,有的是左手,有的是右手,貌似并没有统一的标准,只需要记住 Android 平台上面使用的是左手坐标系即可。 -不过此处需要注意一下 Android 中 2D坐标系 和 3D坐标系 的一些差别。 +**2D 和 3D 坐标是通过Matrix关联起来的,所以你可以认为两者是同一个坐标系,但又有差别,重点就是y轴方向不同。** | 坐标系 | 2D坐标系 | 3D坐标系 | | ------- | :---: | :----: | @@ -46,7 +46,7 @@ 3D坐标系在屏幕中各个坐标轴默认方向展示: -> 注意y轴默认方向是向上,而2D则是向下。 +> 注意y轴默认方向是向上,而2D则是向下,另外本图不代表3D坐标系实际位置。 ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f7nxn8hcqqj308c0ea74a.jpg) @@ -65,7 +65,13 @@ #### 摄像机 -如果你了解过Unity,那么你对摄像机这一个概念应该会理解的比较透彻。在一个虚拟的3D的立体空间中,由于我们无法直接用眼睛去观察这一个空间,所以要借助摄像机采集信息,制成2D影像供我们观察。简单来说,**摄像机就是我们观察虚拟3D空间的眼睛**。 +如果你学过Unity,那么你对摄像机这一个概念应该会有比较透彻的理解。在一个虚拟的3D的立体空间中,由于我们无法直接用眼睛去观察这一个空间,所以要借助摄像机采集信息,制成2D影像供我们观察。简单来说,**摄像机就是我们观察虚拟3D空间的眼睛**。 + +**Android 上面观察View的摄像机默认位置在屏幕左上角,而且是距屏幕有一段距离的,假设灰色部分是手机屏幕,白色是上面的一个View,摄像机位置看起来大致就是下面这样子的(为了更好的展示摄像机的位置,做了一个空间转换效果的动图)。** + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f7q71yek4wg308c058go5.gif) + +> 摄像机的位置默认是 (0, 0, -576)。其中 -576= -8 x 72,虽然官方文档说距离屏幕的距离是 -8, 但经过测试实际距离是 -576 像素,当距离为 -10 的时候,实际距离为 -720 像素。不过这个数值72我也不明白是什么东西,我使用了3款手机测试,屏幕大小和像素密度均不同,但结果都是一样的,知道的小伙伴可以告诉我一声。 @@ -103,9 +109,103 @@ void applyToCanvas (Canvas canvas) -## 旋转方法 +## 平移 + +> **声明:以下示例中 Matrix 的平移均使用 postTranslate 来演示,实际情况中使用set、pre 或 post 需要视情况而定。** + +```java +void translate (float x, float y, float z) +``` + +和2D平移类似,只不过是多出来了一个维度,从只能在2D平面上平移到在3D空间内平移,不过,此处仍有几个要点需要重点对待。 + + + +#### 沿x轴平移 + + +``` java +camera.translate(x, 0, 0); + +matrix.postTranslate(x, 0); +``` + +两者x轴同向,所以 Camera 和 Matrix 在沿x轴平移上是一致的。 + +**结论:** + +一致是指平移方向和平移距离一致,在默认情况下,上面两种均可以让坐标系向右移动x个单位。 + + + +#### 沿y轴平移 + +这个就有点意思了,两个坐标系相互关联,但是两者的y轴方向是相反的,很容易把人搞迷糊。你可以这么玩: + +```java +Camera camera = new Camera(); +camera.translate(0, 100, 0); // camera - 沿y轴正方向平移100像素 + +Matrix matrix = new Matrix(); +camera.getMatrix(matrix); +matrix.postTranslate(0,100); // matrix - 沿y轴正方向平移100像素 + +Log.i(TAG, "Matrix: "+matrix.toShortString()); +``` + +在上面这种写法,虽然用了5行代码,但是效果却和 `Matrix matrix = new Matrix();` 一样,结果都是单位矩阵。而且看起来貌似没有啥问题,毕竟两次平移都是正向100。(~~如果遇见不懂技术的领导嫌你写代码量少,你可以这样多写几遍,反正一般人是看不出问题的。~~) + +``` +Matrix: [1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0] +``` + +**结论:** + +由于两者y轴相反,所以 `camera.translate(0, -y, 0);` 与 `matrix.postTranslate(0, y);`平移方向和距离一致,在默认情况下,这两种方法均可以让坐标系向下移动y个单位。 + + + +#### 沿z轴平移 + +这个不仅有趣,还容易蒙逼,上面两种情况再怎么闹腾也只是在2D平面上,而z轴的出现则让其有了空间感。 + +**当View和摄像机在同一条直线上时:** 此时沿z轴平移相当于缩放的效果,缩放中心为摄像机所在(x, y)坐标,当View接近摄像机时,看起来会变大,远离摄像机时,看起来会变小,**近大远小**。 + +**当View和摄像机不在同一条直线上时:** 当View远离摄像机的时候,View在缩小的同时也在不断接近摄像机在屏幕投影位置(通常情况下为Z轴,在平面上表现为接近坐标原点)。相反,当View接近摄像机的时候,View在放大的同时会远离摄像机在屏幕投影位置。 + + + +我知道,这样说你们肯定是蒙逼的,话说为啥远离摄像机的时候会接近摄像机在屏幕投影位置,而接近摄像机的时候会远离摄像机在屏幕投影位置 (´・_・`),肯定觉得我在逗你们玩,完全是前后矛盾,逻辑都不通,不过这个在这里的确是不矛盾的,因为远离是在3D空间里的情况,而接近只是在2D空间的投影,看下图。 + +> 假设大矩形是手机屏幕,摄像机位于屏幕左上角,请注意上面View与摄像机的距离以及下方View的大小以及距离左上角的距离。 + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f7qerbksn4g30dc0ct7vt.gif) + +至于为什么会这样,因为我们人眼视觉就是这样的,当我们看向远方的时候,视线最终都会消失在视平线上,如果你站在两条平行线中间,看起来它们会在远方(视平线上)相交,虽然在3D空间上两者距离不变,但在2D投影上却是越来越接近,如下图(图片来自网络): + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f7qf2vug02j308c08ct9w.jpg) + +**结论:** + +关于3D效果的平移说起来比较麻烦,但你可以自己实际的体验一下,毕竟我们是生活在3D空间的,拿一张纸片来模拟View,用眼睛当做摄像机,在眼前来回移动纸片,多试几次大致就明白是怎么回事了。 + +| 平移 | 重点内容 | +| :--: | ----------- | +| x轴 | 2D 和 3D 相同。 | +| y轴 | 2D 和 3D 相反。 | +| z轴 | 近大远小、视线相交。 | + + + +## 旋转 + +旋转是Camera制作3D效果的核心,不过它制作出来的并不能算是真正的3D,而是伪3D,因为View是没有厚度的,想要展示出立体效果一般需要两个View进行配合, + + + +## 核心要点 + -旋转是Camera制作3D效果的核心(其实从),不过它制作出来的并不能算是真正的3D,而是伪3D,因为没有厚度, ## About Me From 49eb89ca1f35f8b4e99fd664f4728d99c701816f Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 13 Sep 2016 05:03:26 +0800 Subject: [PATCH 425/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 26 +++++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index 3525abea..61f49141 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -3,7 +3,7 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### 相关文章: [自定义View目录](http://www.gcssloop.com/customview/CustomViewIndex/) -本篇依旧属于Matrix,主要讲解Camera,Android下有很相机应用,其中的美颜相机更是不少,不过今天这个Camera可不是我们平时拍照的那个相机,而是graphic包下的Camera,专业给Matrix拍照的相机,不过既然是相机,作用都是类似的,主要是将3D的内容拍扁变成2D的内容。 +本篇依旧属于Matrix,主要讲解Camera,Android下有很多相机应用,其中的美颜相机更是不少,不过今天这个Camera可不是我们平时拍照的那个相机,而是graphic包下的Camera,专业给Matrix拍照的相机,不过既然是相机,作用都是类似的,主要是将3D的内容拍扁变成2D的内容。 众所周知,我们的手机屏幕是一个2D的平面,所以也没办法直接显示3D的信息,因此我们看到的所有3D效果都是3D在2D平面的投影而已,而本文中的Camera主要作用就是这个,将3D信息转换为2D平面上的投影,实际上这个类更像是一个操作Matrix的工具类,使用Camera和Matrix可以在不使用OpenGL的情况下制作出简单的3D效果。 @@ -11,12 +11,12 @@ ## Camera常用方法表 -| 方法类别 | 相关 | 简介 | +| 方法类别 | 相关API | 简介 | | ---- | ---------------------------------------- | -------------- | | 基本方法 | save、restore | 保存、 回滚 | | 常用方法 | getMatrix、applyToCanvas | 获取Matrix、应用到画布 | | 平移 | translate | 位移 | -| 旋转 | rotat (API 21)、rotateX、rotateY、rotateZ | 各种旋转 | +| 旋转 | rotat (API 12)、rotateX、rotateY、rotateZ | 各种旋转 | | 相机位置 | setLocation (API 12)、getLocationX (API 16)、getLocationY (API 16)、getLocationZ (API 16) | 设置与获取相机位置 | > Camera的方法并不是特别多,很多内容与之前的讲解的Canvas和Matrix类似,不过又稍有不同,之前的画布操作和Matrix主要是作用于2D空间,而Camera则主要作用于3D空间。 @@ -175,9 +175,9 @@ Matrix: [1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0] -我知道,这样说你们肯定是蒙逼的,话说为啥远离摄像机的时候会接近摄像机在屏幕投影位置,而接近摄像机的时候会远离摄像机在屏幕投影位置 (´・_・`),肯定觉得我在逗你们玩,完全是前后矛盾,逻辑都不通,不过这个在这里的确是不矛盾的,因为远离是在3D空间里的情况,而接近只是在2D空间的投影,看下图。 +我知道,这样说你们肯定是蒙逼的,话说为啥远离摄像机的时候会接近摄像机在屏幕投影位置(´・_・`),肯定觉得我在逗你们玩,完全是前后矛盾,逻辑都不通,不过这个在这里的确是不矛盾的,因为远离是在3D空间里的情况,而接近只是在2D空间的投影,看下图。 -> 假设大矩形是手机屏幕,摄像机位于屏幕左上角,请注意上面View与摄像机的距离以及下方View的大小以及距离左上角的距离。 +> 假设大矩形是手机屏幕,白色小矩形是View,摄像机位于屏幕左上角,请注意上面View与摄像机的距离以及下方View的大小以及距离左上角(摄像机在屏幕投影位置)的距离。 ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f7qerbksn4g30dc0ct7vt.gif) @@ -199,7 +199,21 @@ Matrix: [1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0] ## 旋转 -旋转是Camera制作3D效果的核心,不过它制作出来的并不能算是真正的3D,而是伪3D,因为View是没有厚度的,想要展示出立体效果一般需要两个View进行配合, +旋转是Camera制作3D效果的核心,不过它制作出来的并不能算是真正的3D,而是伪3D,因为View是没有厚度的。 + +```java +// (API 12) 可以控制View同时绕x,y,z轴旋转,可以由下面几种方法复合而来。 +void rotate (float x, float y, float z); + +// 控制View绕单个坐标轴旋转 +void rotateX (float deg); +void rotateY (float deg); +void rotateZ (float deg); +``` + +这个东西说理论也不好理解,直接上图: + + From 062c1655fc61731b07800fec7e147f6103f36632 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 14 Sep 2016 01:25:21 +0800 Subject: [PATCH 426/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index 61f49141..5f604bd4 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -1,4 +1,4 @@ -# Matrix-Camera +# Matrix Camera ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### 相关文章: [自定义View目录](http://www.gcssloop.com/customview/CustomViewIndex/) @@ -213,6 +213,11 @@ void rotateZ (float deg); 这个东西说理论也不好理解,直接上图: +

+ + + +

From 10966468e541965be2fc59165624aeccc50b9341 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 14 Sep 2016 04:28:55 +0800 Subject: [PATCH 427/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 297 ++++++++++++++++++++- 1 file changed, 295 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index 5f604bd4..4557217c 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -211,7 +211,7 @@ void rotateY (float deg); void rotateZ (float deg); ``` -这个东西说理论也不好理解,直接上图: +这个东西瞎扯理论也不好理解,直接上图:

@@ -219,10 +219,303 @@ void rotateZ (float deg);

+**以上三张图分别为,绕x轴,y轴,z轴旋转的情况,至于为什么没有显示z轴,是因为z轴是垂直于手机屏幕的,在屏幕上的投影就是一个点。** +关于旋转,有以下几点需要注意: +#### 默认旋转中心 -## 核心要点 +旋转中心默认是坐标原点,对于图片来说就是左上角位置。 + +#### 如何控制旋转中心 + +我们都知道,在2D中,不论是旋转,错切还是缩放都是能够指定操作中心点位置的,但是在3D中却没有默认的方法,如果我们想要让图片围绕中心点旋转怎么办? 这就要使用到我们在[Matrix原理](http://www.gcssloop.com/customview/Matrix_Basic)提到过的方法,虽然当时因为有更好的选择方案,并不提倡这样做: + +```java +Matrix temp = new Matrix(); // 临时Matrix变量 +this.getMatrix(temp); // 获取Matrix +temp.preTranslate(-centerX, -centerY); // 使用pre将旋转中心移动到和Camera位置相同。 +temp.postTranslate(centerX, centerY); // 使用post将图片(View)移动到原来的位置 +``` + +#### 官方示例 + +说到3D旋转,最经典的应该就是ApiDemo里面的 [Rotate3dAnimation](https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/src/com/example/android/apis/animation/Rotate3dAnimation.java) 了,见过不少博文都是根据Rotate3dAnimation修改的效果,这是一个非常经典的例子,鉴于代码也不长,就贴在这里和大家一起品鉴一下。 + +```java +public class Rotate3dAnimation extends Animation { + private final float mFromDegrees; + private final float mToDegrees; + private final float mCenterX; + private final float mCenterY; + private final float mDepthZ; + private final boolean mReverse; + private Camera mCamera; + /** + * 创建一个绕y轴旋转的3D动画效果,旋转过程中具有深度调节,可以指定旋转中心。 + * + * @param fromDegrees 起始时角度 + * @param toDegrees 结束时角度 + * @param centerX 旋转中心x坐标 + * @param centerY 旋转中心y坐标 + * @param depthZ 最远到达的z轴坐标 + * @param reverse true 表示由从0到depthZ,false相反 + */ + public Rotate3dAnimation(float fromDegrees, float toDegrees, + float centerX, float centerY, float depthZ, boolean reverse) { + mFromDegrees = fromDegrees; + mToDegrees = toDegrees; + mCenterX = centerX; + mCenterY = centerY; + mDepthZ = depthZ; + mReverse = reverse; + } + @Override + public void initialize(int width, int height, int parentWidth, int parentHeight) { + super.initialize(width, height, parentWidth, parentHeight); + mCamera = new Camera(); + } + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + final float fromDegrees = mFromDegrees; + float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime); + final float centerX = mCenterX; + final float centerY = mCenterY; + final Camera camera = mCamera; + final Matrix matrix = t.getMatrix(); + camera.save(); + + // 调节深度 + if (mReverse) { + camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime); + } else { + camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime)); + } + + // 绕y轴旋转 + camera.rotateY(degrees); + + camera.getMatrix(matrix); + camera.restore(); + + // 调节中心点 + matrix.preTranslate(-centerX, -centerY); + matrix.postTranslate(centerX, centerY); + } +} +``` + + + +可以看到,短短的几十行代码就完成了,而核心代码(有注释部分)仅仅几行而已,简洁易懂。不过呢,这一份代码依旧是一份未完成的代码(不然怎么叫ApiDemo呢?),并且很多人不知道怎么修改。 + +不知诸位在使用的时候可否发现了一个问题,同一份代码在不同手机上显示效果也是不同的,在像素密度较低的手机上,旋转效果比较正常,但是在像素密度较高的手机上显示效果则会很夸张,具体会怎样的,下面就来看一下具体效果。 + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f7sk60825wg308c0ea1kx.gif) + +可以看到,图片不仅因为形变失真,而且在中间一段因为形变过大导致图片无法显示,当然了,单个手机失真,你可以用`depthZ`忽悠过去,当 `depthZ` 设置的数值比较大大时候,图像在翻转同时会远离摄像头,距离远离,失真就不会显得很严重,不过这仍掩盖不了在不同手机上显示效果不同。 + +**如何解决这一问题呢?** + +想要解决其实也不难,只要修改两个数值就可以了,这两个数值就是在Matrix中一直被众多开发者忽略的 `MPERSP_0` 和 `MPERSP_1` + +![](http://latex.codecogs.com/png.latex? +$$ +\\left [ +\\begin{matrix} +MSCALE\\_X & MSKEW\\_X & MTRANS\\_X \\\\ +\\\\ +MSKEW\\_Y & MSCALE\\_Y & MTRANS\\_Y \\\\ +\\\\ +MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 +\\end{1} +\\right ] +$$) + +下面是修改后的代码(重点部分都已经标注出来了): + +```java +public class Rotate3dAnimation extends Animation { + private final float mFromDegrees; + private final float mToDegrees; + private final float mCenterX; + private final float mCenterY; + private final float mDepthZ; + private final boolean mReverse; + private Camera mCamera; + float scale = 1; // <------- 像素密度 + + /** + * 创建一个绕y轴旋转的3D动画效果,旋转过程中具有深度调节,可以指定旋转中心。 + * @param context <------- 添加上下文,为获取像素密度准备 + * @param fromDegrees 起始时角度 + * @param toDegrees 结束时角度 + * @param centerX 旋转中心x坐标 + * @param centerY 旋转中心y坐标 + * @param depthZ 最远到达的z轴坐标 + * @param reverse true 表示由从0到depthZ,false相反 + */ + public Rotate3dAnimation(Context context, float fromDegrees, float toDegrees, + float centerX, float centerY, float depthZ, boolean reverse) { + mFromDegrees = fromDegrees; + mToDegrees = toDegrees; + mCenterX = centerX; + mCenterY = centerY; + mDepthZ = depthZ; + mReverse = reverse; + + // 获取手机像素密度 (即dp与px的比例) + scale = context.getResources().getDisplayMetrics().density; + } + + @Override + public void initialize(int width, int height, int parentWidth, int parentHeight) { + super.initialize(width, height, parentWidth, parentHeight); + mCamera = new Camera(); + } + + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + final float fromDegrees = mFromDegrees; + float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime); + final float centerX = mCenterX; + final float centerY = mCenterY; + final Camera camera = mCamera; + final Matrix matrix = t.getMatrix(); + camera.save(); + + // 调节深度 + if (mReverse) { + camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime); + } else { + camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime)); + } + + // 绕y轴旋转 + camera.rotateY(degrees); + + camera.getMatrix(matrix); + camera.restore(); + + // 修正失真,主要修改 MPERSP_0 和 MPERSP_1 + float[] mValues = new float[9]; + matrix.getValues(mValues); //获取数值 + mValues[6] = mValues[6]/scale; //数值修正 + mValues[7] = mValues[7]/scale; //数值修正 + matrix.setValues(mValues); //重新赋值 + + // 调节中心点 + matrix.preTranslate(-centerX, -centerY); + matrix.postTranslate(centerX, centerY); + } +} +``` + +修改后效果: + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f7sksrhraog308c0ea4qi.gif) + + + +上下对比差别还是很大的,顺便附上测试代码吧,layout文件就不写了,随便放一个ImageView就行了。 + +```java +setContentView(R.layout.activity_test_camera_rotate2); +ImageView view = (ImageView) findViewById(R.id.img); +assert view != null; +view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // 计算中心点(这里是使用view的中心作为旋转的中心点) + final float centerX = v.getWidth() / 2.0f; + final float centerY = v.getHeight() / 2.0f; + + //括号内参数分别为(上下文,开始角度,结束角度,x轴中心点,y轴中心点,深度,是否扭曲) + final Rotate3dAnimation rotation = new Rotate3dAnimation(MainActivity.this, 0, 180, centerX, centerY, 0f, true, 2); + + rotation.setDuration(3000); //设置动画时长 + rotation.setFillAfter(true); //保持旋转后效果 + rotation.setInterpolator(new LinearInterpolator()); //设置插值器 + v.startAnimation(rotation); + } +}); +``` + + + +## 相机位置 + +我们可以使用translate和rotate来控制拍摄对象,也可以移动相机自身的位置,不过这些方法并不常用(看添加时间就知道啦)。 + +```java +void setLocation (float x, float y, float z); // (API 12) 设置相机位置,默认位置是(0, 0, -8) + +float getLocationX (); // (API 16) 获取相机位置的x坐标,下同 +float getLocationY (); +float getLocationZ (); +``` + +我们知道近大远小,而物体之间的距离是相对的,让物体远离相机和让相机远离物体结果是一样的,实际上设置相机位置基本可以使用`translate`替代。 + +虽然设置相机位置用处并不大,但还是要提几点注意事项: + +#### 相机和View的z轴距离不能为0 + +这个比较容易理解,当你把一个物体和相机放在同一个位置的时候,相机是拍摄不到这个物体的,正如你拿一张卡片放在手机侧面,摄像头是拍摄不到的。 + +#### 虚拟相机前后均可以拍摄 + +当View不断接近摄像机并越过摄像机位置时,仍能看到View,并且View大小会随着距离摄像机的位置越来越远而逐渐变小,你可以理解为它有前置摄像头和后置摄像头。 + +#### 摄像机右移等于View左移 + +View的状态只取决于View和摄像机之间的相对位置,不过由于单位不同,摄像机平移一个单位等于View平移72个像素。下面两段代码是等价的: + +```java +Camera camera = new Camera(); +camera.setLocation(1,0,-8); // 摄像机默认位置是(0, 0, -8) +Matrix matrix = new Matrix(); +camera.getMatrix(matrix); +Log.e(TAG, "location: "+matrix.toShortString() ); + +Camera camera2 = new Camera(); +camera2.translate(-72,0,0); +Matrix matrix2 = new Matrix(); +camera2.getMatrix(matrix2); +Log.e(TAG, "translate: "+matrix2.toShortString() ); +``` + +结果: + +``` +location: [1.0, 0.0, -72.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0] +translate: [1.0, 0.0, -72.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0 +``` + +#### 要点 + +* View显示状态取决于View和摄像机之间的相对位置 +* View和相机的Z轴距离不能为0 + + + +**小技巧:关于摄像机和View的位置,你可以打开手机后置摄像头,拿一张卡片来回的转动平移或者移动手机位置,观察卡片在屏幕上的变化,** + + + +## 总结 + +本篇主要讲解了关于Camera和Matrix的一些基础知识,Camera运用得当的话是能够制造出很多炫酷的效果的,我这里算是抛砖引玉,推荐一些比较炫酷的控件。 + +#### [从零开始打造一个Android 3D立体旋转容器](http://blog.csdn.net/mr_immortalz/article/details/51918560) + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f7sm4xoh4ig308c0enx3p.gif) + + + +#### [FlipShare](https://github.com/JeasonWong/FlipShare) + +![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f7sm7ak62pg308c0et4qp.gif) From 2a423484e1073a3f63e085dfc6865c5f2af58343 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 14 Sep 2016 04:43:13 +0800 Subject: [PATCH 428/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index 4557217c..2c8fdc07 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -313,7 +313,7 @@ public class Rotate3dAnimation extends Animation { ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f7sk60825wg308c0ea1kx.gif) -可以看到,图片不仅因为形变失真,而且在中间一段因为形变过大导致图片无法显示,当然了,单个手机失真,你可以用`depthZ`忽悠过去,当 `depthZ` 设置的数值比较大大时候,图像在翻转同时会远离摄像头,距离远离,失真就不会显得很严重,不过这仍掩盖不了在不同手机上显示效果不同。 +可以看到,图片不仅因为形变失真,而且在中间一段因为形变过大导致图片无法显示,当然了,单个手机失真,你可以用`depthZ`忽悠过去,当 `depthZ` 设置的数值比较大大时候,图像在翻转同时会远离摄像头,距离比较远,失真就不会显得很严重,但这仍掩盖不了在不同手机上显示效果不同。 **如何解决这一问题呢?** @@ -525,3 +525,11 @@ translate: [1.0, 0.0, -72.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0 + + +## 参考资料 + +[Camera](https://developer.android.com/reference/android/graphics/Camera.html)
+[FlipShare](https://github.com/JeasonWong/FlipShare)
+[从零开始打造一个Android 3D立体旋转容器](http://blog.csdn.net/mr_immortalz/article/details/51918560)
+ From 58f27f31e71ccece41016b335c978a03128cba58 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 14 Sep 2016 05:26:31 +0800 Subject: [PATCH 429/615] Update --- CustomView/Advance/[11]Matrix_3D_Camera.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index 2c8fdc07..0e4c83b6 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -3,7 +3,7 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### 相关文章: [自定义View目录](http://www.gcssloop.com/customview/CustomViewIndex/) -本篇依旧属于Matrix,主要讲解Camera,Android下有很多相机应用,其中的美颜相机更是不少,不过今天这个Camera可不是我们平时拍照的那个相机,而是graphic包下的Camera,专业给Matrix拍照的相机,不过既然是相机,作用都是类似的,主要是将3D的内容拍扁变成2D的内容。 +本篇依旧属于Matrix,主要讲解Camera,Android下有很多相机应用,其中的美颜相机更是不少,不过今天这个Camera可不是我们平时拍照的那个相机,而是graphic包下的Camera,专业给View拍照的相机,不过既然是相机,作用都是类似的,主要是将3D的内容拍扁变成2D的内容。 众所周知,我们的手机屏幕是一个2D的平面,所以也没办法直接显示3D的信息,因此我们看到的所有3D效果都是3D在2D平面的投影而已,而本文中的Camera主要作用就是这个,将3D信息转换为2D平面上的投影,实际上这个类更像是一个操作Matrix的工具类,使用Camera和Matrix可以在不使用OpenGL的情况下制作出简单的3D效果。 From aad689acb1a238c6a14f4d8101c847a890048d4d Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 15 Sep 2016 04:56:43 +0800 Subject: [PATCH 430/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d24d60d0..78a306c2 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ * [安卓自定义View进阶 - Path玩出花样(PathMeasure)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B08%5DPath_Play.md) * [安卓自定义View进阶 - Matrix原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B09%5DMatrix_Basic.md) * [安卓自定义View进阶 - Matrix详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B10%5DMatrix_Method.md) - + * [安卓自定义View进阶 - Matrix Camera](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B11%5DMatrix_3D_Camera.md) ****** From 3c1e331638443da5b87045ff1ec7227f65e03f41 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 15 Sep 2016 05:00:20 +0800 Subject: [PATCH 431/615] Update --- CustomView/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CustomView/README.md b/CustomView/README.md index 16f99046..084727ed 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -39,6 +39,7 @@

+

### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From a488e3de362f8eb7b7ab784e6fe3a6c8fd3fd211 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 16 Sep 2016 20:30:20 +0800 Subject: [PATCH 432/615] Update --- CustomView/Advance/[12]TouchEvent.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 CustomView/Advance/[12]TouchEvent.md diff --git a/CustomView/Advance/[12]TouchEvent.md b/CustomView/Advance/[12]TouchEvent.md new file mode 100644 index 00000000..fd411729 --- /dev/null +++ b/CustomView/Advance/[12]TouchEvent.md @@ -0,0 +1,2 @@ +# 事件分发 + From 6592d90ad5b3f82020868bb55b4986ab3978745c Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 18 Sep 2016 04:46:52 +0800 Subject: [PATCH 433/615] Update --- Tools/MarkdownEditor.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Tools/MarkdownEditor.md diff --git a/Tools/MarkdownEditor.md b/Tools/MarkdownEditor.md new file mode 100644 index 00000000..c124a1b5 --- /dev/null +++ b/Tools/MarkdownEditor.md @@ -0,0 +1,2 @@ +# Markdown编辑器推荐 + From 33ced75cea84e9aab57f47db56f6b4559e5dc72f Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 19 Sep 2016 22:46:28 +0800 Subject: [PATCH 434/615] Update --- Tools/MarkdownEditor.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Tools/MarkdownEditor.md b/Tools/MarkdownEditor.md index c124a1b5..356129d6 100644 --- a/Tools/MarkdownEditor.md +++ b/Tools/MarkdownEditor.md @@ -1,2 +1,3 @@ # Markdown编辑器推荐 +markdown是一个非常棒的书写语言,深受程序员喜爱。 From 427bcc270276cded7a9e0bcd72484700ee9d6463 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 20 Sep 2016 00:03:38 +0800 Subject: [PATCH 435/615] Update --- CustomView/Advance/[02]Canvas_BasicGraphics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[02]Canvas_BasicGraphics.md b/CustomView/Advance/[02]Canvas_BasicGraphics.md index bd60cebc..b0b2eeff 100644 --- a/CustomView/Advance/[02]Canvas_BasicGraphics.md +++ b/CustomView/Advance/[02]Canvas_BasicGraphics.md @@ -279,7 +279,7 @@ useCenter // 是否使用中心 相比于使用椭圆,我们还是使用正圆比较多的,使用正圆展示一下效果: ``` - RectF rectF = new RectF(100,100,800,400); + RectF rectF = new RectF(100,100,600,600); // 绘制背景矩形 mPaint.setColor(Color.GRAY); canvas.drawRect(rectF,mPaint); @@ -290,7 +290,7 @@ useCenter // 是否使用中心 //------------------------------------- - RectF rectF2 = new RectF(100,600,800,900); + RectF rectF2 = new RectF(100,700,600,1200); // 绘制背景矩形 mPaint.setColor(Color.GRAY); canvas.drawRect(rectF2,mPaint); From a8fb17990858636a7be235206ca241f9f8362714 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 21 Sep 2016 00:30:25 +0800 Subject: [PATCH 436/615] Update --- ChaosCrystal/Markdowm/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 ChaosCrystal/Markdowm/README.md diff --git a/ChaosCrystal/Markdowm/README.md b/ChaosCrystal/Markdowm/README.md new file mode 100644 index 00000000..7d82df34 --- /dev/null +++ b/ChaosCrystal/Markdowm/README.md @@ -0,0 +1 @@ +# Markdown From 0d6c4478158797d149b0a19c2ccb2716d7a6b711 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 22 Sep 2016 00:31:05 +0800 Subject: [PATCH 437/615] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[01]CustomViewProcess.md | 88 ++++++------- .../Advance/[02]Canvas_BasicGraphics.md | 8 +- CustomView/Advance/[03]Canvas_Convert.md | 74 +++++------ CustomView/Advance/[04]Canvas_PictureText.md | 122 +++++++++--------- CustomView/Advance/[05]Path_Basic.md | 114 ++++++++-------- CustomView/Advance/[06]Path_Bezier.md | 85 ++++++------ CustomView/Advance/[07]Path_Over.md | 120 ++++++++--------- CustomView/Advance/[08]Path_Play.md | 100 +++++++------- CustomView/Advance/[09]Matrix_Basic.md | 38 +++--- 9 files changed, 374 insertions(+), 375 deletions(-) diff --git a/CustomView/Advance/[01]CustomViewProcess.md b/CustomView/Advance/[01]CustomViewProcess.md index f6687bb5..5166f06f 100644 --- a/CustomView/Advance/[01]CustomViewProcess.md +++ b/CustomView/Advance/[01]CustomViewProcess.md @@ -16,17 +16,17 @@ ## 一.自定义View分类 **我将自定义View分为了两类(sloop个人分类法,非官方):** - + ### 1.自定义ViewGroup - + **自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件,大多继承自ViewGroup或各种Layout,包含有子View。** - + > 例如:应用底部导航条中的条目,一般都是上面图标(ImageView),下面文字(TextView),那么这两个就可以用自定义ViewGroup组合成为一个Veiw,提供两个属性分别用来设置文字和图片,使用起来会更加方便。 - + ### 2.自定义View - + **在没有现成的View,需要自己实现的时候,就使用自定义View,一般继承自View,SurfaceView或其他的View,不包含子View。** - + > 例如:制作一个支持自动加载网络图片的ImageView,制作图表等。 **PS: 自定义View在大多数情况下都有替代方案,利用图片或者组合动画来实现,但是使用后者可能会面临内存耗费过大,制作麻烦更诸多问题。** @@ -47,9 +47,9 @@ View的构造函数有四种重载分别如下: public void SloopView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {} ``` 可以看出,关于View构造函数的参数有多有少,先排除几个不常用的,留下常用的再研究。 - + **有四个参数的构造函数在API21的时候才添加上,暂不考虑。** - + 有三个参数的构造函数中第三个参数是默认的Style,这里的默认的Style是指它在当前Application或Activity所用的Theme中的默认Style,且只有在明确调用的时候才会生效,以系统中的ImageButton为例说明: ``` java public ImageButton(Context context, AttributeSet attrs) { @@ -111,21 +111,21 @@ View的构造函数有四种重载分别如下: **测量模式一共有三种, 被定义在 Android 中的 View 类的一个内部类View.MeasureSpec中:** -模式 | 二进制数值 | 描述 ------------ |:----------:| --- -UNSPECIFIED | 00 | 默认值,父控件没有给子view任何限制,子View可以设置为任意大小。 -EXACTLY | 01 | 表示父控件已经确切的指定了子View的大小。 -AT_MOST | 10 | 表示子View具体大小没有尺寸限制,但是存在上限,上限一般为父View大小。 +| 模式 | 二进制数值 | 描述 | +| ----------- | :---: | -------------------------------------- | +| UNSPECIFIED | 00 | 默认值,父控件没有给子view任何限制,子View可以设置为任意大小。 | +| EXACTLY | 01 | 表示父控件已经确切的指定了子View的大小。 | +| AT_MOST | 10 | 表示子View具体大小没有尺寸限制,但是存在上限,上限一般为父View大小。 | **在int类型的32位二进制位中,31-30这两位表示测量模式,29~0这三十位表示宽和高的实际值,实际上如下:** 以数值1080(二进制为: 1111011000)为例(其中模式和实际数值是连在一起的,为了展示我将他们分开了): -模式名称 | 模式数值 | 实际数值 -------------| --------:| --- -UNSPECIFIED | 00 | 000000000000000000001111011000 -EXACTLY | 01 | 000000000000000000001111011000 -AT_MOST | 10 | 000000000000000000001111011000 +| 模式名称 | 模式数值 | 实际数值 | +| ----------- | ---: | ------------------------------ | +| UNSPECIFIED | 00 | 000000000000000000001111011000 | +| EXACTLY | 01 | 000000000000000000001111011000 | +| AT_MOST | 10 | 000000000000000000001111011000 | **PS: 实际上关于上面的东西了解即可,在实际运用之中只需要记住有三种模式,用 MeasureSpec 的 getSize是获取数值, getMode是获取模式即可。** @@ -136,7 +136,7 @@ AT_MOST | 10 | 000000000000000000001111011000 ### 3.确定View大小(onSizeChanged) 这个函数在视图大小发生改变时调用。 - + **Q: 在测量完View并使用setMeasuredDimension函数之后View的大小基本上已经确定了,那么为什么还要再次确定View的大小呢?** **A: 这是因为View的大小不仅由View本身控制,而且受父控件的影响,所以我们在确定View大小的时候最好使用系统提供的onSizeChanged回调函数。** @@ -157,32 +157,32 @@ onSizeChanged如下: ### 4.确定子View布局位置(onLayout) **确定布局的函数是onLayout,它用于确定子View的位置,在自定义ViewGroup中会用到,他调用的是子View的layout函数。** - + 在自定义ViewGroup中,onLayout一般是循环取出子View,然后经过计算得出各个子View位置的坐标值,然后用以下函数设置子View位置。 - + ``` java child.layout(l, t, r, b); ``` 四个参数分别为: -名称 | 说明 | 对应的函数 ----- | -------------------------- | --- -l | View左侧距父View左侧的距离 | getLeft(); -t | View顶部距父View顶部的距离 | getTop(); -r | View右侧距父View左侧的距离 | getRight(); -b | View底部距父View顶部的距离 | getBottom(); +| 名称 | 说明 | 对应的函数 | +| ---- | ----------------- | ------------ | +| l | View左侧距父View左侧的距离 | getLeft(); | +| t | View顶部距父View顶部的距离 | getTop(); | +| r | View右侧距父View左侧的距离 | getRight(); | +| b | View底部距父View顶部的距离 | getBottom(); | -具体可以参考 [坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md) 这篇文章。 +具体可以参考 [坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B01%5DCoordinateSystem.md) 这篇文章。 ![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f1qzqwvkkbj308c0dwgm9.jpg) PS:关于onLayout这个函数在讲解自定义ViewGroup的时候会详细讲解。 - - + + ======== ### 5.绘制内容(onDraw) - + onDraw是实际绘制的部分,也就是我们真正关心的部分,使用的是Canvas绘图。 ``` java @Override @@ -196,7 +196,7 @@ b | View底部距父View顶部的距离 | getBottom(); ### 6.对外提供操作方法和监听回调 自定义完View之后,一般会对外暴露一些接口,用于控制View的状态等,或者监听View的变化. - + 本内容会在后续文章中以实例的方式进讲解。 ************ @@ -207,20 +207,20 @@ b | View底部距父View顶部的距离 | getBottom(); > PS :实际上ViewGroup是View的一个子类。 -类别 | 继承自 | 特点 ---------- | --------------------- | ------------ -View | View SurfaceView 等 | 不含子View -ViewGroup | ViewGroup xxLayout等 | 包含子View +| 类别 | 继承自 | 特点 | +| --------- | ------------------- | ------- | +| View | View SurfaceView 等 | 不含子View | +| ViewGroup | ViewGroup xxLayout等 | 包含子View | ### 自定义View流程: -步骤 | 关键字 | 作用 ----- | ------------- | ------------- - 1 | 构造函数 | View初始化 - 2 | onMeasure | 测量View大小 - 3 | onSizeChanged | 确定View大小 - 4 | onLayout | 确定子View布局(自定义View包含子View时有用) - 5 | onDraw | 实际绘制内容 - 6 | 提供接口 | 控制View或监听View某些状态。 +| 步骤 | 关键字 | 作用 | +| ---- | ------------- | ---------------------------- | +| 1 | 构造函数 | View初始化 | +| 2 | onMeasure | 测量View大小 | +| 3 | onSizeChanged | 确定View大小 | +| 4 | onLayout | 确定子View布局(自定义View包含子View时有用) | +| 5 | onDraw | 实际绘制内容 | +| 6 | 提供接口 | 控制View或监听View某些状态。 | diff --git a/CustomView/Advance/[02]Canvas_BasicGraphics.md b/CustomView/Advance/[02]Canvas_BasicGraphics.md index b0b2eeff..28820e87 100644 --- a/CustomView/Advance/[02]Canvas_BasicGraphics.md +++ b/CustomView/Advance/[02]Canvas_BasicGraphics.md @@ -3,7 +3,7 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) -在上一篇[自定义View分类与流程](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B1%5DCustomViewProcess.md)中我们了解自定义View相关的基本知识,不过,这些东西依旧还是理论,并不能**拿来(zhuang)用(B)**, 这一次我们就了解一些**能(zhaung)用(B)**的东西。 +在上一篇[自定义View分类与流程](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B01%5DCustomViewProcess.md)中我们了解自定义View相关的基本知识,不过,这些东西依旧还是理论,并不能**拿来(zhuang)用(B)**, 这一次我们就了解一些**能(zhaung)用(B)**的东西。 在本篇文章中,我们先了解Canvas的基本用法,最后用一个小示例来结束本次教程。 @@ -50,7 +50,7 @@ Canvas我们可以称之为画布,能够在上面绘制各种东西,是安 -> 关于颜色的更多资料请参考[基础篇_颜色](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView%2FBase%2F%5B3%5DColor.md) +> 关于颜色的更多资料请参考[基础篇_颜色](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView%2FBase%2F%5B03%5DColor.md) ****** @@ -90,7 +90,7 @@ Canvas我们可以称之为画布,能够在上面绘制各种东西,是安 ``` 关于坐标原点默认在左上角,水平向右为x轴增大方向,竖直向下为y轴增大方向。 -> 更多参考这里 [基础篇_坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView%2FBase%2F%5B1%5DCoordinateSystem.md) +> 更多参考这里 [基础篇_坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView%2FBase%2F%5B01%5DCoordinateSystem.md) @@ -274,7 +274,7 @@ useCenter // 是否使用中心 -可以发现使用了中心点之后绘制出来类似于一个扇形,而不使用中心点则是圆弧起始点和结束点之间的连线加上圆弧围成的图形。这样中心点这个参数的作用就很明显了,不必多说想必大家试一下就明白了。 另外可以关于角度可以参考一下这篇文章: [角度与弧度](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView%2FBase%2F%5B2%5DAngleAndRadian.md) +可以发现使用了中心点之后绘制出来类似于一个扇形,而不使用中心点则是圆弧起始点和结束点之间的连线加上圆弧围成的图形。这样中心点这个参数的作用就很明显了,不必多说想必大家试一下就明白了。 另外可以关于角度可以参考一下这篇文章: [角度与弧度](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView%2FBase%2F%5B02%5DAngleAndRadian.md) 相比于使用椭圆,我们还是使用正圆比较多的,使用正圆展示一下效果: diff --git a/CustomView/Advance/[03]Canvas_Convert.md b/CustomView/Advance/[03]Canvas_Convert.md index b462e3e2..13f253ba 100644 --- a/CustomView/Advance/[03]Canvas_Convert.md +++ b/CustomView/Advance/[03]Canvas_Convert.md @@ -3,24 +3,24 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) -上一篇[Canvas之绘制基本形状](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md)中我们了解了如何使用Canvas绘制基本图形,本次了解一些基本的画布操作。 +上一篇[Canvas之绘制基本形状](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B02%5DCanvas_BasicGraphics.md)中我们了解了如何使用Canvas绘制基本图形,本次了解一些基本的画布操作。 本来想把画布操作放到后面部分的,但是发现很多图形绘制都离不开画布操作,于是先讲解一下画布的基本操作方法。 ## 一.Canvas的常用操作速查表 -操作类型 | 相关API | 备注 ---- | --- | --- -绘制颜色 | drawColor, drawRGB, drawARGB | 使用单一颜色填充整个画布 -绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧 -绘制图片 | drawBitmap, drawPicture | 绘制位图和图片 -绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字 -绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数 -顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 -画布剪裁 | clipPath, clipRect | 设置画布的显示区域 -画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数 -画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 -Matrix(矩阵) | getMatrix, setMatrix, concat | 实际上画布的位移,缩放等操作的都是图像矩阵Matrix, 只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 +| 操作类型 | 相关API | 备注 | +| ---------- | ---------------------------------------- | ---------------------------------------- | +| 绘制颜色 | drawColor, drawRGB, drawARGB | 使用单一颜色填充整个画布 | +| 绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧 | +| 绘制图片 | drawBitmap, drawPicture | 绘制位图和图片 | +| 绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字 | +| 绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数 | +| 顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 | +| 画布剪裁 | clipPath, clipRect | 设置画布的显示区域 | +| 画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数 | +| 画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 | +| Matrix(矩阵) | getMatrix, setMatrix, concat | 实际上画布的位移,缩放等操作的都是图像矩阵Matrix, 只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 | ****** ## 二.Canvas基本操作 @@ -77,15 +77,15 @@ Matrix(矩阵) | getMatrix, setMatrix, concat | 实际上画布的位移,缩 缩放比例(sx,sy)取值范围详解: -取值范围(n)| 说明 ---------- | ------ -[-∞, -1) | 先根据缩放中心放大n倍,再根据中心轴进行翻转 --1 | 根据缩放中心轴进行翻转 -(-1, 0) | 先根据缩放中心缩小到n,再根据中心轴进行翻转 -0 | 不会显示,若sx为0,则宽度为0,不会显示,sy同理 -(0, 1) | 根据缩放中心缩小到n -1 | 没有变化 -(1, +∞) | 根据缩放中心放大n倍 +| 取值范围(n) | 说明 | +| -------- | -------------------------- | +| [-∞, -1) | 先根据缩放中心放大n倍,再根据中心轴进行翻转 | +| -1 | 根据缩放中心轴进行翻转 | +| (-1, 0) | 先根据缩放中心缩小到n,再根据中心轴进行翻转 | +| 0 | 不会显示,若sx为0,则宽度为0,不会显示,sy同理 | +| (0, 1) | 根据缩放中心缩小到n | +| 1 | 没有变化 | +| (1, +∞) | 根据缩放中心放大n倍 | 如果在缩放时稍微注意一下就会发现缩放的中心默认为坐标原点,而缩放中心轴就是坐标轴,如下: @@ -330,13 +330,13 @@ A:画布的操作是不可逆的,而且很多画布操作会影响后续的 与之相关的API: -相关API | 简介 ---- | --- -save | 把当前的画布的状态进行保存,然后放入特定的栈中 -saveLayerXxx | 新建一个图层,并放入特定的栈中 -restore | 把栈中最顶层的画布状态取出来,并按照这个状态恢复当前的画布 -restoreToCount| 弹出指定位置及其以上所有的状态,并按照指定位置的状态进行恢复 -getSaveCount | 获取栈中内容的数量(即保存次数) +| 相关API | 简介 | +| -------------- | ------------------------------ | +| save | 把当前的画布的状态进行保存,然后放入特定的栈中 | +| saveLayerXxx | 新建一个图层,并放入特定的栈中 | +| restore | 把栈中最顶层的画布状态取出来,并按照这个状态恢复当前的画布 | +| restoreToCount | 弹出指定位置及其以上所有的状态,并按照指定位置的状态进行恢复 | +| getSaveCount | 获取栈中内容的数量(即保存次数) | 下面对其中的一些概念和方法进行分析: @@ -359,14 +359,14 @@ A:实际上我们看到的画布是由多个图层构成的,如下图(图片 ##### SaveFlags -数据类型 | 名称 | 简介 ---- | --- | --- -int | ALL_SAVE_FLAG | 默认,保存全部状态 -int | CLIP_SAVE_FLAG | 保存剪辑区 -int | CLIP_TO_LAYER_SAVE_FLAG | 剪裁区作为图层保存 -int | FULL_COLOR_LAYER_SAVE_FLAG | 保存图层的全部色彩通道 -int | HAS_ALPHA_LAYER_SAVE_FLAG | 保存图层的alpha(不透明度)通道 -int | MATRIX_SAVE_FLAG | 保存Matrix信息(translate, rotate, scale, skew) +| 数据类型 | 名称 | 简介 | +| ---- | -------------------------- | ---------------------------------------- | +| int | ALL_SAVE_FLAG | 默认,保存全部状态 | +| int | CLIP_SAVE_FLAG | 保存剪辑区 | +| int | CLIP_TO_LAYER_SAVE_FLAG | 剪裁区作为图层保存 | +| int | FULL_COLOR_LAYER_SAVE_FLAG | 保存图层的全部色彩通道 | +| int | HAS_ALPHA_LAYER_SAVE_FLAG | 保存图层的alpha(不透明度)通道 | +| int | MATRIX_SAVE_FLAG | 保存Matrix信息(translate, rotate, scale, skew) | ##### save save 有两种方法: diff --git a/CustomView/Advance/[04]Canvas_PictureText.md b/CustomView/Advance/[04]Canvas_PictureText.md index 8dc25299..9644f4f1 100644 --- a/CustomView/Advance/[04]Canvas_PictureText.md +++ b/CustomView/Advance/[04]Canvas_PictureText.md @@ -3,22 +3,22 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) -在上一篇文章[Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md)中我们了解了画布的一些基本操作方法,本次了解一些绘制图片文字相关的内容。如果你对前几篇文章讲述的内容熟练掌握的话,那么恭喜你,本篇结束之后,大部分的自定义View已经难不倒你了,当然了,这并不是终点,接下来还会有更加炫酷的技能。 +在上一篇文章[Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B03%5DCanvas_Convert.md)中我们了解了画布的一些基本操作方法,本次了解一些绘制图片文字相关的内容。如果你对前几篇文章讲述的内容熟练掌握的话,那么恭喜你,本篇结束之后,大部分的自定义View已经难不倒你了,当然了,这并不是终点,接下来还会有更加炫酷的技能。 ## 一.Canvas的常用操作速查表 -操作类型 | 相关API | 备注 ----------|---------|----------- -绘制颜色 | drawColor, drawRGB, drawARGB | 使用单一颜色填充整个画布 -绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧 -绘制图片 | drawBitmap, drawPicture | 绘制位图和图片 -绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字 -绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数 -顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 -画布剪裁 | clipPath, clipRect | 设置画布的显示区域 -画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数 -画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 -Matrix(矩阵) | getMatrix, setMatrix, concat | 实际上画布的位移,缩放等操作的都是图像矩阵Matrix, 只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 +| 操作类型 | 相关API | 备注 | +| ---------- | ---------------------------------------- | ---------------------------------------- | +| 绘制颜色 | drawColor, drawRGB, drawARGB | 使用单一颜色填充整个画布 | +| 绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧 | +| 绘制图片 | drawBitmap, drawPicture | 绘制位图和图片 | +| 绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字 | +| 绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数 | +| 顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 | +| 画布剪裁 | clipPath, clipRect | 设置画布的显示区域 | +| 画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数 | +| 画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 | +| Matrix(矩阵) | getMatrix, setMatrix, concat | 实际上画布的位移,缩放等操作的都是图像矩阵Matrix, 只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 | ****** # 二.Canvas基本操作详解 @@ -68,15 +68,15 @@ A Picture records drawing calls (via the canvas returned by beginRecording) and 了解了Picture的概念之后,我们再了解一下Picture的相关方法。 -相关方法 | 简介 -------------------------------------------------------------|-------------------- -public int getWidth () | 获取宽度 -public int getHeight () | 获取高度 -public Canvas beginRecording (int width, int height) | 开始录制 (返回一个Canvas,在Canvas中所有的绘制都会存储在Picture中) -public void endRecording () | 结束录制 -public void draw (Canvas canvas) | 将Picture中内容绘制到Canvas中 -public static Picture createFromStream (InputStream stream) | (已废弃)通过输入流创建一个Picture -public void writeToStream (OutputStream stream) | (已废弃)将Picture中内容写出到输出流中 +| 相关方法 | 简介 | +| ---------------------------------------- | ---------------------------------------- | +| public int getWidth () | 获取宽度 | +| public int getHeight () | 获取高度 | +| public Canvas beginRecording (int width, int height) | 开始录制 (返回一个Canvas,在Canvas中所有的绘制都会存储在Picture中) | +| public void endRecording () | 结束录制 | +| public void draw (Canvas canvas) | 将Picture中内容绘制到Canvas中 | +| public static Picture createFromStream (InputStream stream) | (已废弃)通过输入流创建一个Picture | +| public void writeToStream (OutputStream stream) | (已废弃)将Picture中内容写出到输出流中 | 上面表格中基本上已经列出了Picture的所有方法,其中getWidth和getHeight没什么好说的,最后两个已经废弃也自然就不用关注了,排除了这些方法之后,只剩三个方法了,接下来我们就比较详细的了解一下: @@ -127,19 +127,19 @@ public void writeToStream (OutputStream stream) | (已废弃)将Pict Picture虽然方法就那么几个,但是具体使用起来还是分很多情况的,由于录制的内容不会直接显示,就像存储的视频不点击播放不会自动播放一样,同样,想要将Picture中的内容显示出来就需要手动调用播放(绘制),将Picture中的内容绘制出来可以有以下几种方法: -序号 | 简介 ------|----------- - 1 | 使用Picture提供的draw方法绘制。 - 2 | 使用Canvas提供的drawPicture方法绘制。 - 3 | 将Picture包装成为PictureDrawable,使用PictureDrawable的draw方法绘制。 +| 序号 | 简介 | +| ---- | ---------------------------------------- | +| 1 | 使用Picture提供的draw方法绘制。 | +| 2 | 使用Canvas提供的drawPicture方法绘制。 | +| 3 | 将Picture包装成为PictureDrawable,使用PictureDrawable的draw方法绘制。 | 以上几种方法主要区别: -主要区别 | 分类 | 简介 --------------------|-----------------------------------|------------------ -是否对Canvas有影响 | 1有影响
2,3不影响 | 此处指绘制完成后是否会影响Canvas的状态(Matrix clip等) -可操作性强弱 | 1可操作性较弱
2,3可操作性较强 | 此处的可操作性可以简单理解为对绘制结果可控程度。 +| 主要区别 | 分类 | 简介 | +| ------------ | --------------------- | ------------------------------------ | +| 是否对Canvas有影响 | 1有影响
2,3不影响 | 此处指绘制完成后是否会影响Canvas的状态(Matrix clip等) | +| 可操作性强弱 | 1可操作性较弱
2,3可操作性较强 | 此处的可操作性可以简单理解为对绘制结果可控程度。 | 几种方法简介和主要区别基本就这么多了,接下来对于各种使用方法一一详细介绍: @@ -170,9 +170,9 @@ public void drawPicture (Picture picture, RectF dst) ``` java canvas.drawPicture(mPicture,new RectF(0,0,mPicture.getWidth(),200)); ``` - + - + **PS:对照上一张图片,可以比较明显的看出,绘制的内容根据选区进行了缩放。 ** **3.将Picture包装成为PictureDrawable,使用PictureDrawable的draw方法绘制。** @@ -197,15 +197,15 @@ public void drawPicture (Picture picture, RectF dst) > 其实一开始知道要讲Bitmap我是拒绝的,为什么呢?因为Bitmap就是很多问题的根源啊有木有,Bitmap可能导致内存不足,内存泄露,ListView中的复用混乱等诸多问题。想完美的掌控Bitmap还真不是一件容易的事情。限于篇幅**本文对于Bitmap不会过多的展开,只讲解一些常用的功能**,关于Bitmap详细内容,以后开专题讲解QAQ。 既然要绘制Bitmap,就要先获取一个Bitmap,那么如何获取呢? - + **获取Bitmap方式:** - - 序号 | 获取方式 | 备注 - -----|---------------------------|----------------------------------------- - 1 | 通过Bitmap创建 | 复制一个已有的Bitmap(_新Bitmap状态和原有的一致_) 或者 创建一个空白的Bitmap(_内容可改变_) - 2 | 通过BitmapDrawable获取 | 从资源文件 内存卡 网络等地方获取一张图片并转换为内容不可变的Bitmap - 3 | 通过BitmapFactory获取 | 从资源文件 内存卡 网络等地方获取一张图片并转换为内容不可变的Bitmap - + +| 序号 | 获取方式 | 备注 | +| ---- | ------------------ | ---------------------------------------- | +| 1 | 通过Bitmap创建 | 复制一个已有的Bitmap(_新Bitmap状态和原有的一致_) 或者 创建一个空白的Bitmap(_内容可改变_) | +| 2 | 通过BitmapDrawable获取 | 从资源文件 内存卡 网络等地方获取一张图片并转换为内容不可变的Bitmap | +| 3 | 通过BitmapFactory获取 | 从资源文件 内存卡 网络等地方获取一张图片并转换为内容不可变的Bitmap | + **通常来说,我们绘制Bitmap都是读取已有的图片转换为Bitmap绘制到Canvas上。**
很明显,第1种方式不能满足我们的要求,暂时排除。
第2种方式虽然也可满足我们的要求,但是我不推荐使用这种方式,至于为什么在后续详细讲解Drawable的时候会说明,暂时排除。
@@ -282,10 +282,10 @@ PS:图片左上角位置默认为坐标原点。 第三种方法比较有意思,上面多了两个矩形区域(src,dst),这两个矩形选区是干什么用的? -名称 | 作用 ---------------------------|--------------------- -Rect src | 指定绘制图片的区域 -Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域 +| 名称 | 作用 | +| ------------------- | ----------------- | +| Rect src | 指定绘制图片的区域 | +| Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域 | 示例: ``` java @@ -372,14 +372,14 @@ Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域 **Paint文本相关常用方法表** -标题 | 相关方法 | 备注 ------|---------------------------|---------------------- -色彩 | setColor setARGB setAlpha | 设置颜色,透明度 -大小 | setTextSize | 设置文本字体大小 -字体 | setTypeface | 设置或清除字体样式 -样式 | setStyle | 填充(FILL),描边(STROKE),填充加描边(FILL_AND_STROKE) -对齐 | setTextAlign | 左对齐(LEFT),居中对齐(CENTER),右对齐(RIGHT) -测量 | measureText | 测量文本大小(注意,请在设置完文本各项参数后调用) +| 标题 | 相关方法 | 备注 | +| ---- | ------------------------- | ---------------------------------------- | +| 色彩 | setColor setARGB setAlpha | 设置颜色,透明度 | +| 大小 | setTextSize | 设置文本字体大小 | +| 字体 | setTypeface | 设置或清除字体样式 | +| 样式 | setStyle | 填充(FILL),描边(STROKE),填充加描边(FILL_AND_STROKE) | +| 对齐 | setTextAlign | 左对齐(LEFT),居中对齐(CENTER),右对齐(RIGHT) | +| 测量 | measureText | 测量文本大小(注意,请在设置完文本各项参数后调用) | 为了绘制文本,我们先创建一个文本画笔: ``` java @@ -411,9 +411,9 @@ Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域 以上一个例子使用的字符串为例,它的下标是这样的(wait,我为啥要说这个,算了,不管了,就这样吧(๑•́ ₃ •̀๑)): -字符 | A | B | C | D | E | F | G | H | I | J | K - ---|---|---|---|---|---|---|---|---|---|---|--- -下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 +| 字符 | A | B | C | D | E | F | G | H | I | J | K | +| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | +| 下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 假设我我们指定star为1,end为3,那么最终截取的字符串就是"BC"。 @@ -465,11 +465,11 @@ Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域 不过嘛,虽然虽然这个方法也比较容易理解,但是关于这个方法我个人是不推荐使用的,因为坑比较多,主要有一下几点: -序号 | 反对理由 ------|---------------------- - 1 | 必须指定所有字符位置,否则直接crash掉,反人类设计 - 2 | 性能不佳,在大量使用的时候可能导致卡顿 - 3 | 不支持emoji等特殊字符,不支持字形组合与分解 +| 序号 | 反对理由 | +| ---- | --------------------------- | +| 1 | 必须指定所有字符位置,否则直接crash掉,反人类设计 | +| 2 | 性能不佳,在大量使用的时候可能导致卡顿 | +| 3 | 不支持emoji等特殊字符,不支持字形组合与分解 | 关于第二类的第二种方法: diff --git a/CustomView/Advance/[05]Path_Basic.md b/CustomView/Advance/[05]Path_Basic.md index d3641a42..225ef09c 100644 --- a/CustomView/Advance/[05]Path_Basic.md +++ b/CustomView/Advance/[05]Path_Basic.md @@ -4,32 +4,32 @@ ### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) -在上一篇[Canvas之图片文字](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md)中我们了解了如何使用Canvas中绘制图片文字,结合前几篇文章,Canvas的基本操作已经差不多完结了,然而Canvas不仅仅具有这些基本的操作,还可以更加炫酷,本次会了解到path(路径)这个Canvas中的神器,有了这个神器,就能创造出更多**炫(zhuang)酷(B)**的东东了。 +在上一篇[Canvas之图片文字](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B04%5DCanvas_PictureText.md)中我们了解了如何使用Canvas中绘制图片文字,结合前几篇文章,Canvas的基本操作已经差不多完结了,然而Canvas不仅仅具有这些基本的操作,还可以更加炫酷,本次会了解到path(路径)这个Canvas中的神器,有了这个神器,就能创造出更多**炫(zhuang)酷(B)**的东东了。 ****** # 一.Path常用方法表 > 为了兼容性(_偷懒_) 本表格中去除了部分API21(即安卓版本5.0)以上才添加的方法。 -作用 | 相关方法 | 备注 -----------------|-----------------|------------------------------------------ -移动起点 | moveTo | 移动下一次操作的起点位置 -设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 -连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path -闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 -添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) -是否为空 | isEmpty | 判断Path是否为空 -是否为矩形 | isRect | 判断path是否是一个矩形 -替换路径 | set | 用新的路径替换到当前路径所有内容 -偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) -贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 -rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量), rXxx方法是基于当前点坐标系(偏移量)** -填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 设置,获取,判断和切换填充模式 -提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** -布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) -计算边界 | computeBounds | 计算Path的边界 -重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** -矩阵操作 | transform | 矩阵变换 +| 作用 | 相关方法 | 备注 | +| ----------- | ---------------------------------------- | ---------------------------------------- | +| 移动起点 | moveTo | 移动下一次操作的起点位置 | +| 设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 | +| 连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path | +| 闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 | +| 添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) | +| 是否为空 | isEmpty | 判断Path是否为空 | +| 是否为矩形 | isRect | 判断path是否是一个矩形 | +| 替换路径 | set | 用新的路径替换到当前路径所有内容 | +| 偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) | +| 贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 | +| rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量), rXxx方法是基于当前点坐标系(偏移量)** | +| 填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 设置,获取,判断和切换填充模式 | +| 提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** | +| 布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) | +| 计算边界 | computeBounds | 计算Path的边界 | +| 重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** | +| 矩阵操作 | transform | 矩阵变换 | # 二.Path详解 @@ -59,12 +59,12 @@ _The Path class encapsulates compound (multiple contour) geometric paths consist 另外路径有开放和封闭的区别。 - -图像 | 名称 | 备注 - --- | --- | --- - ![](http://ww4.sinaimg.cn/thumbnail/005Xtdi2jw1f0zx9g9gggj30f00aiwek.jpg) | 封闭路径 | 首尾相接形成了一个封闭区域 - ![](http://ww1.sinaimg.cn/thumbnail/005Xtdi2jw1f0zxg8ilpxj30f00aimx8.jpg) | 开放路径 | 没有首位相接形成封闭区域 - + +| 图像 | 名称 | 备注 | +| ---------------------------------------- | ---- | ------------- | +| ![](http://ww4.sinaimg.cn/thumbnail/005Xtdi2jw1f0zx9g9gggj30f00aiwek.jpg) | 封闭路径 | 首尾相接形成了一个封闭区域 | +| ![](http://ww1.sinaimg.cn/thumbnail/005Xtdi2jw1f0zxg8ilpxj30f00aimx8.jpg) | 开放路径 | 没有首位相接形成封闭区域 | + > 这个是我随便画的,仅为展示一下区别,请无视我灵魂画师一般的绘图水准。 **与Path相关的还有一些比较神奇的概念,不过暂且不说,等接下来需要用到的时候再详细说明。** @@ -76,18 +76,18 @@ _The Path class encapsulates compound (multiple contour) geometric paths consist ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f19mncfcirj305i02j744.jpg) ### 第1组: moveTo、 setLastPoint、 lineTo 和 close - + 由于Path的有些知识点无法单独来讲,所以本次采取了一次讲一组方法。 - + 按照惯例,先创建画笔: - + ``` java Paint mPaint = new Paint(); // 创建画笔 mPaint.setColor(Color.BLACK); // 画笔颜色 - 黑色 mPaint.setStyle(Paint.Style.STROKE); // 填充模式 - 描边 mPaint.setStrokeWidth(10); // 边框宽度 - 10 ``` - + #### lineTo: 方法预览: ``` @@ -95,9 +95,9 @@ public void lineTo (float x, float y) ``` 首先讲解的的LineTo,为啥先讲解这个呢? - + 是因为moveTo、 setLastPoint、 close都无法直接看到效果,借助有具现化效果的lineTo才能让这些方法现出原形。 - + lineTo很简单,只有一个方法,作用也很容易理解,line嘛,顾名思义就是一条线。 @@ -143,10 +143,10 @@ lineTo很简单,只有一个方法,作用也很容易理解,line嘛,顾 这两个方法虽然在作用上有相似之处,但实际上却是完全不同的两个东东,具体参照下表: -方法名 | 简介 | 是否影响之前的操作 | 是否影响之后操作 ---- | --- | --- | --- -moveTo | 移动下一次操作的起点位置 | 否 | 是 -setLastPoint | 设置之前操作的最后一个点位置 | 是 | 是 +| 方法名 | 简介 | 是否影响之前的操作 | 是否影响之后操作 | +| ------------ | -------------- | --------- | -------- | +| moveTo | 移动下一次操作的起点位置 | 否 | 是 | +| setLastPoint | 设置之前操作的最后一个点位置 | 是 | 是 | 废话不多说,直接上代码: ``` java @@ -243,19 +243,19 @@ close方法用于连接当前最后一个点和最初的一个点(如果两个 Direction的意思是 方向,趋势。 点进去看一下会发现Direction是一个枚举(Enum)类型,里面只有两个枚举常量,如下: -类型 | 解释 | 翻译 ------|-------------------|------- -CW | clockwise | 顺时针 -CCW | counter-clockwise | 逆时针 +| 类型 | 解释 | 翻译 | +| ---- | ----------------- | ---- | +| CW | clockwise | 顺时针 | +| CCW | counter-clockwise | 逆时针 | > **瞬间懵逼,我只是想添加一个基本的形状啊,搞什么顺时针和逆时针, (╯‵□′)╯︵┻━┻** **稍安勿躁,┬─┬ ノ( ' - 'ノ) {摆好摆好) 既然存在肯定是有用的,先偷偷剧透一下这个顺时针和逆时针的作用。** -序号 | 作用 ------|--------------------------------------------------- - 1 | 在添加图形时确定闭合顺序(各个点的记录顺序) - 2 | 对图形的渲染结果有影响(是判断图形渲染的重要条件) +| 序号 | 作用 | +| ---- | ------------------------- | +| 1 | 在添加图形时确定闭合顺序(各个点的记录顺序) | +| 2 | 对图形的渲染结果有影响(是判断图形渲染的重要条件) | 这个先剧透这么多,至于对闭合顺序有啥影响,自相交图形的渲染等问题等请慢慢看下去 @@ -275,7 +275,7 @@ CCW | counter-clockwise | 逆时针 **将上面代码的CW改为CCW再运行一次。接下来就是见证奇迹的时刻,两次运行结果一模一样,有木有很神奇!** > **(╯°Д°)╯︵ ┻━┻(再TM掀一次) -坑人也不带这样的啊,一毛一样要它干嘛。** +> 坑人也不带这样的啊,一毛一样要它干嘛。** **其实啊,这个东东是自带隐身技能的,想要让它现出原形,就要用到咱们刚刚学到的setLastPoint(重置当前最后一个点的位置)。** @@ -384,10 +384,10 @@ CCW | counter-clockwise | 逆时针 从名字就可以看出,这两个方法都是与圆弧相关的,作用都是添加一个圆弧到path中,但既然存在两个方法,两者之间肯定是有区别的: -名称 | 作用 | 区别 - --- | --- | --- - addArc | 添加一个圆弧到path | 直接添加一个圆弧到path中 - arcTo | 添加一个圆弧到path | 添加一个圆弧到path,如果圆弧的起点和上次最后一个坐标点不相同,就连接两个点 +| 名称 | 作用 | 区别 | +| ------ | ----------- | --------------------------------------- | +| addArc | 添加一个圆弧到path | 直接添加一个圆弧到path中 | +| arcTo | 添加一个圆弧到path | 添加一个圆弧到path,如果圆弧的起点和上次最后一个坐标点不相同,就连接两个点 | 可以看到addArc有1个方法(_实际上是两个的,但另一个重载方法是API21添加的_), 而arcTo有2个方法,其中一个最后多了一个布尔类型的变量forceMoveTo。 @@ -395,10 +395,10 @@ CCW | counter-clockwise | 逆时针 这个变量意思为“是否强制使用moveTo”,也就是说,是否使用moveTo将变量移动到圆弧的起点位移,也就意味着: -forceMoveTo | 含义 | 等价方法 - --- | --- | --- - true | 将最后一个点移动到圆弧起点,即不连接最后一个点与圆弧起点 | public void addArc (RectF oval, float startAngle, float sweepAngle) - false | 不移动,而是连接最后一个点与圆弧起点 | public void arcTo (RectF oval, float startAngle, float sweepAngle) +| forceMoveTo | 含义 | 等价方法 | +| ----------- | ---------------------------- | ---------------------------------------- | +| true | 将最后一个点移动到圆弧起点,即不连接最后一个点与圆弧起点 | public void addArc (RectF oval, float startAngle, float sweepAngle) | +| false | 不移动,而是连接最后一个点与圆弧起点 | public void arcTo (RectF oval, float startAngle, float sweepAngle) | **示例(addArc):** ``` java @@ -526,10 +526,10 @@ log 输出结果: 其实第二个方法中最后的参数das是存储平移后的path的。 -dst状态 | 效果 - --------------|--------------------------------- - dst不为空 | 将当前path平移后的状态存入dst中,不会影响当前path - dat为空(null) | 平移将作用于当前path,相当于第一种方法 +| dst状态 | 效果 | +| ----------- | ------------------------------ | +| dst不为空 | 将当前path平移后的状态存入dst中,不会影响当前path | +| dat为空(null) | 平移将作用于当前path,相当于第一种方法 | 示例: ``` java diff --git a/CustomView/Advance/[06]Path_Bezier.md b/CustomView/Advance/[06]Path_Bezier.md index 26f38ea8..4384d9c2 100644 --- a/CustomView/Advance/[06]Path_Bezier.md +++ b/CustomView/Advance/[06]Path_Bezier.md @@ -3,33 +3,32 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) -在上一篇文章[Path之基本图形](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_BasicGraphics.md)中我们了解了Path的基本使用方法,本次了解Path中非常非常非常重要的内容-贝塞尔曲线。 - +在上一篇文章[Path之基本图形](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B05%5DPath_BasicGraphics.md)中我们了解了Path的基本使用方法,本次了解Path中非常非常非常重要的内容-贝塞尔曲线。 ****** ## 一.Path常用方法表 > 为了兼容性(_偷懒_) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法。忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊。宝宝此刻内心也是崩溃的。 -作用 | 相关方法 | 备注 -----------------|-----------------|------------------------------------------ -移动起点 | moveTo | 移动下一次操作的起点位置 -设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 -连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path -闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 -添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) -是否为空 | isEmpty | 判断Path是否为空 -是否为矩形 | isRect | 判断path是否是一个矩形 -替换路径 | set | 用新的路径替换到当前路径所有内容 -偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) -贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 -rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量), rXxx方法是基于当前点坐标系(偏移量)** -填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 设置,获取,判断和切换填充模式 -提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** -布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) -计算边界 | computeBounds | 计算Path的边界 -重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** -矩阵操作 | transform | 矩阵变换 +| 作用 | 相关方法 | 备注 | +| ----------- | ---------------------------------------- | ---------------------------------------- | +| 移动起点 | moveTo | 移动下一次操作的起点位置 | +| 设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 | +| 连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path | +| 闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 | +| 添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) | +| 是否为空 | isEmpty | 判断Path是否为空 | +| 是否为矩形 | isRect | 判断path是否是一个矩形 | +| 替换路径 | set | 用新的路径替换到当前路径所有内容 | +| 偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) | +| 贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 | +| rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量), rXxx方法是基于当前点坐标系(偏移量)** | +| 填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 设置,获取,判断和切换填充模式 | +| 提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** | +| 布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) | +| 计算边界 | computeBounds | 计算Path的边界 | +| 重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** | +| 矩阵操作 | transform | 矩阵变换 | ## 二.Path详解 @@ -64,14 +63,14 @@ rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是 以上几种类型中比较有用的就是基础型和实战型,但两者各有不足,本文会综合两者内容,从零开始学习贝塞尔曲线。 ### 第一步.理解贝塞尔曲线的原理 - + 此处理解贝塞尔曲线并非是学会公式的推导过程(不是推倒(ノ*・ω・)ノ),而是要了解贝塞尔曲线是如何生成的。 贝塞尔曲线是用一系列点来控制曲线状态的,我将这些点简单分为两类: - 类型 | 作用 --------|------ -数据点 | 确定曲线的起始和结束位置 -控制点 | 确定曲线的弯曲程度 +| 类型 | 作用 | +| ---- | ------------ | +| 数据点 | 确定曲线的起始和结束位置 | +| 控制点 | 确定曲线的弯曲程度 | > 此处暂时仅作了解概念,接下来就会讲解其中详细的含义。 @@ -101,7 +100,7 @@ rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是 ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f361oje6h1j308c0dwdg0.jpg) - + 连接DE,取点F,使得: @@ -131,7 +130,7 @@ rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是 #### 一阶曲线: -一阶曲线是一条线段,非常简单,可以参见上一篇文章[Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md),此处就不详细讲解了。 +一阶曲线是一条线段,非常简单,可以参见上一篇文章[Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/5%5DPath_Basic.md),此处就不详细讲解了。 #### 二阶曲线: @@ -331,10 +330,10 @@ public class Bezier2 extends View { #### 降阶与升阶 -类型 | 释义 | 变化 ------|---|--- -降阶 | 在保持曲线形状与方向不变的情况下,减少控制点数量,即降低曲线阶数 | 方法变得简单,数据点变多,控制点可能减少,灵活性变弱 -升阶 | 在保持曲线形状与方向不变的情况下,增加控制点数量,即升高曲线阶数 | 方法更加复杂,数据点不变,控制点增加,灵活性变强 +| 类型 | 释义 | 变化 | +| ---- | -------------------------------- | -------------------------- | +| 降阶 | 在保持曲线形状与方向不变的情况下,减少控制点数量,即降低曲线阶数 | 方法变得简单,数据点变多,控制点可能减少,灵活性变弱 | +| 升阶 | 在保持曲线形状与方向不变的情况下,增加控制点数量,即升高曲线阶数 | 方法更加复杂,数据点不变,控制点增加,灵活性变强 | ### 第三步.贝塞尔曲线使用实例 @@ -342,12 +341,12 @@ public class Bezier2 extends View { > 需要绘制不规则图形时? 当然不是!目前来说,我觉得使用贝塞尔曲线主要有以下几个方面(仅个人拙见,可能存在错误,欢迎指正) -序号 | 内容 | 用例 ------|-----------------------------------------------|--------- - 1 | 事先不知道曲线状态,需要实时计算时 | 天气预报气温变化的平滑折线图 - 2 | 显示状态会根据用户操作改变时 | QQ小红点,仿真翻书效果 - 3 | 一些比较复杂的运动状态(配合PathMeasure使用) | 复杂运动状态的动画效果 - +| 序号 | 内容 | 用例 | +| ---- | ---------------------------- | -------------- | +| 1 | 事先不知道曲线状态,需要实时计算时 | 天气预报气温变化的平滑折线图 | +| 2 | 显示状态会根据用户操作改变时 | QQ小红点,仿真翻书效果 | +| 3 | 一些比较复杂的运动状态(配合PathMeasure使用) | 复杂运动状态的动画效果 | + 至于只需要一个静态的曲线图形的情况,用图片岂不是更好,大量的计算会很不划算。 如果是显示SVG矢量图的话,已经有相关的解析工具了(内部依旧运用的有贝塞尔曲线),不需要手动计算。 @@ -375,15 +374,15 @@ public class Bezier2 extends View { #### 核心难点: ##### 1.如何得到数据点和控制点的位置? - + 关于使用绘制圆形的数据点与控制点早就已经有人详细的计算好了,可以参考stackoverflow的一个回答[How to create circle with Bézier curves?](http://stackoverflow.com/questions/1734745/how-to-create-circle-with-b%C3%A9zier-curves)其中的数据只需要拿来用即可。 - + 而对于心形的数据点和控制点,可以由圆形的部分数据点和控制点平移后得到,具体参数可以自己慢慢调整到一个满意的效果。 - + ##### 2.如何达到渐变效果? - + 渐变其实就是每次对数据点和控制点稍微移动一点,然后重绘界面,在短时间多次的调整数据点与控制点,使其逐渐接近目标值,通过不断的重绘界面达到一种渐变的效果。过程可以参照下图动态效果: - + ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f3ch74ewiig308c0e8wic.gif) #### 代码: diff --git a/CustomView/Advance/[07]Path_Over.md b/CustomView/Advance/[07]Path_Over.md index be9818bc..a942b63d 100644 --- a/CustomView/Advance/[07]Path_Over.md +++ b/CustomView/Advance/[07]Path_Over.md @@ -3,32 +3,32 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) -经历过前两篇 [Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) 和 [Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) 的讲解,本篇终于进入Path的收尾篇,本篇结束后Path的大部分相关方法都已经讲解完了,但Path还有一些更有意思的玩法,应该会在后续的文章中出现吧,嗯,应该会的ˊ_>ˋ +经历过前两篇 [Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B05%5DPath_Basic.md) 和 [Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B06%5DPath_Bezier.md) 的讲解,本篇终于进入Path的收尾篇,本篇结束后Path的大部分相关方法都已经讲解完了,但Path还有一些更有意思的玩法,应该会在后续的文章中出现吧,嗯,应该会的ˊ_>ˋ ****** ## 一.Path常用方法表 > 为了兼容性(_偷懒_) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法。忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊。宝宝此刻内心也是崩溃的。 -作用 | 相关方法 | 备注 -----------------|-----------------|------------------------------------------ -移动起点 | moveTo | 移动下一次操作的起点位置 -设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 -连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path -闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 -添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) -是否为空 | isEmpty | 判断Path是否为空 -是否为矩形 | isRect | 判断path是否是一个矩形 -替换路径 | set | 用新的路径替换到当前路径所有内容 -偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) -贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 -rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量), rXxx方法是基于当前点坐标系(偏移量)** -填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 设置,获取,判断和切换填充模式 -提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** -布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) -计算边界 | computeBounds | 计算Path的边界 -重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** -矩阵操作 | transform | 矩阵变换 +| 作用 | 相关方法 | 备注 | +| ----------- | ---------------------------------------- | ---------------------------------------- | +| 移动起点 | moveTo | 移动下一次操作的起点位置 | +| 设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 | +| 连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path | +| 闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 | +| 添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) | +| 是否为空 | isEmpty | 判断Path是否为空 | +| 是否为矩形 | isRect | 判断path是否是一个矩形 | +| 替换路径 | set | 用新的路径替换到当前路径所有内容 | +| 偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) | +| 贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 | +| rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是基于原点的坐标系(偏移量), rXxx方法是基于当前点坐标系(偏移量)** | +| 填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 设置,获取,判断和切换填充模式 | +| 提示方法 | incReserve | 提示Path还有多少个点等待加入**(这个方法貌似会让Path优化存储结构)** | +| 布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) | +| 计算边界 | computeBounds | 计算Path的边界 | +| 重置路径 | reset, rewind | 清除Path中的内容
**reset不保留内部数据结构,但会保留FillType.**
**rewind会保留内部的数据结构,但不保留FillType** | +| 矩阵操作 | transform | 矩阵变换 | ## 二、Path方法详解 @@ -79,10 +79,10 @@ rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是 > PS:此处所有的图形均为封闭图形,不包括图形不封闭这种情况。 -方法 | 判定条件 | 解释 ----------------|-----------------------------------------------|---------------- -奇偶规则 | 奇数表示在图形内,偶数表示在图形外 | 从任意位置p作一条射线, 若与该射线相交的图形边的数目为奇数,则p是图形内部点,否则是外部点。 -非零环绕数规则 | 若环绕数为0表示在图形外,非零表示在图形内 | 首先使图形的边变为矢量。将环绕数初始化为零。再从任意位置p作一条射线。当从p点沿射线方向移动时,对在每个方向上穿过射线的边计数,每当图形的边从右到左穿过射线时,环绕数加1,从左到右时,环绕数减1。处理完图形的所有相关边之后,若环绕数为非零,则p为内部点,否则,p是外部点。 +| 方法 | 判定条件 | 解释 | +| ------- | --------------------- | ---------------------------------------- | +| 奇偶规则 | 奇数表示在图形内,偶数表示在图形外 | 从任意位置p作一条射线, 若与该射线相交的图形边的数目为奇数,则p是图形内部点,否则是外部点。 | +| 非零环绕数规则 | 若环绕数为0表示在图形外,非零表示在图形内 | 首先使图形的边变为矢量。将环绕数初始化为零。再从任意位置p作一条射线。当从p点沿射线方向移动时,对在每个方向上穿过射线的边计数,每当图形的边从右到左穿过射线时,环绕数加1,从左到右时,环绕数减1。处理完图形的所有相关边之后,若环绕数为非零,则p为内部点,否则,p是外部点。 | 接下来我们先了解一下两种判断方法是如何工作的。 @@ -95,16 +95,16 @@ rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | **不带r的方法是 在上图中有一个四边形,我们选取了三个点来判断这些点是否在图形内部。 > -P1: 从P1发出一条射线,发现图形与该射线相交边数为0,偶数,故P1点在图形外部。
-P2: 从P2发出一条射线,发现图形与该射线相交边数为1,奇数,故P2点在图形内部。
-P3: 从P3发出一条射线,发现图形与该射线相交边数为2,偶数,故P3点在图形外部。
+>P1: 从P1发出一条射线,发现图形与该射线相交边数为0,偶数,故P1点在图形外部。
+>P2: 从P2发出一条射线,发现图形与该射线相交边数为1,奇数,故P2点在图形内部。
+>P3: 从P3发出一条射线,发现图形与该射线相交边数为2,偶数,故P3点在图形外部。
#### 非零环绕数规则(Non-Zero Winding Number Rule) 非零环绕数规则相对来说比较难以理解一点。 -我们在之前的文章 [Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) 中我们了解到,在给Path中添加图形时需要指定图形的添加方式,是用顺时针还是逆时针,另外我们不论是使用lineTo,quadTo,cubicTo还是其他连接线的方法,都是从一个点连接到另一个点,换言之,**Path中任何线段都是有方向性的**,这也是使用非零环绕数规则的基础。 +我们在之前的文章 [Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B05%5DPath_Basic.md) 中我们了解到,在给Path中添加图形时需要指定图形的添加方式,是用顺时针还是逆时针,另外我们不论是使用lineTo,quadTo,cubicTo还是其他连接线的方法,都是从一个点连接到另一个点,换言之,**Path中任何线段都是有方向性的**,这也是使用非零环绕数规则的基础。 我们依旧用一个简单的例子来说明非零环绕数规则的用法: @@ -113,9 +113,9 @@ P3: 从P3发出一条射线,发现图形与该射线相交边数为2,偶数 ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f42368af2jj308c0dwt8z.jpg) > -P1: 从P1点发出一条射线,沿射线防线移动,并没有与边相交点部分,环绕数为0,故P1在图形外边。
-P2: 从P2点发出一条射线,沿射线方向移动,与图形点左侧边相交,该边从左到右穿过穿过射线,环绕数-1,最终环绕数为-1,故P2在图形内部。
-P3: 从P3点发出一条射线,沿射线方向移动,在第一个交点处,底边从右到左穿过射线,环绕数+1,在第二个交点处,右侧边从左到右穿过射线,环绕数-1,最终环绕数为0,故P3在图形外部。
+>P1: 从P1点发出一条射线,沿射线防线移动,并没有与边相交点部分,环绕数为0,故P1在图形外边。
+>P2: 从P2点发出一条射线,沿射线方向移动,与图形点左侧边相交,该边从左到右穿过穿过射线,环绕数-1,最终环绕数为-1,故P2在图形内部。
+>P3: 从P3点发出一条射线,沿射线方向移动,在第一个交点处,底边从右到左穿过射线,环绕数+1,在第二个交点处,右侧边从左到右穿过射线,环绕数-1,最终环绕数为0,故P3在图形外部。
通常,这两种方法的判断结果是相同的,但也存在两种方法判断结果不同的情况,如下面这种情况: @@ -135,12 +135,12 @@ P3: 从P3点发出一条射线,沿射线方向移动,在第一个交点处 Android中的填充模式有四种,是封装在Path中的一个枚举。 -模式 | 简介 ------------------|----------------------- -EVEN_ODD | 奇偶规则 -INVERSE_EVEN_ODD | 反奇偶规则 -WINDING | 非零环绕数规则 -INVERSE_WINDING | 反非零环绕数规则 +| 模式 | 简介 | +| ---------------- | -------- | +| EVEN_ODD | 奇偶规则 | +| INVERSE_EVEN_ODD | 反奇偶规则 | +| WINDING | 非零环绕数规则 | +| INVERSE_WINDING | 反非零环绕数规则 | 我们可以看到上面有四种模式,分成两对,例如 "奇偶规则" 与 "反奇偶规则" 是一对,它们之间有什么关系呢? @@ -150,12 +150,12 @@ Inverse 和含义是“相反,对立”,说明反奇偶规则刚好与奇偶 > 这些都是Path中的方法。 -方法 | 作用 -------------------------|---------------------------- -setFillType | 设置填充规则 -getFillType | 获取当前填充规则 -isInverseFillType | 判断是否是反向(INVERSE)规则 -toggleInverseFillType | 切换填充规则(即原有规则与反向规则之间相互切换) +| 方法 | 作用 | +| --------------------- | ------------------------ | +| setFillType | 设置填充规则 | +| getFillType | 获取当前填充规则 | +| isInverseFillType | 判断是否是反向(INVERSE)规则 | +| toggleInverseFillType | 切换填充规则(即原有规则与反向规则之间相互切换) | #### 示例演示: @@ -247,13 +247,13 @@ toggleInverseFillType | 切换填充规则(即原有规则与反向规则之 Path的布尔运算有五种逻辑,如下: -逻辑名称 | 类比 | 说明 | 示意图 --------------------|------|----------------------------------------|------------------------- -DIFFERENCE | 差集 | Path1中减去Path2后剩下的部分 | ![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f43j85gcaqj305k03c0sn.jpg) -REVERSE_DIFFERENCE | 差集 | Path2中减去Path1后剩下的部分 | ![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f43jbaaw80j305k03c0sn.jpg) -INTERSECT | 交集 | Path1与Path2相交的部分 | ![](http://ww3.sinaimg.cn/large/005Xtdi2gw1f43jbj4iddj305k03c746.jpg) -UNION | 并集 | 包含全部Path1和Path2 | ![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f43jbqk8rbj305k03cmx4.jpg) -XOR | 异或 | 包含Path1与Path2但不包括两者相交的部分 | ![](http://ww3.sinaimg.cn/large/005Xtdi2gw1f43jby8c60j305k03c0sp.jpg) +| 逻辑名称 | 类比 | 说明 | 示意图 | +| ------------------ | ---- | ------------------------ | ---------------------------------------- | +| DIFFERENCE | 差集 | Path1中减去Path2后剩下的部分 | ![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f43j85gcaqj305k03c0sn.jpg) | +| REVERSE_DIFFERENCE | 差集 | Path2中减去Path1后剩下的部分 | ![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f43jbaaw80j305k03c0sn.jpg) | +| INTERSECT | 交集 | Path1与Path2相交的部分 | ![](http://ww3.sinaimg.cn/large/005Xtdi2gw1f43jbj4iddj305k03c746.jpg) | +| UNION | 并集 | 包含全部Path1和Path2 | ![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f43jbqk8rbj305k03cmx4.jpg) | +| XOR | 异或 | 包含Path1与Path2但不包括两者相交的部分 | ![](http://ww3.sinaimg.cn/large/005Xtdi2gw1f43jby8c60j305k03c0sp.jpg) | #### 布尔运算方法 @@ -282,7 +282,7 @@ XOR | 异或 | 包含Path1与Path2但不包括两者相交的部 代码: -``` java +​``` java int x = 80; int r = 100; @@ -331,10 +331,10 @@ XOR | 异或 | 包含Path1与Path2但不包括两者相交的部 它有两个参数: -参数 | 作用 --------|-------- -bounds | 测量结果会放入这个矩形 -exact | 是否精确测量,目前这一个参数作用已经废弃,一般写true即可。 +| 参数 | 作用 | +| ------ | ------------------------------- | +| bounds | 测量结果会放入这个矩形 | +| exact | 是否精确测量,目前这一个参数作用已经废弃,一般写true即可。 | 关于exact如有疑问可参见Google官方的提交记录[Path.computeBounds()](https://code.google.com/p/android/issues/detail?id=4070) @@ -371,10 +371,10 @@ exact | 是否精确测量,目前这一个参数作用已经废弃,一般 重置Path有两个方法,分别是reset和rewind,两者区别主要有一下两点: -方法 | 是否保留FillType设置 | 是否保留原有数据结构 --------|:--------------------:|:--------------------: -reset | 是 | 否 -rewind | 否 | 是 +| 方法 | 是否保留FillType设置 | 是否保留原有数据结构 | +| ------ | :------------: | :--------: | +| reset | 是 | 否 | +| rewind | 否 | 是 | **这个两个方法应该何时选择呢?** @@ -384,7 +384,7 @@ _因为“FillType”影响的是显示效果,而“数据结构”影响的 ## 总结 - + Path中常用的方法到此已经结束,希望能够帮助大家加深对Path对理解运用,让大家能够用Path愉快的玩耍。( ̄▽ ̄) (,,• ₃ •,,) diff --git a/CustomView/Advance/[08]Path_Play.md b/CustomView/Advance/[08]Path_Play.md index 181158c6..3c6e342c 100644 --- a/CustomView/Advance/[08]Path_Play.md +++ b/CustomView/Advance/[08]Path_Play.md @@ -5,9 +5,9 @@ 可以看到,在经过 -[Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md) -[Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md) 和 -[Path之完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md) 后, Path中各类方法基本上都讲完了,表格中还没有讲解到到方法就是矩阵变换了,难道本篇终于要讲矩阵了? +[Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B05%5DPath_Basic.md) +[Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B06%5DPath_Bezier.md) 和 +[Path之完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B07%5DPath_Over.md) 后, Path中各类方法基本上都讲完了,表格中还没有讲解到到方法就是矩阵变换了,难道本篇终于要讲矩阵了? 非也,矩阵这一部分仍在后面单独讲解,本篇主要讲解 PathMeasure 这个类与 Path 的一些使用技巧。 > PS:不要问我为什么不讲 PathEffect,因为这个方法在后面的Paint系列中。 @@ -24,22 +24,22 @@ ### 构造方法 -方法名 | 释义 ----|--- -PathMeasure() | 创建一个空的PathMeasure -PathMeasure(Path path, boolean forceClosed) | 创建 PathMeasure 并关联一个指定的Path(Path需要已经创建完成)。 +| 方法名 | 释义 | +| ---------------------------------------- | ---------------------------------------- | +| PathMeasure() | 创建一个空的PathMeasure | +| PathMeasure(Path path, boolean forceClosed) | 创建 PathMeasure 并关联一个指定的Path(Path需要已经创建完成)。 | ### 公共方法 -返回值 | 方法名 | 释义 ---------|--------------------------------------------------------------------------|------------------- -void | setPath(Path path, boolean forceClosed) | 关联一个Path -boolean | isClosed() | 是否闭合 -float | getLength() | 获取Path的长度 -boolean | nextContour() | 跳转到下一个轮廓 -boolean | getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo) | 截取片段 -boolean | getPosTan(float distance, float[] pos, float[] tan) | 获取指定长度的位置坐标及该点切线值 -boolean | getMatrix(float distance, Matrix matrix, int flags) | 获取指定长度的位置坐标及该点Matrix +| 返回值 | 方法名 | 释义 | +| ------- | ---------------------------------------- | -------------------- | +| void | setPath(Path path, boolean forceClosed) | 关联一个Path | +| boolean | isClosed() | 是否闭合 | +| float | getLength() | 获取Path的长度 | +| boolean | nextContour() | 跳转到下一个轮廓 | +| boolean | getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo) | 截取片段 | +| boolean | getPosTan(float distance, float[] pos, float[] tan) | 获取指定长度的位置坐标及该点切线值 | +| boolean | getMatrix(float distance, Matrix matrix, int flags) | 获取指定长度的位置坐标及该点Matrix | PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 @@ -138,13 +138,13 @@ getSegment 用于获取Path的一个片段,方法如下: 方法各个参数释义: -参数 | 作用 | 备注 -----------------|----------------------------------|-------------------------------------------- -返回值(boolean) | 判断截取是否成功 | true 表示截取成功,结果存入dst中,false 截取失败,不会改变dst中内容 -startD | 开始截取位置距离 Path 起点的长度 | 取值范围: 0 <= startD < stopD <= Path总长度 -stopD | 结束截取位置距离 Path 起点的长度 | 取值范围: 0 <= startD < stopD <= Path总长度 -dst | 截取的 Path 将会添加到 dst 中 | 注意: 是添加,而不是替换 -startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取的 Path 第一个点位置不变 +| 参数 | 作用 | 备注 | +| --------------- | -------------------- | ---------------------------------------- | +| 返回值(boolean) | 判断截取是否成功 | true 表示截取成功,结果存入dst中,false 截取失败,不会改变dst中内容 | +| startD | 开始截取位置距离 Path 起点的长度 | 取值范围: 0 <= startD < stopD <= Path总长度 | +| stopD | 结束截取位置距离 Path 起点的长度 | 取值范围: 0 <= startD < stopD <= Path总长度 | +| dst | 截取的 Path 将会添加到 dst 中 | 注意: 是添加,而不是替换 | +| startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取的 Path 第一个点位置不变 | > * 如果 startD、stopD 的数值不在取值范围 [0, getLength] 内,或者 startD == stopD 则返回值为 false,不会改变 dst 内容。 @@ -230,10 +230,10 @@ startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取 从而我们可以用以下规则来判断 startWithMoveTo 的取值: -取值 | 主要功用 -------|------------------ -true | 保证截取得到的 Path 片段不会发生形变 -false | 保证存储截取片段的 Path(dst) 的连续性 +| 取值 | 主要功用 | +| ----- | ------------------------ | +| true | 保证截取得到的 Path 片段不会发生形变 | +| false | 保证存储截取片段的 Path(dst) 的连续性 | @@ -296,12 +296,12 @@ log输出结果: 方法各个参数释义: -参数 | 作用 | 备注 -----------------|----------------------------------|-------------------------------------------- -返回值(boolean) | 判断获取是否成功 | true表示成功,数据会存入 pos 和 tan 中,
false 表示失败,pos 和 tan 不会改变 -distance | 距离 Path 起点的长度 | 取值范围: 0 <= distance <= getLength -pos | 该点的坐标值 | 坐标值: (x==[0], y==[1]) -tan | 该点的正切值 | 正切值: (x==[0], y==[1]) +| 参数 | 作用 | 备注 | +| ------------ | ------------- | ---------------------------------------- | +| 返回值(boolean) | 判断获取是否成功 | true表示成功,数据会存入 pos 和 tan 中,
false 表示失败,pos 和 tan 不会改变 | +| distance | 距离 Path 起点的长度 | 取值范围: 0 <= distance <= getLength | +| pos | 该点的坐标值 | 坐标值: (x==[0], y==[1]) | +| tan | 该点的正切值 | 正切值: (x==[0], y==[1]) | 这个方法也不难理解,除了其中 `tan` 这个东东,这个东西是干什么的呢? @@ -387,12 +387,12 @@ boolean getMatrix (float distance, Matrix matrix, int flags) 方法各个参数释义: -参数 | 作用 | 备注 -----------------|----------------------------------|-------------------------------------------- -返回值(boolean) | 判断获取是否成功 | true表示成功,数据会存入matrix中,false 失败,matrix内容不会改变 -distance | 距离 Path 起点的长度 | 取值范围: 0 <= distance <= getLength -matrix | 根据 falgs 封装好的matrix | 会根据 flags 的设置而存入不同的内容 -flags | 规定哪些内容会存入到matrix中 | 可选择
POSITION_MATRIX_FLAG(位置)
ANGENT_MATRIX_FLAG(正切) +| 参数 | 作用 | 备注 | +| ------------ | ------------------- | ---------------------------------------- | +| 返回值(boolean) | 判断获取是否成功 | true表示成功,数据会存入matrix中,false 失败,matrix内容不会改变 | +| distance | 距离 Path 起点的长度 | 取值范围: 0 <= distance <= getLength | +| matrix | 根据 falgs 封装好的matrix | 会根据 flags 的设置而存入不同的内容 | +| flags | 规定哪些内容会存入到matrix中 | 可选择
POSITION_MATRIX_FLAG(位置)
ANGENT_MATRIX_FLAG(正切) | 其实这个方法就相当于我们在前一个例子中封装 `matrix` 的过程由 `getMatrix` 替我们做了,我们可以直接得到一个封装好到 `matrix`,岂不快哉。 @@ -447,17 +447,17 @@ measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasur 我们知道,用Path可以创建出各种个样的图形,但如果图形过于复杂时,用代码写就不现实了,不仅麻烦,而且容易出错,所以在绘制复杂的图形时我们一般是将 SVG 图像转换为 Path。 **你说什么是 SVG?** - + SVG 是一种矢量图,内部用的是 xml 格式化存储方式存储这操作和数据,你完全可以将 SVG 看作是 Path 的各项操作简化书写后的存储格式。 - + Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f4g87vfjbeg30690b4go8.gif) ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f4g89vqhqwg30690b4mzu.gif) > -**该图片来自这个开源库 ->[PathView](https://github.com/geftimov/android-pathview)**
-**SVG 转 Path 的解析可以用这个库 -> [AndroidSVG](https://bigbadaboom.github.io/androidsvg/)** +>**该图片来自这个开源库 ->[PathView](https://github.com/geftimov/android-pathview)**
+>**SVG 转 Path 的解析可以用这个库 -> [AndroidSVG](https://bigbadaboom.github.io/androidsvg/)** 限于篇幅以及本人精力,这一部分就暂不详解了,感兴趣的可以直接看源码,或者搜索一些相关的解析文章。 @@ -468,7 +468,7 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: **话说本篇文章的名字不是叫 玩出花样么?怎么只见前面啰啰嗦嗦的扯了一大堆不明所以的东西,花样在哪里?** > -**前面的内容虽然啰嗦繁杂,但却是重中之重的基础,如果在修仙界,这叫根基,而下面讲述的内容的是招式,有了根基才能演化出千变万化的招式,而没有根基只学招式则是徒有其表,只能学一样会一样,很难适应千变万化的需求。** +>**前面的内容虽然啰嗦繁杂,但却是重中之重的基础,如果在修仙界,这叫根基,而下面讲述的内容的是招式,有了根基才能演化出千变万化的招式,而没有根基只学招式则是徒有其表,只能学一样会一样,很难适应千变万化的需求。** 先放一个效果图,然后分析一下实现过程: @@ -476,12 +476,12 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: 这是一个搜索的动效图,通过分析可以得到它应该有四种状态,分别如下: -状态 |概述 ----------|-------------------------------------------------- -初始状态 | 初始状态,没有任何动效,只显示一个搜索标志 :mag: -准备搜索 | 放大镜图标逐渐变化为一个点 -正在搜索 | 围绕这一个圆环运动,并且线段长度会周期性变化 -准备结束 | 从一个点逐渐变化成为放大镜图标 +| 状态 | 概述 | +| ---- | --------------------------- | +| 初始状态 | 初始状态,没有任何动效,只显示一个搜索标志 :mag: | +| 准备搜索 | 放大镜图标逐渐变化为一个点 | +| 正在搜索 | 围绕这一个圆环运动,并且线段长度会周期性变化 | +| 准备结束 | 从一个点逐渐变化成为放大镜图标 | 这些状态是有序转换的,转换流程以及转换条件如下: diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 044cbaf4..b4f4b346 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -18,12 +18,12 @@

## 前言 -本文内容偏向理论,和 [画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 有重叠的部分,本文会让你更加深入的了解其中的原理。 +本文内容偏向理论,和 [画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B03%5DCanvas_Convert.md) 有重叠的部分,本文会让你更加深入的了解其中的原理。 本篇的主角Matrix,是一个一直在后台默默工作的劳动模范,虽然我们所有看到View背后都有着Matrix的功劳,但我们却很少见到它,本篇我们就看看它是何方神圣吧。 > -由于Google已经对这一部分已经做了很好的封装,所以跳过本部分对实际开发影响并不会太大,不想深究的粗略浏览即可,下一篇中将会详细讲解Matrix的具体用法和技巧。 +>由于Google已经对这一部分已经做了很好的封装,所以跳过本部分对实际开发影响并不会太大,不想深究的粗略浏览即可,下一篇中将会详细讲解Matrix的具体用法和技巧。 ****** @@ -138,13 +138,13 @@ y_0 \\\\ \\right ] $$) -> -你可能注意到了,我们坐标多了一个1,这是使用了齐次坐标系的缘故,在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,计算机无法区分,为此让计算机也可以区分它们,增加了一个标志位,增加之后看起来是这样:
> -(x, y, 1) - 点
-(x, y, 0) - 向量
+> 你可能注意到了,我们坐标多了一个1,这是使用了齐次坐标系的缘故,在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,计算机无法区分,为此让计算机也可以区分它们,增加了一个标志位,增加之后看起来是这样:
+> +> (x, y, 1) - 点
+> (x, y, 0) - 向量
> -另外,齐次坐标具有等比的性质,(2,3,1)、(4,6,2)...(2N,3N,N)表示的均是(2,3)这一个点。(**将MPERSP_2解释为scale这一误解就源于此**)。 +> 另外,齐次坐标具有等比的性质,(2,3,1)、(4,6,2)...(2N,3N,N)表示的均是(2,3)这一个点。(**将MPERSP_2解释为scale这一误解就源于此**)。 图例: @@ -328,8 +328,8 @@ $$) ### 4.平移(Translate) -> -此处也是使用齐次坐标的优点体现之一,实际上前面的三个操作使用 2x2 的矩阵也能满足需求,但是使用 2x2 的矩阵,无法将平移操作加入其中,而将坐标扩展为齐次坐标后,将矩阵扩展为 3x3 就可以将算法统一,四种算法均可以使用矩阵乘法完成。 +> +> 此处也是使用齐次坐标的优点体现之一,实际上前面的三个操作使用 2x2 的矩阵也能满足需求,但是使用 2x2 的矩阵,无法将平移操作加入其中,而将坐标扩展为齐次坐标后,将矩阵扩展为 3x3 就可以将算法统一,四种算法均可以使用矩阵乘法完成。 ![](http://latex.codecogs.com/png.latex?$$ x = x_0 + \\Delta x $$) @@ -616,16 +616,16 @@ $$) 这个方法表,暂时放到这里让大家看看,方法的使用讲解放在下一篇文章中。 -方法类别 | 相关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 | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... +| 方法类别 | 相关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 | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... |

## 总结 From 0ec832b2e334718a4e23b05188abc4d92582c486 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 23 Sep 2016 19:59:41 +0800 Subject: [PATCH 438/615] Update --- QuickChart/Canvas.md | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/QuickChart/Canvas.md b/QuickChart/Canvas.md index edc90448..5b5f269c 100644 --- a/QuickChart/Canvas.md +++ b/QuickChart/Canvas.md @@ -1,14 +1,28 @@ # Canvas常用操作速查表 -操作分类 | 相关API | 备注 ----------|---------|-------------- -绘制颜色 | drawColor, drawRGB, drawARGB | 使用单一颜色填充整个画布
**相关链接:**
[【基础-颜色】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B3%5DColor.md)
[【Canvas-颜色与基本形状】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md) -绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧
**相关链接 :**
[【Canvas-颜色与基本形状】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md) -绘制图片 | drawBitmap, drawPicture | 绘制位图和图片
**相关链接:**
[【Canvas-图片文字】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) -绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字
**相关链接:**
[【Canvas-图片文字】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) -绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数
**相关链接:**
[【Path-基本操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md)
[【Path-贝塞尔曲线】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md)
[【Path-完结篇(伪)】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md)
[【Path-Path玩出花样(PathMeasure)】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B08%5DPath_Play.md) -顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 -画布剪裁 | clipPath, clipRect | 设置画布的显示区域 -画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 会滚到指定状态、 获取保存次数
**相关链接:**
[【Canvas-画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) -画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切
**相关链接:**
[【基础-坐标系】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md)
[【基础-角度弧度】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B2%5DAngleAndRadian.md)
[【Canvas-画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) -Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放等操作的都是图像矩阵Matrix,只不过Matrix比较难以理解和使用,故封装了一些常用的方法。
[【Matrix-原理】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B09%5DMatrix_Basic.md) +| 操作分类 | 相关API | 备注 | +| ---------- | ---------------------------------------- | ---------------------------------------- | +| 绘制颜色 | drawColor, drawRGB, drawARGB | 使用单一颜色填充整个画布
**相关链接:**
[【基础-颜色】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B3%5DColor.md)
[【Canvas-颜色与基本形状】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md) | +| 绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧
**相关链接 :**
[【Canvas-颜色与基本形状】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md) | +| 绘制图片 | drawBitmap, drawPicture | 绘制位图和图片
**相关链接:**
[【Canvas-图片文字】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) | +| 绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字
**相关链接:**
[【Canvas-图片文字】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) | +| 绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数
**相关链接:**
[【Path-基本操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B5%5DPath_Basic.md)
[【Path-贝塞尔曲线】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B6%5DPath_Bezier.md)
[【Path-完结篇(伪)】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B7%5DPath_Over.md)
[【Path-Path玩出花样(PathMeasure)】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B08%5DPath_Play.md) | +| 顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 | +| 画布剪裁 | clipPath, clipRect | 设置画布的显示区域 | +| 画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 会滚到指定状态、 获取保存次数
**相关链接:**
[【Canvas-画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) | +| 画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切
**相关链接:**
[【基础-坐标系】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md)
[【基础-角度弧度】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B2%5DAngleAndRadian.md)
[【Canvas-画布操作】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) | +| Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放等操作的都是图像矩阵Matrix,只不过Matrix比较难以理解和使用,故封装了一些常用的方法。
[【Matrix-原理】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B09%5DMatrix_Basic.md) | + +| 操作类型 | 相关API | 备注 | +| ---------- | ---------------------------------------- | ---------------------------------------- | +| 基础方法 | getDensity, getWidth, getHeight,getDrawFilter,isHardwareAccelerated(API 11),getMaximumBitmapWidth,getMaximumBitmapHeight,getDensity,quickReject,isOpaque,setBitmap,setDrawFilter | 使用单一颜色填充画布 | +| 绘制颜色 | drawColor, drawRGB, drawARGB,drawPaint | 使用单一颜色填充画布 | +| 绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧 | +| 绘制图片 | drawBitmap, drawPicture | 绘制位图和图片 | +| 绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字 | +| 绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数 | +| 顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 | +| 画布剪裁 | clipPath, clipRect, clipRegion,getClipBounds | 画布剪裁相关方法 | +| 画布快照 | save, restore, saveLayer, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数 | +| 画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 | +| Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放等操作的都是图像矩阵Matrix,只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 | From 466ef074b68a5722987f88ee1aabd237fe182011 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 25 Sep 2016 04:29:55 +0800 Subject: [PATCH 439/615] Update --- QuickChart/Matrix.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/QuickChart/Matrix.md b/QuickChart/Matrix.md index 5aecb593..6aaead2c 100644 --- a/QuickChart/Matrix.md +++ b/QuickChart/Matrix.md @@ -13,5 +13,7 @@ ## 相关文章 -* [Matrix原理](http://www.gcssloop.com/2015/02/Matrix_Basic/) -* [Matrix详解](http://www.gcssloop.com/2015/02/Matrix_Method/) +* [安卓自定义View进阶 - Matrix原理](http://www.gcssloop.com/customview/Matrix_Basic/) +* [安卓自定义View进阶 - Matrix详解](http://www.gcssloop.com/customview/Matrix_Method/) +* [安卓自定义View进阶 - Matrix Camera](http://www.gcssloop.com/customview/matrix-3d-camera) + From 2adc99d34fd6c990cf3d0e96d712137e04e0b809 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 26 Sep 2016 05:41:04 +0800 Subject: [PATCH 440/615] Update --- .../\345\237\272\346\234\254\350\257\255\346\263\225.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "ChaosCrystal/Markdowm/\345\237\272\346\234\254\350\257\255\346\263\225.md" diff --git "a/ChaosCrystal/Markdowm/\345\237\272\346\234\254\350\257\255\346\263\225.md" "b/ChaosCrystal/Markdowm/\345\237\272\346\234\254\350\257\255\346\263\225.md" new file mode 100644 index 00000000..8010bd78 --- /dev/null +++ "b/ChaosCrystal/Markdowm/\345\237\272\346\234\254\350\257\255\346\263\225.md" @@ -0,0 +1 @@ +# Markdown 基本语法 From 11daf0d294d204cf04574a15eeed639476681ba5 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 27 Sep 2016 22:52:14 +0800 Subject: [PATCH 441/615] Update --- .../\345\237\272\346\234\254\350\257\255\346\263\225.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/ChaosCrystal/Markdowm/\345\237\272\346\234\254\350\257\255\346\263\225.md" "b/ChaosCrystal/Markdowm/\345\237\272\346\234\254\350\257\255\346\263\225.md" index 8010bd78..b711b2b6 100644 --- "a/ChaosCrystal/Markdowm/\345\237\272\346\234\254\350\257\255\346\263\225.md" +++ "b/ChaosCrystal/Markdowm/\345\237\272\346\234\254\350\257\255\346\263\225.md" @@ -1 +1,3 @@ # Markdown 基本语法 + +## 标题 From bdcbc29ffbfd9f3075e7c895e339b69ad84da573 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 28 Sep 2016 03:27:39 +0800 Subject: [PATCH 442/615] Update --- CustomView/Demo/dispatchTouchEventDemo.zip | Bin 0 -> 54682 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 CustomView/Demo/dispatchTouchEventDemo.zip diff --git a/CustomView/Demo/dispatchTouchEventDemo.zip b/CustomView/Demo/dispatchTouchEventDemo.zip new file mode 100644 index 0000000000000000000000000000000000000000..ea52c7c4dcf87ee8383f607b153915b99928a1a3 GIT binary patch literal 54682 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 Date: Wed, 28 Sep 2016 04:27:33 +0800 Subject: [PATCH 443/615] Update --- .../Advance/[12]Dispatch-TouchEvent-Theory.md | 316 ++++++++++++++++++ CustomView/Advance/[12]TouchEvent.md | 2 - 2 files changed, 316 insertions(+), 2 deletions(-) create mode 100644 CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md delete mode 100644 CustomView/Advance/[12]TouchEvent.md diff --git a/CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md b/CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md new file mode 100644 index 00000000..ff40e8f5 --- /dev/null +++ b/CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md @@ -0,0 +1,316 @@ +# 事件分发原理 + + +之前讲解了很多与View绘图相关的知识,你可以在 [安卓自定义View教程目录](http://www.gcssloop.com/customview/CustomViewIndex) 中查看到这些文章,如果你理解了这些文章,那么至少2D绘图部分不是难题了,大部分的需求都能满足,但是关于View还有很多知识点,例如: `让绘图更加炫酷的Paint`,`让View动起来的动画`,`与用户交互的触控事件` 等一系列内容。**本次就带大家简单的了解一下与交互息息相关的东西-事件分发原理**。 + +> 本次魔法小火车的终点站是事件分发与拦截,请各位魔法师带好装备,准备登车启程。 + +**注意:本文中所有源码分析部分来源均基于 API23(Android 6.0) 版本,由于安卓系统源码改变很多,可能与之前版本有所不同,但基本流程都是一致的。** + + + +## 为什么要有事件分发机制? + +**安卓上面的View是树形结构的,View可能会重叠在一起,当我们点击的地方有多个View都可以响应的时候,这个点击事件应该给谁呢?为了解决这一个问题,就有了事件分发机制。** + +如下图,View是一层一层嵌套的,当手指点击 `View1` 的时候,下面的`ViewGroupA`、 `RootView` 等也是能够响应的,为了确定到底应该是哪个View处理这次点击事件,就需要事件分发机制来帮忙。 + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f87nsnluf5j308c0eamxg.jpg) + + + +## View的结构: + +我们的View是树形结构的,在上一个问题中实例View的结构大致如下: + +**layout文件:** + +```XML + + + + + + + + + + + +``` + + + +**View结构:** + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f87juodlepj308q09ut8v.jpg) + +**可以看到在上面的View结构中莫名多出来的两个东西,`PhoneWindow` 和 `DockerView` ,这两个我们并没有在Layout文件中定义过,但是为什么会存在呢?** + +> 仔细观察上面的 layout 文件,你会发现一个问题,我在 layout 文件中的最顶层 View(Group) 的大小并不是填满父窗体的,留下了大量的空白区域,由于我们的手机屏幕不能透明,所以这些空白区域肯定要显示一些东西,那么应该显示什么呢? +> +> 有过安卓开发经验的都知道,屏幕上没有View遮挡的部分会显示主题的颜色。不仅如此,最上面的一个标题栏也没有在 layout 文件中,这个标题栏又是显示在哪里的呢? +> +> **你没有猜错,这个主题颜色和标题栏等内容就是显示在`DecorView`中的。** + + + +**现在知道 `DecorView` 是干什么的了,那么`PhoneWindow` 又有什么作用?** + +> 要了解 PhoneWindow 是干啥的,首先要了解啥是 Window ,看官方说明: +> +> ```` +> Abstract base class for a top-level window look and behavior policy. An instance of this class should be used as the top-level view added to the window manager. It provides standard UI policies such as a background, title area, default key processing, etc. +> ```` +> +> 简单来说,Window是一个抽象类,是所有视图的最顶层容器,视图的外观和行为都归他管,不论是背景显示,标题栏还是事件处理都是他管理的范畴,它其实就像是View界的太上皇(虽然能管的事情看似很多,但是没实权,因为抽象类不能直接使用)。 +> +> 而 PhoneWindow 作为 Window 的唯一亲儿子(唯一实现类),自然就是 View 界的皇帝了,PhoneWindow 的权利可是非常大大,不过对于我们来说用处并不大,因为皇帝平时都是躲在深宫里面的,虽然偶尔用特殊方法能见上一面,但想要完全指挥 PhoneWindow 为你工作是很困难的。 +> +> 而上面说的 DecorView 是 PhoneWindow 的一个内部类,其职位相当于小太监,就是跟在 PhoneWindow 身边专业为 PhoneWindow 服务的,除了自己要干活之外,也负责消息的传递,PhoneWindow 的指示通过 DecorView 传递给下面的 View,而下面 View 的信息也通过 DecorView 回传给 PhoneWindow。 + + + + ## 事件分发、拦截与消费 + +下表省略了 PhoneWidow 和 DecorView。 + +> `√` 表示有该方法。 +> +> `X` 表示没有该方法。 + +| 类型 | 相关方法 | Activity | ViewGroup | View | +| :--: | :-------------------: | :------: | :-------: | :--: | +| 事件分发 | dispatchTouchEvent | √ | √ | √ | +| 事件拦截 | onInterceptTouchEvent | X | √ | X | +| 事件消费 | onTouchEvent | √ | √ | √ | + + +这个三个方法均有一个 boolean(布尔) 类型的返回值,通过返回 true 和 false 来控制事件传递的流程。 + +PS: 从上表可以看到 Activity 和 View 都是没有时间拦截机制的,这是因为: + +> Activity 作为原始的事件分发者,如果 Activity 拦截了事件会导致整个屏幕都无法响应事件,这肯定不是我们想要的效果。 +> +> View最为事件传递的最末端,要么消费掉事件,要么不处理进行回传,根本没必要进行事件拦截。 + + + +## 事件分发流程 + +前面我们了解到了我们的View是树形结构的,基于这样的结构,我们的事件可以进行有序的分发。 + +事件收集之后最先传递给 Activity, 然后依次向下传递,大致如下: + +``` +Activity -> PhoneWindow -> DecorView -> ViewGroup -> ... -> View +``` + +这样的事件分发机制逻辑非常清晰,可是,你是否注意到一个问题?如果最后分发到View,如果这个View也没有处理事件怎么办,就这样让事件浪费掉? + +当然不会啦,如果没有任何View消费掉事件,那么这个事件会按照反方向回传,最终传回给Activity,如果最后 Activity 也没有处理,本次事件才会被抛弃: + +``` +Activity <- PhoneWindow <- DecorView <- ViewGroup <- ... <- View +``` + +**看到这里,我不禁微微一皱眉,这个东西咋看起来那么熟悉呢?再仔细一看,这不就是一个非常经典的[责任链模式](https://zh.wikipedia.org/wiki/%E8%B4%A3%E4%BB%BB%E9%93%BE%E6%A8%A1%E5%BC%8F)么?** 如果我能处理就拦截下来自己干,如果自己不能处理或者不确定就交给责任链中下一个对象,只不过责任链一般是单向的,而这个提供了一个反向的反馈机制。 + +**这种设计是非常精巧的,上层View既可以直接拦截该事件,自己处理,也可以先询问(分发给)子View,如果子View需要就交给子View处理,如果子View不需要还能继续交给上层View处理。既保证了事件的有序性,又非常的灵活。在我第一次将这个逻辑弄清楚的时候,看着这样精妙的设计,简直想欢呼庆贺一下。** + +其实关于事件传递机制,吴小龙的 [Android事件传递机制分析](http://wuxiaolong.me/2015/12/19/MotionEvent/) 一文中的比喻非常有趣,本文也会借鉴一些其中的内容。 + +先确定几个角色: + +> Activity - 公司大老板 +> +> RootView - 项目经理 +> +> ViewGroupA - 技术小组长 +> +> View1 - 码农小王(公司里唯一的码农) +> +> View2 - 跑龙套的路人甲,无视即可 + +**PS:由于 PhoneWindow 和 DecorView 我们无法直接操作,以下所有示例均省略了 PhoneWindow 和 DecorView。** + + + +### 1.点击 View1 区域但没有任何 View 消费事件 + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f87nsnluf5j308c0eamxg.jpg) + +当手指在 `View1` 区域点击了一下之后,如果所有View都不消耗事件,你就能看到一个完整的事件分发流程,大致如下: + +> 红色箭头方向表示事件分发方向。 +> +> 绿色箭头方向表示事件回传方向。 + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f88i0q8uozj30nm0kqwhm.jpg) + + +> **注意: 上图显示分发流程仅仅是一个示意流程,并不代表实际情况,如果按照实际情况绘制,会导致流程图非常复杂和混乱,在纠结了好久之后做了一个艰难的决定,采用这样一个简化后的流程。** +> +> 上面的流程中存在部分不合理内容,请大家选择性接受。 +> +> 1. 事件返回时 `dispatchTouchEvent` 直接指向了父View的 `onTouchEvent` 这一部分是不合理的,实际上它仅仅是给了父View的 `dispatchTouchEvent` 一个 false 返回值,父View根据返回值来调用自身的 `onTouchEvent`。 +> 2. ViewGroup 是根据 `onInterceptTouchEvent` 的返回值来确定是调用子View的 `dispatchTouchEvent` 还是自身的 `onTouchEvent`, 并没有将调用交给 `onInterceptTouchEvent`。 +> 3. ViewGroup 的事件分发机制伪代码如下,可以看出事件分发的顺序。 +> +> ```java +> public boolean dispatchTouchEvent(MotionEvent ev) { +> boolean result = false; // 默认状态为没有消费过 +> +> if (!onInterceptTouchEvent(ev)) { // 如果没有拦截交给子View +> result = child.dispatchTouchEvent(ev); +> } +> +> if (!result) { // 如果事件没有被消费,询问自身onTouchEvent +> result = onTouchEvent(ev); +> } +> +> return result; +> } +> ``` + +**测试:** + +> **情景:老板: 我看公司最近业务不咋地,准备发展一下电商业务,下周之前做个淘宝出来试试怎么样。** +> +> **事件顺序,老板(MainActivity)要做淘宝,这个事件通过各个部门(ViewGroup)一层一层的往下传,传到最底层的时候,码农小王(View1)发现做不了,于是消息又一层一层的回传到老板那里。** +> +> 可以看到整个事件传递路线非常有序。从Activity开始,最后回传给Activity结束(由于我们无法操作Phone Window和DecorView,所以没有它们的信息)。 + +``` +MainActivity [老板]: dispatchTouchEvent 经理,我准备发展一下电商业务,下周之前做一个淘宝出来. +RootView     [经理]: dispatchTouchEvent 呼叫技术部,老板要做淘宝,下周上线. +RootView     [经理]: onInterceptTouchEvent (老板可能疯了,但又不是我做.) +ViewGroupA   [组长]: dispatchTouchEvent 老板要做淘宝,下周上线? +ViewGroupA   [组长]: onInterceptTouchEvent (看着不太靠谱,先问问小王怎么看) +View1        [码农]: onInterceptTouchEvent 做淘宝??? +View1        [码农]: onTouchEvent 这个真心做不了啊. +ViewGroupA   [组长]: onTouchEvent 小王说做不了. +RootView     [经理]: onTouchEvent 报告老板, 技术部说做不了. +MainActivity [老板]: onTouchEvent 这么简单都做不了,你们都是干啥的(愤怒). +``` + + + +### 2.点击 View1 区域且事件被 View1 消费 + +如果事件被View1消费掉了则事件会回传告诉上层View这个事件已经被我解决了,上层View就无需再响应了。 + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f88ll27wv9j30nm0kqtbo.jpg) + +> 注意:这张图中的事件回传路径才是正确的路径。 + +**测试:** + +> **情景:老板: 我觉得咱们这个app按钮不好看,做的有光泽一点,要让人有一种想点的欲望。** +> +> **事件顺序,老板(MainActivity)要做改界面,这个事件通过各个部门(ViewGroup)一层一层的往下传,传到最底层的时候,码农小王(View1)发现很容易,就在按钮上添加了一道光。** +> +> 可以看出,事件一旦被消费就意味着消息传递的结束,上层View知道了事件已经被消费掉,就不再处理了。 + +``` +MainActivity [老板]: dispatchTouchEvent 把按钮做的好看一点,要有光泽,给人一种点击的欲望. +RootView     [经理]: dispatchTouchEvent 技术部,老板说按钮不好看,要加一道光. +RootView     [经理]: onInterceptTouchEvent +ViewGroupA   [组长]: dispatchTouchEvent 给按钮加上一道光. +ViewGroupA   [组长]: onInterceptTouchEvent +View1        [码农]: onInterceptTouchEvent 加一道光. +View1        [码农]: onTouchEvent 做好了. +``` + +> 加一道光: +> +> ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f88oqj0o4jj304j03paa4.jpg) + + + +### 3.点击 View1 区域但事件被 ViewGroupA 拦截 + +> 上层的View有权拦截事件,不传递给下层View,例如 ListView 滑动的时候,就不会将事件传递给下层的子 View。 + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f88p3r45vfj30nm0kqn00.jpg) + +> 注意:可以看到,如果上层拦截了事件,下层View将接收不到事件信息。 + +**测试:** + +> **情景:老板: 报告一下项目进度。** +> +> **事件顺序,老板(MainActivity)要知道项目进度,这个事件通过各个部门(ViewGroup)一层一层的往下传,传到技术组组长的时候,组长上报任务即可。** + +``` +MainActivity [老板]: dispatchTouchEvent 现在项目做到什么程度了? +RootView     [经理]: dispatchTouchEvent 技术部,你们的app快做完了么? +RootView     [经理]: onInterceptTouchEvent +ViewGroupA   [组长]: dispatchTouchEvent 项目进度? +ViewGroupA   [组长]: onInterceptTouchEvent +ViewGroupA   [组长]: onTouchEvent 正在测试,明天就测试完了 +``` + +### 其他情形 + +事件分发机制设计到到情形非常多,这里就不一一列举了,记住以下几条原则就行了。 + +* 1.如果事件被消费,就意味着事件信息传递终止。 +* 2.如果事件一直没有被消费,最后会传给Activity,如果Activity也不需要就被抛弃。 +* 3.判断事件是否被消费是根据返回值,而不是根据你是否使用了事件。 + + +#### [文中测试用的源码下载](https://raw.githubusercontent.com/GcsSloop/AndroidNote/master/CustomView/Demo/dispatchTouchEventDemo.zip) + +## 总结 + +View的事件分发机制实际上就是一个非常经典的责任链模式,如果你了解责任链模式,那么事件分发对你来说并不是什么难题,如果你不了解责任链模式,刚好借此机会学习一下啦。 + +> **责任链模式:** +> +> 当有多个对象均可以处理同一请求的时候,将这些对象串联成一条链,并沿着这条链传递改请求,直到有对象处理它为止。 + +Android 中事件分发机制原理虽然非常简单,但由于实际运用场景非常复杂,一旦具体到某个场景中变得很麻烦,而本文仅仅是带你简单的了解一下事件分发机制,更详细的内容和具体的一些特殊情形处理会在后续文章中进行讲解。 + +最后,由于个人水平有限,文章中可能会出现错误,如果你觉得哪一部分有错误,或者发现了错别字等内容,欢迎在评论区告诉我,另外,据说关注[作者微博](http://weibo.com/GcsSloop)不仅能第一时间收到新文章消息,还能变帅哦。 + + + +## 参考资料 + +[Activity](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/Activity.java)
+[PhoneWindow](https://android.googlesource.com/platform/frameworks/base/+/696cba573e651b0e4f18a4718627c8ccecb3bda0/policy/src/com/android/internal/policy/impl/PhoneWindow.java)
+[ViewGroup](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewGroup.java)
+[View](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java)
+[Android事件传递机制分析](http://wuxiaolong.me/2015/12/19/MotionEvent/)
+[Android ViewGroup/View 事件分发机制详解](http://anany.me/2015/11/08/touchevent/)
+[ Android事件分发机制完全解析,带你从源码的角度彻底理解(上)](http://blog.csdn.net/guolin_blog/article/details/9097463)
+[ Android事件分发机制完全解析,带你从源码的角度彻底理解(下)](http://blog.csdn.net/sinyu890807/article/details/9153747)
+[更简单的学习Android事件分发](http://www.idtkm.com/customview/customview11/)
+ + + + +## About Me + +### 作者微博: @GcsSloop + + + diff --git a/CustomView/Advance/[12]TouchEvent.md b/CustomView/Advance/[12]TouchEvent.md deleted file mode 100644 index fd411729..00000000 --- a/CustomView/Advance/[12]TouchEvent.md +++ /dev/null @@ -1,2 +0,0 @@ -# 事件分发 - From ab41d9638e01591dd5893a7f9e55770cf39d512d Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 28 Sep 2016 08:17:18 +0800 Subject: [PATCH 444/615] Update --- CustomView/Demo/dispatchTouchEventDemo.zip | Bin 54682 -> 50828 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/CustomView/Demo/dispatchTouchEventDemo.zip b/CustomView/Demo/dispatchTouchEventDemo.zip index ea52c7c4dcf87ee8383f607b153915b99928a1a3..665b5d4c4406b7bc1d595f14aaf360ee0c64e081 100644 GIT binary patch delta 3360 zcmZWr3p|wR9{%Q=!Au5IW*B4KlF-n^PDLrkWuugtMZ=cvkz1}SN3C(GY+7x4Ri|{b zsfehwhFnsKG;X6)ZKqUrw~H9y-O{*Hv8X~2pji$%Ulbj;ktxO+U=6EDD<$0UHDq1V8w>8Vq zjc%Ti5S#XkXB3a}re5HGkG+cZ)SP!K>U*n=&(FWxtY`G>rdTj=d}PVW#q)tQ)L{3# z@82BtG+ytkICv7bjCojMA}cCxKDu~DGu>~Wvvzjkd zl!lkp9WH3im#2iT8fcT7$V>f;=N))I6fbD3{?M*GyU{CpOJ%TS)!z}9ra9keSW>su z)=QlCI3q4wS5`y!5+^Z+w|T$Fla?LP>Cj575==j>KkpPT?D|T#tVGY|ME5g^Pg}DN z^gO#B8+zR&dspxFWzxi!?AI}yoNo+{Jbq9+Dq%j=TYqg}sVuWx=jx=vkbLi&QEu9^ zENs|4R9W)RhGN$O|I6`r^+;a#4a`JKw5V%)zZ(f6VHkytp0C7+2RFJ^73(OP~p{_#WWOH3uRx1so^hG&pH!sbd#dSOPwKK8hR7W}#wGyxwXv z(0PNQp(^2_aR|!f!rg>^q1!F)a^z-dVnHDn3thmI36pRT5hEoXta;B9BJ!<1z)^}Ea z&Tw$vai&}GGWSlsa%;stFNenM2k!3mr%kgcsC(1pQ8qb!udC%REmvN+C}*s?*K#!!wRe{F{c2WfX~3=Nkxvt(He_G=&b?L^5hq9) z2eZ>$cic#SP?Qru6Fgj66r2^Y_H3DwX`{dYs>s(|OgSXnnX5VE_;mxo{P9C>Cw7M0 zc}+3@(Mrdlc#^p+t=hk#$dtB+!3D3+tsc}68ulxV7^m*_z5Oe>KU*U~(pzNu{L$&u zUn5K}jb!SCN+)mONp~sOo&PMIKHKndewz285c8B)XM^=3j%Q(RbfMkwg#**TP14CB zfdNOmP{irFcud~`6ikrjDTKenL-M>_Ad%s<5=-~Vs zuUMW(6MhWg#VQ?)=ANw-^xHl1E8iJ=qEt6#a`@lkpfl%3trN4}?KE$!m-+$rxskKm z+RwgQJZNlk%-`O_E}_?!Wm(ST2hXr!Co0+Yhl6;tnFg7G%VrLXA!7 zY`m&h-QN7Dd!#+Ch8yWu*Pi*uEsm@sxbn4QR^*-c_isO5z3|wT>s0f7mkd4`&OB6UC|pObs7HG z$7iJ7&iMb=G|nPpn1>eVDC2_v z*ae`A#gTwN~)R*a9pQ%!V*<;aURIQXBA-oHlmR;l(~*2@x$YEZ0|| z6+W{aRmza+6oKOPIW_2@2xVWZ0OLh^Gz37g5{bMKD_`WTKMvA1_#iNFL%b=uZcNsc z8H?e#VqT`9EdpWwzA`>IU8;)=veGyl4S40rs=?_CZmL0VMFAQBRn4A=_O3DyN7|TQ zZKF*@o}h=`9QZ%J2k9fB@Fbi?R(D~LT07rV-G)^rwT8R+s2T&fSL|_i6>iJ3=z?@G!dS zbpgZN3e(e&_e>fUQ@0jwJr6e_1JV_v$uq;k6T`zc$HZ@h!C|jSsORH5kP*~VbTz1` zr*snFDNVv-t`aS1T1O|7p)R@o{Y?0lAJtu!Qa=4xWTyplzZ*2Tfl>6d{>-6o`)Lqux~b>;748%!r8U zjjD%jw6mFq$3n;xOq!}Uw&E~V#7z!<#{?N-rt5r>N_CuIs)ZLb-wMR%cBtxyY}XDBUao?F=-`Y;Z|cy+9a9iHwv&qLfVu}gtUEb4P@9aA@~PLS z@g(T!vZEpifpoY)R0Rh&DTFu>DfAE>!dnP9_cVg9jKjoyNIGo5Ol0d z<$Rui2G0?Y(|9b0+Z=p(8374c8^WVEZcdn)932JkClt-G3j{A6St%3(QkN-sa+{_L vZSaM2{O+=KJ_(gl_|q6s!#ZMZ(pvS5kOYgCXlTMy??8O>m>Blk1^DlOjyhds delta 6238 zcmeG=c|25m`{NjfEHh#l#u_C?21#XCXsp??Bvf2NMH*RJ=B7O&ju47UT-o=1OQC%s zEh1@A)+m&U_nb3JGv535yYKt=&wLJNp5^;|pZ$5noZ(K*;}*2D;zln*!9RFnyx

(KT=@DmK&XtGUor!k>D!#^*($2ls0dGxy2sKDn- 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 Date: Thu, 29 Sep 2016 03:19:05 +0800 Subject: [PATCH 445/615] Update --- .../Advance/[12]Dispatch-TouchEvent-Theory.md | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md b/CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md index ff40e8f5..adb468de 100644 --- a/CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md +++ b/CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md @@ -3,9 +3,9 @@ 之前讲解了很多与View绘图相关的知识,你可以在 [安卓自定义View教程目录](http://www.gcssloop.com/customview/CustomViewIndex) 中查看到这些文章,如果你理解了这些文章,那么至少2D绘图部分不是难题了,大部分的需求都能满足,但是关于View还有很多知识点,例如: `让绘图更加炫酷的Paint`,`让View动起来的动画`,`与用户交互的触控事件` 等一系列内容。**本次就带大家简单的了解一下与交互息息相关的东西-事件分发原理**。 -> 本次魔法小火车的终点站是事件分发与拦截,请各位魔法师带好装备,准备登车启程。 +> 本次魔法小火车的终点站是事件分发,请各位魔法师带好装备,准备登车启程。 -**注意:本文中所有源码分析部分来源均基于 API23(Android 6.0) 版本,由于安卓系统源码改变很多,可能与之前版本有所不同,但基本流程都是一致的。** +**注意:本文中所有源码分析部分均基于 API23(Android 6.0) 版本,由于安卓系统源码改变很多,可能与之前版本有所不同,但基本流程都是一致的。** @@ -62,7 +62,7 @@ ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f87juodlepj308q09ut8v.jpg) -**可以看到在上面的View结构中莫名多出来的两个东西,`PhoneWindow` 和 `DockerView` ,这两个我们并没有在Layout文件中定义过,但是为什么会存在呢?** +**可以看到在上面的View结构中莫名多出来的两个东西,`PhoneWindow` 和 `DecorView` ,这两个我们并没有在Layout文件中定义过,但是为什么会存在呢?** > 仔细观察上面的 layout 文件,你会发现一个问题,我在 layout 文件中的最顶层 View(Group) 的大小并不是填满父窗体的,留下了大量的空白区域,由于我们的手机屏幕不能透明,所以这些空白区域肯定要显示一些东西,那么应该显示什么呢? > @@ -76,9 +76,8 @@ > 要了解 PhoneWindow 是干啥的,首先要了解啥是 Window ,看官方说明: > -> ```` > Abstract base class for a top-level window look and behavior policy. An instance of this class should be used as the top-level view added to the window manager. It provides standard UI policies such as a background, title area, default key processing, etc. -> ```` +> > > 简单来说,Window是一个抽象类,是所有视图的最顶层容器,视图的外观和行为都归他管,不论是背景显示,标题栏还是事件处理都是他管理的范畴,它其实就像是View界的太上皇(虽然能管的事情看似很多,但是没实权,因为抽象类不能直接使用)。 > @@ -87,8 +86,7 @@ > 而上面说的 DecorView 是 PhoneWindow 的一个内部类,其职位相当于小太监,就是跟在 PhoneWindow 身边专业为 PhoneWindow 服务的,除了自己要干活之外,也负责消息的传递,PhoneWindow 的指示通过 DecorView 传递给下面的 View,而下面 View 的信息也通过 DecorView 回传给 PhoneWindow。 - - ## 事件分发、拦截与消费 +## 事件分发、拦截与消费 下表省略了 PhoneWidow 和 DecorView。 @@ -105,7 +103,7 @@ 这个三个方法均有一个 boolean(布尔) 类型的返回值,通过返回 true 和 false 来控制事件传递的流程。 -PS: 从上表可以看到 Activity 和 View 都是没有时间拦截机制的,这是因为: +PS: 从上表可以看到 Activity 和 View 都是没有事件拦截的,这是因为: > Activity 作为原始的事件分发者,如果 Activity 拦截了事件会导致整个屏幕都无法响应事件,这肯定不是我们想要的效果。 > @@ -131,7 +129,7 @@ Activity -> PhoneWindow -> DecorView -> ViewGroup -> ... -> View Activity <- PhoneWindow <- DecorView <- ViewGroup <- ... <- View ``` -**看到这里,我不禁微微一皱眉,这个东西咋看起来那么熟悉呢?再仔细一看,这不就是一个非常经典的[责任链模式](https://zh.wikipedia.org/wiki/%E8%B4%A3%E4%BB%BB%E9%93%BE%E6%A8%A1%E5%BC%8F)么?** 如果我能处理就拦截下来自己干,如果自己不能处理或者不确定就交给责任链中下一个对象,只不过责任链一般是单向的,而这个提供了一个反向的反馈机制。 +**看到这里,我不禁微微一皱眉,这个东西咋看起来那么熟悉呢?再仔细一看,这不就是一个非常经典的[责任链模式](https://zh.wikipedia.org/wiki/%E8%B4%A3%E4%BB%BB%E9%93%BE%E6%A8%A1%E5%BC%8F)吗,** 如果我能处理就拦截下来自己干,如果自己不能处理或者不确定就交给责任链中下一个对象。 **这种设计是非常精巧的,上层View既可以直接拦截该事件,自己处理,也可以先询问(分发给)子View,如果子View需要就交给子View处理,如果子View不需要还能继续交给上层View处理。既保证了事件的有序性,又非常的灵活。在我第一次将这个逻辑弄清楚的时候,看着这样精妙的设计,简直想欢呼庆贺一下。** @@ -172,7 +170,7 @@ Activity <- PhoneWindow <- DecorView <- ViewGroup <- ... <- View > > 1. 事件返回时 `dispatchTouchEvent` 直接指向了父View的 `onTouchEvent` 这一部分是不合理的,实际上它仅仅是给了父View的 `dispatchTouchEvent` 一个 false 返回值,父View根据返回值来调用自身的 `onTouchEvent`。 > 2. ViewGroup 是根据 `onInterceptTouchEvent` 的返回值来确定是调用子View的 `dispatchTouchEvent` 还是自身的 `onTouchEvent`, 并没有将调用交给 `onInterceptTouchEvent`。 -> 3. ViewGroup 的事件分发机制伪代码如下,可以看出事件分发的顺序。 +> 3. ViewGroup 的事件分发机制伪代码如下,可以看出调用的顺序。 > > ```java > public boolean dispatchTouchEvent(MotionEvent ev) { @@ -204,7 +202,7 @@ RootView     [经理]: dispatchTouchEvent 呼叫技术部,老板要做 RootView     [经理]: onInterceptTouchEvent (老板可能疯了,但又不是我做.) ViewGroupA   [组长]: dispatchTouchEvent 老板要做淘宝,下周上线? ViewGroupA   [组长]: onInterceptTouchEvent (看着不太靠谱,先问问小王怎么看) -View1        [码农]: onInterceptTouchEvent 做淘宝??? +View1        [码农]: dispatchTouchEvent 做淘宝??? View1        [码农]: onTouchEvent 这个真心做不了啊. ViewGroupA   [组长]: onTouchEvent 小王说做不了. RootView     [经理]: onTouchEvent 报告老板, 技术部说做不了. @@ -225,7 +223,7 @@ MainActivity [老板]: onTouchEvent 这么简单都做不了,你们 > **情景:老板: 我觉得咱们这个app按钮不好看,做的有光泽一点,要让人有一种想点的欲望。** > -> **事件顺序,老板(MainActivity)要做改界面,这个事件通过各个部门(ViewGroup)一层一层的往下传,传到最底层的时候,码农小王(View1)发现很容易,就在按钮上添加了一道光。** +> **事件顺序,老板(MainActivity)要做改界面,这个事件通过各个部门(ViewGroup)一层一层的往下传,传到最底层的时候,码农小王(View1)就在按钮上添加了一道光(为啥是小王呢?因为公司没有设计师)。** > > 可以看出,事件一旦被消费就意味着消息传递的结束,上层View知道了事件已经被消费掉,就不再处理了。 @@ -235,7 +233,7 @@ RootView     [经理]: dispatchTouchEvent 技术部,老板说按钮不 RootView     [经理]: onInterceptTouchEvent ViewGroupA   [组长]: dispatchTouchEvent 给按钮加上一道光. ViewGroupA   [组长]: onInterceptTouchEvent -View1        [码农]: onInterceptTouchEvent 加一道光. +View1        [码农]: dispatchTouchEvent 加一道光. View1        [码农]: onTouchEvent 做好了. ``` @@ -257,7 +255,7 @@ View1        [码农]: onTouchEvent 做好了. > **情景:老板: 报告一下项目进度。** > -> **事件顺序,老板(MainActivity)要知道项目进度,这个事件通过各个部门(ViewGroup)一层一层的往下传,传到技术组组长的时候,组长上报任务即可。** +> **事件顺序,老板(MainActivity)要知道项目进度,这个事件通过各个部门(ViewGroup)一层一层的往下传,传到技术组组长(ViewGroupA)的时候,组长(ViewGroupA)上报任务即可。无需告知码农小王(View1)。** ``` MainActivity [老板]: dispatchTouchEvent 现在项目做到什么程度了? @@ -268,7 +266,7 @@ ViewGroupA   [组长]: onInterceptTouchEvent ViewGroupA   [组长]: onTouchEvent 正在测试,明天就测试完了 ``` -### 其他情形 +### 其他情况 事件分发机制设计到到情形非常多,这里就不一一列举了,记住以下几条原则就行了。 @@ -287,9 +285,9 @@ View的事件分发机制实际上就是一个非常经典的责任链模式, > > 当有多个对象均可以处理同一请求的时候,将这些对象串联成一条链,并沿着这条链传递改请求,直到有对象处理它为止。 -Android 中事件分发机制原理虽然非常简单,但由于实际运用场景非常复杂,一旦具体到某个场景中变得很麻烦,而本文仅仅是带你简单的了解一下事件分发机制,更详细的内容和具体的一些特殊情形处理会在后续文章中进行讲解。 +Android 中事件分发机制原理虽然非常简单,但由于实际场景非常复杂,一旦具体到某个场景中变得很麻烦,而本文仅仅是带你简单的了解一下事件分发机制,更详细的内容和具体的一些特殊情形处理会在后续文章中进行讲解。 -最后,由于个人水平有限,文章中可能会出现错误,如果你觉得哪一部分有错误,或者发现了错别字等内容,欢迎在评论区告诉我,另外,据说关注[作者微博](http://weibo.com/GcsSloop)不仅能第一时间收到新文章消息,还能变帅哦。 +由于个人水平有限,文章中可能会出现错误,如果你觉得哪一部分有错误,或者发现了错别字等内容,欢迎在评论区告诉我,另外,据说关注[作者微博](http://weibo.com/GcsSloop)不仅能第一时间收到新文章消息,还能变帅哦。 @@ -304,7 +302,7 @@ Android 中事件分发机制原理虽然非常简单,但由于实际运用场 [ Android事件分发机制完全解析,带你从源码的角度彻底理解(上)](http://blog.csdn.net/guolin_blog/article/details/9097463)
[ Android事件分发机制完全解析,带你从源码的角度彻底理解(下)](http://blog.csdn.net/sinyu890807/article/details/9153747)
[更简单的学习Android事件分发](http://www.idtkm.com/customview/customview11/)
- +《安卓开发艺术探索》 From 566732f894bec9a15b8cea5f513bc9ca572c5ad4 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 30 Sep 2016 02:33:20 +0800 Subject: [PATCH 446/615] Update --- CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md b/CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md index adb468de..47b33077 100644 --- a/CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md +++ b/CustomView/Advance/[12]Dispatch-TouchEvent-Theory.md @@ -1,4 +1,4 @@ -# 事件分发原理 +# 事件分发机制原理 之前讲解了很多与View绘图相关的知识,你可以在 [安卓自定义View教程目录](http://www.gcssloop.com/customview/CustomViewIndex) 中查看到这些文章,如果你理解了这些文章,那么至少2D绘图部分不是难题了,大部分的需求都能满足,但是关于View还有很多知识点,例如: `让绘图更加炫酷的Paint`,`让View动起来的动画`,`与用户交互的触控事件` 等一系列内容。**本次就带大家简单的了解一下与交互息息相关的东西-事件分发原理**。 From 9a1cbc865cc24ded614792c1df9f56e23397fbaa Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 30 Sep 2016 02:33:44 +0800 Subject: [PATCH 447/615] Update --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 78a306c2..05ad3c82 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,8 @@ * [安卓自定义View进阶 - Matrix原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B09%5DMatrix_Basic.md) * [安卓自定义View进阶 - Matrix详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B10%5DMatrix_Method.md) * [安卓自定义View进阶 - Matrix Camera](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B11%5DMatrix_3D_Camera.md) - + * [安卓自定义View进阶 - 事件分发机制原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B12%5DDispatch-TouchEvent-Theory.md) + ****** ## [教程类](https://github.com/GcsSloop/AndroidNote/tree/master/Course/README.md) From 87faf454b9cc3c5b8444355bd17ed98ccddcc24b Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 1 Oct 2016 02:21:37 +0800 Subject: [PATCH 448/615] Update --- CustomView/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CustomView/README.md b/CustomView/README.md index 084727ed..85791f40 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -40,6 +40,7 @@

+

### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From db64249a07874072aa9040d070d7e3b07cacadd3 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 2 Oct 2016 01:19:33 +0800 Subject: [PATCH 449/615] Update --- CustomView/Demo/PieView.zip | Bin 0 -> 46473 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 CustomView/Demo/PieView.zip diff --git a/CustomView/Demo/PieView.zip b/CustomView/Demo/PieView.zip new file mode 100644 index 0000000000000000000000000000000000000000..633b42150474dfb1b54e5b00232285b19d1fa22c GIT binary patch literal 46473 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 Date: Tue, 4 Oct 2016 00:54:34 +0800 Subject: [PATCH 450/615] Update --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 05ad3c82..ffc3390e 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,12 @@ * [优雅的发布Android开源库(论JitPack的优越性)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/ReleaseLibraryByJitPack.md) * [用JitPack发布时附加文档和源码](https://github.com/GcsSloop/AndroidNote/blob/master/Course/jitpack-javadoc.md) +****** + +## Tips + +* [ArrayList与LinkedList遍历性能比较](https://github.com/GcsSloop/AndroidNote/blob/magic-world/ChaosCrystal/List%E9%81%8D%E5%8E%86%E6%80%A7%E8%83%BD.md) + ****** ## [速查表](https://github.com/GcsSloop/AndroidNote/tree/master/QuickChart/README.md) From 012555a0ca1338e2c85acc33cc2791ac8ea347f6 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 4 Oct 2016 00:56:34 +0800 Subject: [PATCH 451/615] Update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ffc3390e..3c93c94f 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ ## Tips * [ArrayList与LinkedList遍历性能比较](https://github.com/GcsSloop/AndroidNote/blob/magic-world/ChaosCrystal/List%E9%81%8D%E5%8E%86%E6%80%A7%E8%83%BD.md) +* [程序员不可不知的版权协议](https://github.com/GcsSloop/AndroidNote/blob/magic-world/ChaosCrystal/%E5%BC%80%E6%BA%90%E5%85%B1%E4%BA%AB%E5%8D%8F%E8%AE%AE.md) ****** From ca485583ed217637772ada1c42f898c15015414a Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 4 Oct 2016 19:14:52 +0800 Subject: [PATCH 452/615] Update --- CustomView/Advance/[05]Path_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[05]Path_Basic.md b/CustomView/Advance/[05]Path_Basic.md index 225ef09c..a46a6e3a 100644 --- a/CustomView/Advance/[05]Path_Basic.md +++ b/CustomView/Advance/[05]Path_Basic.md @@ -55,7 +55,7 @@ _The Path class encapsulates compound (multiple contour) geometric paths consist **通俗解释(sloop个人版):** -**Path是封装了由直线和曲线(二次,三次贝塞尔曲线)构成的几何路径。你能用Canvas中的drawPath来把这条路径画出来(同样支持Paint的不同绘制模式),也可以用于剪裁画布和根据路径绘制文字。我们有时会用Path来描述一个图像的轮廓,所以也会称为轮廓线(轮廓线仅是Path的一种使用方法,两者并不等价)** +**Path封装了由直线和曲线(二次,三次贝塞尔曲线)构成的几何路径。你能用Canvas中的drawPath来把这条路径画出来(同样支持Paint的不同绘制模式),也可以用于剪裁画布和根据路径绘制文字。我们有时会用Path来描述一个图像的轮廓,所以也会称为轮廓线(轮廓线仅是Path的一种使用方法,两者并不等价)** 另外路径有开放和封闭的区别。 From 83a26526fbf6883e6ffea77b32b11ec41a683de6 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 5 Oct 2016 14:12:07 +0800 Subject: [PATCH 453/615] Update --- CustomView/Advance/[15]Dispatch-TouchEvent-Source.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 CustomView/Advance/[15]Dispatch-TouchEvent-Source.md diff --git a/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md b/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md new file mode 100644 index 00000000..c868ef90 --- /dev/null +++ b/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md @@ -0,0 +1,2 @@ +# 事件分发机制详解 + From 26c557b36710636877d06dded3ae3136798dd567 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 6 Oct 2016 02:28:02 +0800 Subject: [PATCH 454/615] Update --- Tools/MarkdownEditor.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tools/MarkdownEditor.md b/Tools/MarkdownEditor.md index 356129d6..96108ea1 100644 --- a/Tools/MarkdownEditor.md +++ b/Tools/MarkdownEditor.md @@ -1,3 +1,4 @@ # Markdown编辑器推荐 -markdown是一个非常棒的书写语言,深受程序员喜爱。 +markdown是一个轻量级标记型书写语言,由于其学习门槛低和简洁性而被很多人喜爱。 + From dec63ed5a7609ee2ac652418a8ba36a8c14baf66 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 9 Oct 2016 20:35:09 +0800 Subject: [PATCH 455/615] Update --- CustomView/Advance/Code/CheckView.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/Code/CheckView.md b/CustomView/Advance/Code/CheckView.md index 1c7044b9..1a17bb65 100644 --- a/CustomView/Advance/Code/CheckView.md +++ b/CustomView/Advance/Code/CheckView.md @@ -1,5 +1,7 @@ ## CheckView源代码 +[下载代码 ( 右键 -> 另存为 )](https://raw.githubusercontent.com/GcsSloop/AndroidNote/master/CustomView/Advance/Code/CheckView.java) + ``` java package com.sloop.canvas; From e7e53faa0f46d43c53fec3e9bb5feafbfa97665f Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 10 Oct 2016 23:48:37 +0800 Subject: [PATCH 456/615] Update --- CustomView/Advance/[03]Canvas_Convert.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/CustomView/Advance/[03]Canvas_Convert.md b/CustomView/Advance/[03]Canvas_Convert.md index 13f253ba..2e1c8206 100644 --- a/CustomView/Advance/[03]Canvas_Convert.md +++ b/CustomView/Advance/[03]Canvas_Convert.md @@ -61,7 +61,7 @@ canvas.drawCircle(0,0,100,mPaint); ``` - + 我们首先将坐标系移动一段距离绘制一个圆形,之后再移动一段距离绘制一个圆形,两次移动是可叠加的。 @@ -105,7 +105,7 @@ ``` (为了更加直观,我添加了一个坐标系,可以比较明显的看出,缩放中心就是坐标原点) - + 接下来我们使用第二种方法让缩放中心位置稍微改变一下,如下: ``` java @@ -124,7 +124,7 @@ ``` (图中用箭头指示的就是缩放中心。) - + 前面两个示例缩放的数值都是正数,按照表格中的说明,**当缩放比例为负数的时候会根据缩放中心轴进行翻转**,下面我们就来实验一下: @@ -194,7 +194,7 @@ } ``` - + ***** #### ⑶旋转(rotate) @@ -222,7 +222,7 @@ canvas.drawRect(rect,mPaint); ``` - + 改变旋转中心位置: ``` java @@ -240,7 +240,7 @@ canvas.drawRect(rect,mPaint); ``` - + 好吧,旋转也是可叠加的 ``` java @@ -262,7 +262,7 @@ canvas.rotate(10); } ``` - + ***** #### ⑷错切(skew) @@ -299,7 +299,7 @@ Y = sy * x + y mPaint.setColor(Color.BLUE); // 绘制蓝色矩形 canvas.drawRect(rect,mPaint); ``` - + 如你所想,错切也是可叠加的,不过请注意,调用次序不同绘制结果也会不同 ``` java @@ -318,7 +318,7 @@ Y = sy * x + y canvas.drawRect(rect,mPaint); ``` - + ***** #### ⑸快照(save)和回滚(restore) @@ -440,7 +440,7 @@ public int saveLayerAlpha (float left, float top, float right, float bottom, int ## About Me ### 作者微博: @GcsSloop - + ****** ## 四.参考资料 From 804b4287d083a0c4377d32a469f731e336e85348 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 11 Oct 2016 20:30:32 +0800 Subject: [PATCH 457/615] Update --- CustomView/Advance/[99]DrawText.md | 279 ----------------------------- 1 file changed, 279 deletions(-) delete mode 100644 CustomView/Advance/[99]DrawText.md diff --git a/CustomView/Advance/[99]DrawText.md b/CustomView/Advance/[99]DrawText.md deleted file mode 100644 index fe9982a1..00000000 --- a/CustomView/Advance/[99]DrawText.md +++ /dev/null @@ -1,279 +0,0 @@ -# drawText之坐标、居中、绘制多行 - -本文用于讲解Canvas中关于DrawText相关的一些常见问题,如坐标,居中,和绘制多行。 - -之前由于个人的疏忽以及对问题的想当然,没有进行验证,在 [【安卓自定义View进阶 - 图片文字】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) 这篇文章中出现了一个错误,有不少眼睛雪亮的网友都发现了该错误并给予了反馈,非常感谢这些网友的帮助。 - -![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f3i3wsruf7j306o06o3yg.jpg) - -## 错误原因 - -这个错误是drawText方法中坐标的一个问题,就一般的绘图而言,坐标一般都是指定左上角,然而drawText默认并不是左上角,甚至不是大家测试后认为的左下角,而是一个**由Paint中Align决定的对齐基准线**,该API注释原文如下: - -> Draw the text, with origin at (x,y), using the specified paint. **The origin is interpreted based on the Align setting in the paint.** - -在默认情况下基线如下图所示: - -> PS:基线(BaseLine)有两条,是用户指定的坐标确定的,在默认情况下,基线X在字符串左侧,基线y在字符串下方(但并不是最低的部分)。 - -![](http://ww3.sinaimg.cn/large/005Xtdi2gw1f3jppylp6zj30dw08c74v.jpg) - -## 分析这样设计的原因 - -**Q: 为何基线y要放到文字下面,而不是上面?** - -> A : 既然采用这种对齐方式,必然有其缘由,至少不是为了坑我这种小白。据本人猜测可能有以下原因: -* 1.符合人类书写习惯,不论是汉字还是英文或是其他语言,我们在书写对齐的时候都是以下面为基准线的,而不是上面,(**我们默认的基准线类似于四线格中的第三条线**)。
-![](http://ww4.sinaimg.cn/large/005Xtdi2gw1f3knbp87ttj30dw08cq38.jpg)
-* 2.字的特点,字的显示不仅有有中文汉字,还有一些特殊字符,并且大部分是根据下面对齐的,如果把对齐的基线放到上面并使其显示整齐,设计太麻烦,如下:
-![](http://ww1.sinaimg.cn/large/005Xtdi2gw1f3knvptqsrj30dw08cmxw.jpg)
-* 3.字体的特点,我们都知道,字有很多的字体风格,不同字体风格的大小是不同的,如果以以上面为基准线而让其底部对齐,这设计难度简直不敢想象:
-![](http://ww3.sinaimg.cn/large/005Xtdi2gw1f3ko9oln9lj30dw08cmxo.jpg)
-**综上所述,基线y放到下面不仅符合人的书写习惯,而且更加便于设计。** - -## drawText从入门到懵逼 - -虽然之前在 [图片文字](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) 这篇文章中已经简单的了解部分关于文字的方法,但Paint中关于文字的方法还有很多,本文会了解一些我们比较关心的一些内容,例如绘制居中的文本,多行文本等,在此之前我们先了解一下Paint中与文本相关的内部类或者枚举: - -名称 | 类型 | 主要作用 ----------------|:------:|------------------------------------------------------ -Align | 枚举 | 指定基准线与文本的相对关系(包含 左对齐 右对齐 居中) -Style | 枚举 | 设置样式,但不仅仅是为文本服务(包含 描边 填充 描边加填充) -FontMetrics | 内部类 | 描述给定的文本大小,字体,间距等各种度量值(度量结果类型为float) -FontMetricsInt | 内部类 | 作用同上,但度量结果返回值是int型的 - -### Align - -Align中文意思是对齐,其作用正式如此,我们使用过 Word 的人都知道文本有 *左对齐、居中、右对齐、两端对齐、分散对齐* 五种模式,Align作用就是设置文本的对齐模式,但是并没有这么多,仅有 **左对齐、居中、右对齐** 三种模式,如下: - -> 吐槽:就因为没有两端对齐和分散对齐,导致长文本,尤其是中英混合的长文本在手机上显示效果奇差,相信做阅读类软件的程序员深有体会,最终还要自定义View解决。 - -枚举类型 | 作用 ----------|------------------------------------------------------------- -LEFT | 左对齐 基线X在文本左侧,基线y在文本下方,文本出现在给定坐标的右侧,是默认的对齐方式 -RIGHT | 右对齐 基线x在文本右侧,基线y在文本下方,文本出现在给定坐标的左侧 -CENTER | 居中对齐 基线x在文本中间,基线y在文本下方,文本出现在给定坐标的两侧 - -Align对应的方法如下: - -``` java - public Paint.Align getTextAlign () // 获取对齐方式 - - public void setTextAlign (Paint.Align align) // 设置对齐方式 -``` - -在实际运用中基线与模式之间的关系则如下图所示: - -![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f3l2d6gw0nj30dw08c74q.jpg) - -> PS 该图片是截屏加工所得,其中红色的先是各自的基准线。注意汉字有一部分是在基准线下面的。 - -其核心代码如下: - -``` java - // 平移画布 - 如有疑问请参考画布操作这篇文章 - canvas.translate(mCenterX,0); // mCenterX 是屏幕宽度的一半,在onSizeChanged中获取 - - // 设置字体颜色 - mPaint.setColor(Color.rgb(0x06,0xaf,0xcd)); - - // 在不同模式下绘制文字 - mPaint.setTextAlign(Paint.Align.LEFT); - canvas.drawText("左对齐", 0, 200, mPaint); - - mPaint.setTextAlign(Paint.Align.CENTER); - canvas.drawText("居中对齐", 0, 400, mPaint); - - mPaint.setTextAlign(Paint.Align.RIGHT); - canvas.drawText("右对齐", 0, 600, mPaint); -``` - -### Style - -Style的意思是样式,这个在 [Canvas之绘制基本形状](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md) 这篇文章中讲过,它有三种状态: - -枚举类型 | 作用 -----------------|---------------- -FILL | 填充 -STROKE | 描边 -FILL_AND_STROKE | 填充加描边 - -Style 对应的方法如下: - -``` java -public Paint.Style getStyle () // 获取当然样式 - -public void setStyle (Paint.Style style) // 设置样式 -``` - -效果如下: - -![](http://ww3.sinaimg.cn/large/005Xtdi2gw1f3nh9r8ih0j30dw08c3z4.jpg) - -核心代码: - -``` java - // 平移画布 - 如有疑问请参考画布操作这篇文章 - canvas.translate(mCenterX,0); // mCenterX 是屏幕宽度的一半,在onSizeChanged中获取 - - mPaint.setTextAlign(Paint.Align.CENTER); - mPaint.setColor(Color.rgb(0x06,0xaf,0xcd)); - - // 设置不同的样式 - - // 填充 - mPaint.setStyle(Paint.Style.FILL); - canvas.drawText("GcsSloop 中文", 0, 200, mPaint); - - // 描边 - mPaint.setStyle(Paint.Style.STROKE); - canvas.drawText("GcsSloop 中文", 0, 400, mPaint); - - // 描边加填充 - mPaint.setStyle(Paint.Style.FILL_AND_STROKE); - canvas.drawText("GcsSloop 中文", 0, 600, mPaint); -``` - -### FontMetrics - -FontMetrics 是 Paint 的一个内部类,根据名字我们可以大致知道这是一个描述**字体规格**相关的类,关于这个类的描述原文是这样的: - -> Class that describes the various metrics for a font at a given text size. Remember, Y values increase going down, so those values will be positive, and values that measure distances going up will be negative. This class is returned by getFontMetrics(). - -翻译一下: - -> 简单来说,FontMetrics包含了当前文本相关的各项参数,你可以通过 Paint中 _getFontMetrics()_ 这个方法来获取到这个类。 -(另外,原文中还特地强调了一下关于坐标正负的问题。) - -##### FontMetrics包含了以下几个数值: - -> 如果没有特殊说明,一下文章中“基线”默认代表“基线Y”。 - -名称 | 正负| 释义 ---------|:---:|-------------------------------------------------------- -top | - | 在指定字形和大小的情况下,字符最高点与基线之间的距离 -ascent | - | 单个字符的最高点与基线距离的推荐值(不包括字母上面的符号) -descent | + | 单个字符的最低点与基线距离的推荐值 -bottom | + | 在指定字形和大小的情况下,字符最低点与基线之间的距离 -leading | + | 行间距,当前行bottom与下一行top之间的距离的推荐值 (通常为0,因为top与ascent,bottom与leading之间的距离足够作为行间距了) - -![](http://ww1.sinaimg.cn/large/005Xtdi2gw1f3syr8fbd1j30dw08c755.jpg) - -看了上面啰啰嗦嗦讲了一堆,你可能会产生一些疑问,这里我简单解释一下: - -0、 FontMetrics到底有什么用? - -> FontMetrics 是字体规格,比较精确的测量出文字相关的各种数据,在很多地方都是用得到的,比较常见的就是我们的音乐播放器中的歌词显示,需要实时的变字体位置,这里就需要比较精确是数值来进行计算以确保不会出现两行文字重叠等问题。 - -1、为什么表格中最高点距离基线的值是负值,而最低点反而是正值? - -> 这是因为手机屏幕坐标系的特殊性,在数学中常见的坐标系y轴是向上的,而对于手机而言,y轴默认是向下的,所以数值越小越靠近屏幕顶端,即最高点的数值比基线小,最高点减去基线结果自然为负数。 更多参考 [坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md) 这篇文章。 - -2、为什么表格中很多都是推荐值? - -> 这是因为字的规格不仅受字大小的影响,而且受字体风格的影响,不同的字体风格差别很大,其结果可能会有偏差,故大部分都是推荐值。 - -3、 具体绘制的文本不同会影响 FontMetrics 中的数值吗? - -> 不会, **FontMetrics中的数值受字体大小(FontSize) 和 字体风格(Typeface) 影响**, 而不会因为具体绘制的内容不同而改变,给Paint设置完字体大小和字体风格后就能获取到正确的FontMetrics。 - -**获取FontMetrics的方法** -``` java - Paint.FontMetrics mMetrics = mPaint.getFontMetrics(); - - Log.e("TAG", "top=" + mMetrics.top); - Log.e("TAG", "ascent=" + mMetrics.ascent); - Log.e("TAG", "descent=" + mMetrics.descent); - Log.e("TAG", "bottom=" + mMetrics.bottom); - Log.e("TAG", "leading=" + mMetrics.leading); -``` -结果: -``` -05-15 21:18:13.315 13112-13112/com.gcssloop.canvas E/TAG: top=-152.98828 -05-15 21:18:13.315 13112-13112/com.gcssloop.canvas E/TAG: ascent=-129.88281 -05-15 21:18:13.315 13112-13112/com.gcssloop.canvas E/TAG: descent=34.179688 -05-15 21:18:13.315 13112-13112/com.gcssloop.canvas E/TAG: bottom=37.939453 -05-15 21:18:13.315 13112-13112/com.gcssloop.canvas E/TAG: leading=0.0 -``` - -**由于FontMetrics中的 ascent 与 descent 比较常用,所以可以直接通过Paint获取:** -``` java - Log.e("TAG", "P.ascent=" + mPaint.ascent()); - Log.e("TAG", "P.descent=" + mPaint.descent()); -``` -结果,可以看到与通过FontMetrics获得的结果相同。 -``` -05-15 21:24:18.950 13112-13112/com.gcssloop.canvas E/TAG: P.ascent=-129.88281 -05-15 21:24:18.955 13112-13112/com.gcssloop.canvas E/TAG: P.descent=34.179688 -``` - - -## 文字居中 - -对于绘制居中的文本来说,我们可以封装一个方法用中心点作为绘制坐标,在绘制的时候转换为实际坐标。 - -根据前面的知识可知,想让文字水平居中很容易,只需要设置 TextAlign 为 CENTER,那么基线X(BaseLineX)自然就是这个字符串的中心了。 - -而让文字垂直居中则有些麻烦了,因为基线Y(BaseLineY)既不是顶部,底部,也不是中心,所以文本居中最难的内容就是计算BaseLineY的位置。 - -我们已知: - -> 1. 中心位置坐标,centerX, centerY -2. 文本高度:height = descent-ascent -3. descent的坐标:descentY = centerY + 1/2height -4. baseLineY坐标:baseLineY = descentY-descent - -通过上面内容可以推算出如下公式: - -> baseLineY = centerY - 1/2(ascent + descent) - -**根据公式我们可以封装一个方法:** - -``` java - /** - * 居中绘制文本 - * - * @param text - * @param canvas - * @param paint - */ - public void drawTextByCenter(String text, float x, float y, Canvas canvas, Paint paint) { - Paint tempPaint = new Paint(paint); // 创建一个临时画笔,防止影响原来画笔的状态 - tempPaint.setTextAlign(Paint.Align.CENTER); // 设置文本对齐方式为居中 - - // 通过y计算出baseline的位置 - float baseline = y - (tempPaint.descent() + tempPaint.ascent()) / 2; - - canvas.drawText(text, x, baseline, tempPaint); //绘制文本 - } -``` - -**测试方法是否正确** - -``` java - canvas.translate(mCenterX, mCenterY); - - String text = "ASSA"; - mPaint.setColor(Color.BLACK); - - drawTextByCenter(text, 0, 0, canvas, mPaint); -``` - -结果: - - - -## 绘制多行 - -前面讲的所有绘制文本都是绘制单行文本,而对于长文本就束手无策了,但是我们偶尔也需要绘制一些长文本,例如绘制一段文本,这样前面的就无法满足需求了。 - -我们先思考一下如何才能绘制一段长文本让其可以自动换行,如自动测量文本长度,然后根据测量的内容截开成n行,然后一行一行的绘制。 - - - - - - - - - From 1ff2e82bf0426103051e117efc217558b998bdb9 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 12 Oct 2016 21:43:19 +0800 Subject: [PATCH 458/615] Update --- CustomView/Advance/Code/SearchView.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/Code/SearchView.md b/CustomView/Advance/Code/SearchView.md index 13af1f7c..19d404a3 100644 --- a/CustomView/Advance/Code/SearchView.md +++ b/CustomView/Advance/Code/SearchView.md @@ -1,5 +1,7 @@ ## SearchView 源代码 +[下载代码 (右键 -> 另存为)](https://raw.githubusercontent.com/GcsSloop/AndroidNote/master/CustomView/Advance/Code/SearchView.java) + ``` java /** * Author: GcsSloop From 62adce7309380be15d6f4b0c66a206e1f9dbfc16 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 12 Oct 2016 21:45:19 +0800 Subject: [PATCH 459/615] Update --- CustomView/Advance/Code/SetPolyToPoly.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Advance/Code/SetPolyToPoly.md b/CustomView/Advance/Code/SetPolyToPoly.md index 3988fac2..9d77d6f3 100644 --- a/CustomView/Advance/Code/SetPolyToPoly.md +++ b/CustomView/Advance/Code/SetPolyToPoly.md @@ -2,6 +2,8 @@ ## SetPolyToPoly.java +[下载代码 (右键 -> 另存为)](https://raw.githubusercontent.com/GcsSloop/AndroidNote/master/CustomView/Advance/Code/SetPolyToPoly.java) + ```java public class SetPolyToPoly extends View{ private static final String TAG = "SetPolyToPoly"; From 610aa5c14a3e76cfecf7c728d29d9180b55e93c5 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 14 Oct 2016 04:35:36 +0800 Subject: [PATCH 460/615] Update --- .../Advance/[15]Dispatch-TouchEvent-Source.md | 546 ++++++++++++++++++ 1 file changed, 546 insertions(+) diff --git a/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md b/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md index c868ef90..16fd056b 100644 --- a/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md +++ b/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md @@ -1,2 +1,548 @@ # 事件分发机制详解 +在上一篇文章 [事件分发机制原理][dispatch-touchevent-theory] 中简要分析了一下事件分发机制的原理,原理是十分简单的,一句话就能总结:**责任链模式,事件层层传递,直到被消费。** 虽然原理简单,但是随着 Android 不断的发展,实际运用场景也越来越复杂,所以想要彻底玩转事件分发机制还需要一定技巧,本篇事件分发机制详解将带大家了解 ... + +> **你以为我接下来要讲源码?** +> 我就不按套路,所有的源码都是为了适应具体的应用场景而写的,只要能够理解运用场景,理解源码也就十分简单了。所以本篇的核心问题是:**正确理解在实际场景中事件分发机制的作用。** 会涉及到源码,但不是主角。 + +**注意:本文中所有源码分析部分均基于 API23(Android 6.0) 版本,由于安卓系统源码改变很多,可能与之前版本有所不同,但基本流程都是一致的。** + + + +## 常见事件 + +既然是事件分发,总要有事件才能分发吧,所以我们先了解一下常见的几种事件。 + +根据面向对象思想,事件被封装成 MotionEvent 对象,由于本篇重点不在于此,所以只会涉及到几个与手指触摸相关的常见事件: + +| 事件 | 简介 | +| ------------- | ------------------------- | +| ACTION_DOWN | 手指 **初次接触到屏幕** 时触发。 | +| ACTION_MOVE | 手指 **在屏幕上滑动** 时触发,会会多次触发。 | +| ACTION_UP | 手指 **离开屏幕** 时触发。 | +| ACTION_CANCEL | 事件 **被上层拦截** 时触发。 | + +对于单指触控来说,一次简单的交互流程是这样的: + +**手指落下(ACTION_DOWN) -> 移动(ACTION_MOVE) -> 离开(ACTION_UP)** + +> * 本次事例中 ACTION_MOVE 有多次触发。 +> * 如果仅仅是单击(手指按下再抬起),不会触发 ACTION_MOVE。 + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f8oz1704ylg30bo0jqgmx.gif) + +## 事件分发、拦截与消费 + +关于这一部分内容,上一篇文章 [事件分发机制原理][dispatch-touchevent-theory] 已经将流程整理的比较清楚了,本文会深入细节来研究这些内容。之所以分开讲,是为了防止大家被细节所迷惑而忽略了整体逻辑。 + +> `√` 表示有该方法。 +> +> `X` 表示没有该方法。 + +| 类型 | 相关方法 | ViewGroup | View | +| :--: | :-------------------: | :-------: | :--: | +| 事件分发 | dispatchTouchEvent | √ | √ | +| 事件拦截 | onInterceptTouchEvent | √ | X | +| 事件消费 | onTouchEvent | √ | √ | + + + +### View 相关 + +`dispatchTouchEvent` 是事件分发机制中的核心,所有的事件调度都归它管。不过我细看表格, ViewGroup 有 dispatchTouchEvent 也就算了,毕竟人家有一堆 ChildView 需要管理,但为啥 View 也有?这就引出了我们的第一个疑问。 + +#### Q: 为什么 View 会有 dispatchTouchEvent ? + +A: 我们知道 View 可以注册很多事件监听器,例如:单击事件(onClick)、长按事件(onLongClick)、触摸事件(onTouch),并且View自身也有 onTouchEvent 方法,那么问题来了,这么多与事件相关的方法应该由谁管理?毋庸置疑就是 `dispatchTouchEvent`,所以 View 也会有事件分发。 + +相信看到这里很多小伙伴会产生第二个疑问,View 有这么多事件监听器,到底哪个先执行? + +#### Q: 与 View 事件相关的各个方法调用顺序是怎样的? + +A: **如果不去看源码,想一下让自己设计会怎样?** + +* 单击事件(onClickListener) 需要两个两个事件(ACTION_DOWN 和 ACTION_UP )才能触发,如果先分配给onClick判断,等它判断完,用户手指已经离开屏幕,黄花菜都凉了,定然造成 View 无法响应其他事件,应该最后调用。(最后) +* 长按事件(onLongClickListener) 同理,也是需要长时间等待才能出结果,肯定不能排到前面,但因为不需要ACTION_UP,应该排在 onClick 前面。(onLongClickListener > onClickListener) +* 触摸事件(onTouchListener) 如果用户注册了触摸事件,说明用户要自己处理触摸时间了,这个应该排在最前面。(最前) +* View自身处理(onTouchEvent) 提供了一种默认的处理方式,如果用户已经处理好了,也就不需要了,所以应该排在 onClickListener 后面。(onClickListener > onTouchListener) + +**所以事件的调度顺序应该是 `onTouchListener > onTouchEvent > onLongClickListener > onClickListener`**。 + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f8r8jg9mw5j308y07mglw.jpg) + +下面我们来看一下实际测试结果: + +> 手指按下,不移动,稍等片刻再抬起。 + +```shell +[Listener ]: onTouchListener ACTION_DOWN +[GcsView  ]: onTouchEvent ACTION_DOWN +[Listener ]: onLongClickListener +[Listener ]: onTouchListener ACTION_UP +[GcsView  ]: onTouchEvent ACTION_UP +[Listener ]: onClickListener +``` + +可以看到,测试结果也支持我们猜测的结论,因为长按 onLongClickListener 不需要 ACTION_UP 所以会在 ACTION_DOWN 之后就触发。 + +接下来就看一下源码是怎么设计的(省略了大量无关代码): + +```java +public boolean dispatchTouchEvent(MotionEvent event) { + ... + boolean result = false; // result 为返回值,主要作用是告诉调用者事件是否已经被消费。 + if (onFilterTouchEventForSecurity(event)) { + ListenerInfo li = mListenerInfo; + /** + * 如果设置了OnTouchListener,并且当前 View 可点击,就调用监听器的 onTouch 方法, + * 如果 onTouch 方法返回值为 true,就设置 result 为 true。 + */ + if (li != null && li.mOnTouchListener != null + && (mViewFlags & ENABLED_MASK) == ENABLED + && li.mOnTouchListener.onTouch(this, event)) { + result = true; + } + + /** + * 如果 result 为 false,则调用自身的 onTouchEvent。 + * 如果 onTouchEvent 返回值为 true,则设置 result 为 true。 + */ + if (!result && onTouchEvent(event)) { + result = true; + } + } + ... + return result; +} +``` + +> **如果觉得源码还是太长,那么用伪代码实现应当是这样的(省略若干安全判断),简单粗暴:** +> +> ```java +> public boolean dispatchTouchEvent(MotionEvent event) { +> if (mOnTouchListener.onTouch(this, event)) { +> return true; +> } else if (onTouchEvent(event)) { +> return true; +> } +> return false; +> } +> ``` + +正当你沉迷在源码的"精妙"逻辑的时候,你可能没发现有两个东西失踪了,等回过神来,定睛一看,哎呦妈呀,**OnClick 和 OnLongClick 去哪里了?** + +不要担心,OnClick 和 OnLongClick 的具体调用位置在 **onTouchEvent** 中,看源码(同样省略大量无关代码): + +```java +public boolean onTouchEvent(MotionEvent event) { + ... + final int action = event.getAction(); + // 检查各种 clickable + if (((viewFlags & CLICKABLE) == CLICKABLE || + (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) || + (viewFlags & CONTEXT_CLICKABLE) == CONTEXT_CLICKABLE) { + switch (action) { + case MotionEvent.ACTION_UP: + ... + removeLongPressCallback(); // 移除长按 + ... + performClick(); // 检查单击 + ... + break; + case MotionEvent.ACTION_DOWN: + ... + checkForLongClick(0); // 检测长按 + ... + break; + ... + } + return true; // ◀︎表示事件被消费 + } + return false; +} +``` + +> **注意了,第一个重点要出现了(敲黑板)!** +> +> ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f8p431ehi3j304w04wmx1.jpg) +> +> **注意上面代码中存在一个 `return true;` 并且是只要 View 可点击就返回 true,就表示事件被消费了。** +> +> 举个栗子: I have a **RelativeLayout**,I have a **View**,Ugh,**RelativeLayout - View** +> +> ```xml +> android:background="#CCC" +> android:id="@+id/layout" +> android:onClick="myClick" +> android:layout_width="200dp" +> android:layout_height="200dp"> +> android:clickable="true" +> android:layout_width="200dp" +> android:layout_height="200dp" /> +> +> ``` +> +> 现在你有了一个 **RelativeLayout - View** 你开开心心的为 RelativeLayout 设置了一个点击事件`myClick`,然而你会发现不论怎么点都不会接收到信息,仔细一看,发现内部的 View 有一个属性 `android:clickable="true"` 正是这个看似不起眼的属性把事件给消费掉了,由此我们可以得出如下结论: +> **1. 不论 View 自身是否注册点击事件,只要 View 是可点击的就会消费事件。** +> **2. 事件是否被消费由返回值决定,true 表示消费,false 表示不消费,与是否使用了事件无关。** + +关于 View 的事件分发先说这么多,下面我们来看一下 ViewGroup 的事件分发。 + + + +### ViewGroup 相关 + +**ViewGroup(通常是各种Layout) 的事件分发相对来说就要麻烦一些,因为 ViewGroup 不仅要考虑自身,还要考虑各种 ChildView,一旦处理不好就容易引起各种事件冲突,正所谓养儿方知父母难啊。** + +#### VIewGroup 的事件分发流程又是如何的呢? + + 上一篇文章 [事件分发机制原理][dispatch-touchevent-theory] 中我们了解到事件是通过ViewGroup一层一层传递的,最终传递给 View,ViewGroup 要比它的 ChildView 先拿到事件,并且有权决定是否告诉要告诉 ChildView。在默认的情况下 ViewGroup 事件分发流程是这样的。 + +* 1.判断自身是否需要(询问 onInterceptTouchEvent 是否拦截),如果需要,调用自己的 onTouchEvent。 +* 2.自身不需要或者不确定,则询问 ChildView ,一般来说是调用手指触摸位置的 ChildView。 +* 3.如果子 ChildView 不需要则调用自身的 onTouchEvent。 + + +用伪代码应该是这样的: + +```java +public boolean dispatchTouchEvent(MotionEvent ev) { + boolean result = false; // 默认状态为没有消费过 + + if (!onInterceptTouchEvent(ev)) { // 如果没有拦截交给子View + result = child.dispatchTouchEvent(ev); + } + + if (!result) { // 如果事件没有被消费,询问自身onTouchEvent + result = onTouchEvent(ev); + } + + return result; +} +``` + +**有人看到这里可能会有疑问,我看过源码,ViewGroup 的 `dispatchTouchEvent` 可有二百多行呢,你弄这几行就想忽悠我,别以为我读书少。** + +当然了,上述源码是不完善的,还有很多问题是没有解决的,例如: + +##### 1. ViewGroup 中可能有多个 ChildView,如何判断应该分配给哪一个? + +这个很容易,就是把所有的 ChildView 遍历一遍,如果手指触摸的点在 ChildView 区域内就分发给这个View。 + +##### 2. 当该点的 ChildView 有重叠时应该如何分配? + +当 ChildView 重叠时,**一般会分配给显示在最上面的 ChildView**。 +如何判断哪个是显示在最上面的呢?后面加载的一般会覆盖掉之前的,所以**显示在最上面的是最后加载的**。 + +如下: + +```xml + + + + +``` + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f8r0i301sgj308w0fmwez.jpg) + +当手指点击有重叠区域时,分如下几种情况: + +1. 只有 View1 可点击时,事件将会分配给 View1,即使被 View2 遮挡,这一部分仍是 View1 的可点击区域。 +2. 只有 View2 可点击时,事件将会分配给 View2。 +3. View1 和 View2 均可点击时,事件会分配给后加载的 View2,View2 将事件消费掉,View1接收不到事件。 + +**注意:** + +* 上面说的是可点击,可点击包括很多种情况,只要你给View注册了 `onClickListener、onLongClickListener、OnContextClickListener` 其中的任何一个监听器或者设置了 `android:clickable="true"` 就代表这个 View 是可点击的。 + 另外,某些 View 默认就是可点击的,例如,Button,CheckBox 等。 +* 给 View 注册 `OnTouchListener` 不会影响 View 的可点击状态。即使给 View 注册 `OnTouchListener` ,**只要不返回 `true` 就不会消费事件**。 + + +##### 3. ViewGroup 和 ChildView 同时注册了事件监听器(onClick等),哪个会执行? + +事件优先给 ChildView,会被 ChildView消费掉,ViewGroup 不会响应。 + +##### 4. 所有事件都应该被同一 View 消费 + +在上面的例子中我们分析后可以了解到,同一次点击事件只能被一个 View 消费,这是为什呢?主要是为了防止事件响应混乱,如果再一次完整的事件中分别将不同的事件分配给了不同的 View 容易造成事件响应混乱。 + +> ( View 中 onClick 事件需要同时接收到 ACTION_DOWN 和 ACTION_UP 才能触发,如果分配给了不同的 View,那么 onClick 将无法被正确触发)。 + +**安卓为了保证所有的事件都是被一个 View 消费的,对第一次的事件( ACTION_DOWN )进行了特殊判断,View 只有消费了 ACTION_DOWN 事件,才能接收到后续的事件(可点击控件会默认消费所有事件),并且会将后续所有事件传递过来,不会再传递给其他 View,除非上层 View 进行了拦截。** +**如果上层 View 拦截了当前正在处理的事件,会收到一个 ACTION_CANCEL,表示当前事件已经结束,后续事件不会再传递过来。** + + + +**源码:** + +> 其实如果能够理解上面的内容,不看源码也能非常顺利的使用事件分发,但源码中能挖掘出更多的内容。 + +```java +public boolean dispatchTouchEvent(MotionEvent ev) { + // 调试用 + if (mInputEventConsistencyVerifier != null) { + mInputEventConsistencyVerifier.onTouchEvent(ev, 1); + } + + // 判断事件是否是针对可访问的焦点视图(很晚才添加的内容,个人猜测和屏幕辅助相关,方便盲人等使用设备) + if (ev.isTargetAccessibilityFocus() && isAccessibilityFocusedViewOrHost()) { + ev.setTargetAccessibilityFocus(false); + } + + boolean handled = false; + if (onFilterTouchEventForSecurity(ev)) { + final int action = ev.getAction(); + final int actionMasked = action & MotionEvent.ACTION_MASK; + + // 处理第一次ACTION_DOWN. + if (actionMasked == MotionEvent.ACTION_DOWN) { + // 清除之前所有的状态 + cancelAndClearTouchTargets(ev); + resetTouchState(); + } + + // 检查是否需要拦截. + final boolean intercepted; + if (actionMasked == MotionEvent.ACTION_DOWN || mFirstTouchTarget != null) { + final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0; + if (!disallowIntercept) { + intercepted = onInterceptTouchEvent(ev); // 询问是否拦截 + ev.setAction(action); // 恢复操作,防止被更改 + } else { + intercepted = false; + } + } else { + // 没有目标来处理该事件,而且也不是一个新的事件事件(ACTION_DOWN), 进行拦截。 + intercepted = true; + } + + // 判断事件是否是针对可访问的焦点视图 + if (intercepted || mFirstTouchTarget != null) { + ev.setTargetAccessibilityFocus(false); + } + + // 检查事件是否被取消(ACTION_CANCEL). + final boolean canceled = resetCancelNextUpFlag(this) + || actionMasked == MotionEvent.ACTION_CANCEL; + + final boolean split = (mGroupFlags & FLAG_SPLIT_MOTION_EVENTS) != 0; + TouchTarget newTouchTarget = null; + boolean alreadyDispatchedToNewTouchTarget = false; + + // 如果没有取消也没有被拦截 (进入事件分发) + if (!canceled && !intercepted) { + + // 如果事件是针对可访问性焦点视图,我们将其提供给具有可访问性焦点的视图。 + // 如果它不处理它,我们清除该标志并像往常一样将事件分派给所有的 ChildView。 + // 我们检测并避免保持这种状态,因为这些事非常罕见。 + View childWithAccessibilityFocus = ev.isTargetAccessibilityFocus() + ? findChildWithAccessibilityFocus() : null; + + if (actionMasked == MotionEvent.ACTION_DOWN + || (split && actionMasked == MotionEvent.ACTION_POINTER_DOWN) + || actionMasked == MotionEvent.ACTION_HOVER_MOVE) { + final int actionIndex = ev.getActionIndex(); + final int idBitsToAssign = split ? 1 << ev.getPointerId(actionIndex) + : TouchTarget.ALL_POINTER_IDS; + + // 清除此指针ID的早期触摸目标,防止不同步。 + removePointersFromTouchTargets(idBitsToAssign); + + final int childrenCount = mChildrenCount; + if (newTouchTarget == null && childrenCount != 0) { + final float x = ev.getX(actionIndex); // 获取触摸位置坐标 + final float y = ev.getY(actionIndex); + // 查找可以接受事件的 ChildView + final ArrayList preorderedList = buildOrderedChildList(); + final boolean customOrder = preorderedList == null + && isChildrenDrawingOrderEnabled(); + final View[] children = mChildren; + // ▼注意,从最后向前扫描 + for (int i = childrenCount - 1; i >= 0; i--) { + final int childIndex = customOrder + ? getChildDrawingOrder(childrenCount, i) : i; + final View child = (preorderedList == null) + ? children[childIndex] : preorderedList.get(childIndex); + + // 如果有一个视图具有可访问性焦点,我们希望它首先获取事件, + // 如果不处理,我们将执行正常的分派。 + // 尽管这可能会分发两次,但它能保证在给定的时间内更安全的执行。 + if (childWithAccessibilityFocus != null) { + if (childWithAccessibilityFocus != child) { + continue; + } + childWithAccessibilityFocus = null; + i = childrenCount - 1; + } + + // 检查View是否允许接受事件(即处于显示状态(VISIBLE)或者正在播放动画) + // 检查触摸位置是否在View区域内 + if (!canViewReceivePointerEvents(child) + || !isTransformedTouchPointInView(x, y, child, null)) { + ev.setTargetAccessibilityFocus(false); + continue; + } + + // getTouchTarget 中判断了 child 是否包含在 mFirstTouchTarget 中 + // 如果有返回 target,如果没有返回 null + newTouchTarget = getTouchTarget(child); + if (newTouchTarget != null) { + // ChildView 已经准备好接受在其区域内的事件。 + newTouchTarget.pointerIdBits |= idBitsToAssign; + break; // ◀︎已经找到目标View,跳出循环 + } + + resetCancelNextUpFlag(child); + if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)) { + mLastTouchDownTime = ev.getDownTime(); + if (preorderedList != null) { + for (int j = 0; j < childrenCount; j++) { + if (children[childIndex] == mChildren[j]) { + mLastTouchDownIndex = j; + break; + } + } + } else { + mLastTouchDownIndex = childIndex; + } + mLastTouchDownX = ev.getX(); + mLastTouchDownY = ev.getY(); + newTouchTarget = addTouchTarget(child, idBitsToAssign); + alreadyDispatchedToNewTouchTarget = true; + break; + } + + ev.setTargetAccessibilityFocus(false); + } + if (preorderedList != null) preorderedList.clear(); + } + + if (newTouchTarget == null && mFirstTouchTarget != null) { + // 没有找到 ChildView 接收事件 + newTouchTarget = mFirstTouchTarget; + while (newTouchTarget.next != null) { + newTouchTarget = newTouchTarget.next; + } + newTouchTarget.pointerIdBits |= idBitsToAssign; + } + } + } + + // 分发 TouchTarget + if (mFirstTouchTarget == null) { + // 没有 TouchTarget,将当前 ViewGroup 当作普通的 View 处理。 + handled = dispatchTransformedTouchEvent(ev, canceled, null, + TouchTarget.ALL_POINTER_IDS); + } else { + // 分发TouchTarget,如果我们已经分发过,则避免分配给新的目标。 + // 如有必要,取消分发。 + TouchTarget predecessor = null; + TouchTarget target = mFirstTouchTarget; + while (target != null) { + final TouchTarget next = target.next; + if (alreadyDispatchedToNewTouchTarget && target == newTouchTarget) { + handled = true; + } else { + final boolean cancelChild = resetCancelNextUpFlag(target.child) + || intercepted; + if (dispatchTransformedTouchEvent(ev, cancelChild, + target.child, target.pointerIdBits)) { + handled = true; + } + if (cancelChild) { + if (predecessor == null) { + mFirstTouchTarget = next; + } else { + predecessor.next = next; + } + target.recycle(); + target = next; + continue; + } + } + predecessor = target; + target = next; + } + } + + // 如果需要,更新指针的触摸目标列表或取消。 + if (canceled + || actionMasked == MotionEvent.ACTION_UP + || actionMasked == MotionEvent.ACTION_HOVER_MOVE) { + resetTouchState(); + } else if (split && actionMasked == MotionEvent.ACTION_POINTER_UP) { + final int actionIndex = ev.getActionIndex(); + final int idBitsToRemove = 1 << ev.getPointerId(actionIndex); + removePointersFromTouchTargets(idBitsToRemove); + } + } + + if (!handled && mInputEventConsistencyVerifier != null) { + mInputEventConsistencyVerifier.onUnhandledEvent(ev, 1); + } + return handled; +} +``` + + + +## 核心要点 + +1. **事件分发原理: 责任链模式,事件层层传递,直到被消费。** +2. **View 的 `dispatchTouchEvent` 主要用于调度自身的监听器和 onTouchEvent。** +3. **View的事件的调度顺序是 onTouchListener > onTouchEvent > onLongClickListener > onClickListener 。** +4. **不论 View 自身是否注册点击事件,只要 View 是可点击的就会消费事件。** +5. **事件是否被消费由返回值决定,true 表示消费,false 表示不消费,与是否使用了事件无关。** +6. **ViewGroup 中可能有多个 ChildView 时,将事件分配给包含点击位置的 ChildView。** +7. **ViewGroup 和 ChildView 同时注册了事件监听器(onClick等),由 ChildView 消费。** +8. **一次触摸流程中产生事件应被同一 View 消费,全部接收或者全部拒绝。** +9. **只要接受 ACTION_DOWN 就意味着接受所有的事件,拒绝 ACTION_DOWN 则不会收到后续内容。** +10. **如果当前正在处理的事件被上层 View 拦截,会收到一个 ACTION_CANCEL,后续事件不会再传递过来**。 + + + +## 总结 + +本文啰嗦了这么多内容,但真正需要注意的就是核心要点中的几个概念,只要能正确理解这些概念,相信理解事件分发机制将再也不是难题。 + +> 最后,个人推荐阅读源码的方法,先尝试用自己的角度去分析,建立概念,然后看源码进行验证、对比,如果发现自己建立的概念有问题,就尝试修正自己的概念,这样比较容易理解原作者的意图,也不容易被众多的代码所迷惑。 +> +> 就像 ViewGroup 中的 dispatchTouchEvent 内容非常多,主要是为了应对实际的场景,里面有很多 安全判断,处理多指触控 等内容,这些如果不先建立概念就去看源码很容易被这些细节问题所迷惑。 + + + +## 参考资料 + +[View ](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java) +[ViewGroup.java](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewGroup.java) +[Android Touch事件分发详解](https://github.com/CharonChui/AndroidNote/blob/master/Android%E5%8A%A0%E5%BC%BA/Android%20Touch%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E8%AF%A6%E8%A7%A3.md) +[基于源码来了解Android的事件分发机制](http://minjie.tech/2016/09/03/%E5%9F%BA%E4%BA%8E%E6%BA%90%E7%A0%81%E6%9D%A5%E4%BA%86%E8%A7%A3Android%E7%9A%84%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E6%9C%BA%E5%88%B6/) + + + +## About Me + +### 作者微博: @GcsSloop + + + + + +[dispatch-touchevent-theory]: http://www.gcssloop.com/customview/dispatch-touchevent-theory "事件分发机制原理-GcsSloop" + From c178bd0c9530982c32c2c4a0876d492b607c2492 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 15 Oct 2016 02:11:24 +0800 Subject: [PATCH 461/615] Update --- CustomView/Advance/[15]Dispatch-TouchEvent-Source.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md b/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md index 16fd056b..503d2ed6 100644 --- a/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md +++ b/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md @@ -63,7 +63,7 @@ A: **如果不去看源码,想一下让自己设计会怎样?** * 单击事件(onClickListener) 需要两个两个事件(ACTION_DOWN 和 ACTION_UP )才能触发,如果先分配给onClick判断,等它判断完,用户手指已经离开屏幕,黄花菜都凉了,定然造成 View 无法响应其他事件,应该最后调用。(最后) * 长按事件(onLongClickListener) 同理,也是需要长时间等待才能出结果,肯定不能排到前面,但因为不需要ACTION_UP,应该排在 onClick 前面。(onLongClickListener > onClickListener) -* 触摸事件(onTouchListener) 如果用户注册了触摸事件,说明用户要自己处理触摸时间了,这个应该排在最前面。(最前) +* 触摸事件(onTouchListener) 如果用户注册了触摸事件,说明用户要自己处理触摸事件了,这个应该排在最前面。(最前) * View自身处理(onTouchEvent) 提供了一种默认的处理方式,如果用户已经处理好了,也就不需要了,所以应该排在 onClickListener 后面。(onClickListener > onTouchListener) **所以事件的调度顺序应该是 `onTouchListener > onTouchEvent > onLongClickListener > onClickListener`**。 From d1ba104e0b3b54af14d17c7599ebf469c1e7d96b Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 15 Oct 2016 02:12:05 +0800 Subject: [PATCH 462/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3c93c94f..842cdcfc 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ * [安卓自定义View进阶 - Matrix详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B10%5DMatrix_Method.md) * [安卓自定义View进阶 - Matrix Camera](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B11%5DMatrix_3D_Camera.md) * [安卓自定义View进阶 - 事件分发机制原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B12%5DDispatch-TouchEvent-Theory.md) - + * [安卓自定义View进阶 - 事件分发机制详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B15%5DDispatch-TouchEvent-Source.md) ****** ## [教程类](https://github.com/GcsSloop/AndroidNote/tree/master/Course/README.md) From 5fdb9f1503afc48516e43492b6bc45618654dbd3 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 15 Oct 2016 16:15:39 +0800 Subject: [PATCH 463/615] Update --- CustomView/Advance/[99]DrawText.md | 279 +++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 CustomView/Advance/[99]DrawText.md diff --git a/CustomView/Advance/[99]DrawText.md b/CustomView/Advance/[99]DrawText.md new file mode 100644 index 00000000..fe9982a1 --- /dev/null +++ b/CustomView/Advance/[99]DrawText.md @@ -0,0 +1,279 @@ +# drawText之坐标、居中、绘制多行 + +本文用于讲解Canvas中关于DrawText相关的一些常见问题,如坐标,居中,和绘制多行。 + +之前由于个人的疏忽以及对问题的想当然,没有进行验证,在 [【安卓自定义View进阶 - 图片文字】](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) 这篇文章中出现了一个错误,有不少眼睛雪亮的网友都发现了该错误并给予了反馈,非常感谢这些网友的帮助。 + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f3i3wsruf7j306o06o3yg.jpg) + +## 错误原因 + +这个错误是drawText方法中坐标的一个问题,就一般的绘图而言,坐标一般都是指定左上角,然而drawText默认并不是左上角,甚至不是大家测试后认为的左下角,而是一个**由Paint中Align决定的对齐基准线**,该API注释原文如下: + +> Draw the text, with origin at (x,y), using the specified paint. **The origin is interpreted based on the Align setting in the paint.** + +在默认情况下基线如下图所示: + +> PS:基线(BaseLine)有两条,是用户指定的坐标确定的,在默认情况下,基线X在字符串左侧,基线y在字符串下方(但并不是最低的部分)。 + +![](http://ww3.sinaimg.cn/large/005Xtdi2gw1f3jppylp6zj30dw08c74v.jpg) + +## 分析这样设计的原因 + +**Q: 为何基线y要放到文字下面,而不是上面?** + +> A : 既然采用这种对齐方式,必然有其缘由,至少不是为了坑我这种小白。据本人猜测可能有以下原因: +* 1.符合人类书写习惯,不论是汉字还是英文或是其他语言,我们在书写对齐的时候都是以下面为基准线的,而不是上面,(**我们默认的基准线类似于四线格中的第三条线**)。
+![](http://ww4.sinaimg.cn/large/005Xtdi2gw1f3knbp87ttj30dw08cq38.jpg)
+* 2.字的特点,字的显示不仅有有中文汉字,还有一些特殊字符,并且大部分是根据下面对齐的,如果把对齐的基线放到上面并使其显示整齐,设计太麻烦,如下:
+![](http://ww1.sinaimg.cn/large/005Xtdi2gw1f3knvptqsrj30dw08cmxw.jpg)
+* 3.字体的特点,我们都知道,字有很多的字体风格,不同字体风格的大小是不同的,如果以以上面为基准线而让其底部对齐,这设计难度简直不敢想象:
+![](http://ww3.sinaimg.cn/large/005Xtdi2gw1f3ko9oln9lj30dw08cmxo.jpg)
+**综上所述,基线y放到下面不仅符合人的书写习惯,而且更加便于设计。** + +## drawText从入门到懵逼 + +虽然之前在 [图片文字](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B4%5DCanvas_PictureText.md) 这篇文章中已经简单的了解部分关于文字的方法,但Paint中关于文字的方法还有很多,本文会了解一些我们比较关心的一些内容,例如绘制居中的文本,多行文本等,在此之前我们先了解一下Paint中与文本相关的内部类或者枚举: + +名称 | 类型 | 主要作用 +---------------|:------:|------------------------------------------------------ +Align | 枚举 | 指定基准线与文本的相对关系(包含 左对齐 右对齐 居中) +Style | 枚举 | 设置样式,但不仅仅是为文本服务(包含 描边 填充 描边加填充) +FontMetrics | 内部类 | 描述给定的文本大小,字体,间距等各种度量值(度量结果类型为float) +FontMetricsInt | 内部类 | 作用同上,但度量结果返回值是int型的 + +### Align + +Align中文意思是对齐,其作用正式如此,我们使用过 Word 的人都知道文本有 *左对齐、居中、右对齐、两端对齐、分散对齐* 五种模式,Align作用就是设置文本的对齐模式,但是并没有这么多,仅有 **左对齐、居中、右对齐** 三种模式,如下: + +> 吐槽:就因为没有两端对齐和分散对齐,导致长文本,尤其是中英混合的长文本在手机上显示效果奇差,相信做阅读类软件的程序员深有体会,最终还要自定义View解决。 + +枚举类型 | 作用 +---------|------------------------------------------------------------- +LEFT | 左对齐 基线X在文本左侧,基线y在文本下方,文本出现在给定坐标的右侧,是默认的对齐方式 +RIGHT | 右对齐 基线x在文本右侧,基线y在文本下方,文本出现在给定坐标的左侧 +CENTER | 居中对齐 基线x在文本中间,基线y在文本下方,文本出现在给定坐标的两侧 + +Align对应的方法如下: + +``` java + public Paint.Align getTextAlign () // 获取对齐方式 + + public void setTextAlign (Paint.Align align) // 设置对齐方式 +``` + +在实际运用中基线与模式之间的关系则如下图所示: + +![](http://ww2.sinaimg.cn/large/005Xtdi2gw1f3l2d6gw0nj30dw08c74q.jpg) + +> PS 该图片是截屏加工所得,其中红色的先是各自的基准线。注意汉字有一部分是在基准线下面的。 + +其核心代码如下: + +``` java + // 平移画布 - 如有疑问请参考画布操作这篇文章 + canvas.translate(mCenterX,0); // mCenterX 是屏幕宽度的一半,在onSizeChanged中获取 + + // 设置字体颜色 + mPaint.setColor(Color.rgb(0x06,0xaf,0xcd)); + + // 在不同模式下绘制文字 + mPaint.setTextAlign(Paint.Align.LEFT); + canvas.drawText("左对齐", 0, 200, mPaint); + + mPaint.setTextAlign(Paint.Align.CENTER); + canvas.drawText("居中对齐", 0, 400, mPaint); + + mPaint.setTextAlign(Paint.Align.RIGHT); + canvas.drawText("右对齐", 0, 600, mPaint); +``` + +### Style + +Style的意思是样式,这个在 [Canvas之绘制基本形状](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B2%5DCanvas_BasicGraphics.md) 这篇文章中讲过,它有三种状态: + +枚举类型 | 作用 +----------------|---------------- +FILL | 填充 +STROKE | 描边 +FILL_AND_STROKE | 填充加描边 + +Style 对应的方法如下: + +``` java +public Paint.Style getStyle () // 获取当然样式 + +public void setStyle (Paint.Style style) // 设置样式 +``` + +效果如下: + +![](http://ww3.sinaimg.cn/large/005Xtdi2gw1f3nh9r8ih0j30dw08c3z4.jpg) + +核心代码: + +``` java + // 平移画布 - 如有疑问请参考画布操作这篇文章 + canvas.translate(mCenterX,0); // mCenterX 是屏幕宽度的一半,在onSizeChanged中获取 + + mPaint.setTextAlign(Paint.Align.CENTER); + mPaint.setColor(Color.rgb(0x06,0xaf,0xcd)); + + // 设置不同的样式 + + // 填充 + mPaint.setStyle(Paint.Style.FILL); + canvas.drawText("GcsSloop 中文", 0, 200, mPaint); + + // 描边 + mPaint.setStyle(Paint.Style.STROKE); + canvas.drawText("GcsSloop 中文", 0, 400, mPaint); + + // 描边加填充 + mPaint.setStyle(Paint.Style.FILL_AND_STROKE); + canvas.drawText("GcsSloop 中文", 0, 600, mPaint); +``` + +### FontMetrics + +FontMetrics 是 Paint 的一个内部类,根据名字我们可以大致知道这是一个描述**字体规格**相关的类,关于这个类的描述原文是这样的: + +> Class that describes the various metrics for a font at a given text size. Remember, Y values increase going down, so those values will be positive, and values that measure distances going up will be negative. This class is returned by getFontMetrics(). + +翻译一下: + +> 简单来说,FontMetrics包含了当前文本相关的各项参数,你可以通过 Paint中 _getFontMetrics()_ 这个方法来获取到这个类。 +(另外,原文中还特地强调了一下关于坐标正负的问题。) + +##### FontMetrics包含了以下几个数值: + +> 如果没有特殊说明,一下文章中“基线”默认代表“基线Y”。 + +名称 | 正负| 释义 +--------|:---:|-------------------------------------------------------- +top | - | 在指定字形和大小的情况下,字符最高点与基线之间的距离 +ascent | - | 单个字符的最高点与基线距离的推荐值(不包括字母上面的符号) +descent | + | 单个字符的最低点与基线距离的推荐值 +bottom | + | 在指定字形和大小的情况下,字符最低点与基线之间的距离 +leading | + | 行间距,当前行bottom与下一行top之间的距离的推荐值 (通常为0,因为top与ascent,bottom与leading之间的距离足够作为行间距了) + +![](http://ww1.sinaimg.cn/large/005Xtdi2gw1f3syr8fbd1j30dw08c755.jpg) + +看了上面啰啰嗦嗦讲了一堆,你可能会产生一些疑问,这里我简单解释一下: + +0、 FontMetrics到底有什么用? + +> FontMetrics 是字体规格,比较精确的测量出文字相关的各种数据,在很多地方都是用得到的,比较常见的就是我们的音乐播放器中的歌词显示,需要实时的变字体位置,这里就需要比较精确是数值来进行计算以确保不会出现两行文字重叠等问题。 + +1、为什么表格中最高点距离基线的值是负值,而最低点反而是正值? + +> 这是因为手机屏幕坐标系的特殊性,在数学中常见的坐标系y轴是向上的,而对于手机而言,y轴默认是向下的,所以数值越小越靠近屏幕顶端,即最高点的数值比基线小,最高点减去基线结果自然为负数。 更多参考 [坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B1%5DCoordinateSystem.md) 这篇文章。 + +2、为什么表格中很多都是推荐值? + +> 这是因为字的规格不仅受字大小的影响,而且受字体风格的影响,不同的字体风格差别很大,其结果可能会有偏差,故大部分都是推荐值。 + +3、 具体绘制的文本不同会影响 FontMetrics 中的数值吗? + +> 不会, **FontMetrics中的数值受字体大小(FontSize) 和 字体风格(Typeface) 影响**, 而不会因为具体绘制的内容不同而改变,给Paint设置完字体大小和字体风格后就能获取到正确的FontMetrics。 + +**获取FontMetrics的方法** +``` java + Paint.FontMetrics mMetrics = mPaint.getFontMetrics(); + + Log.e("TAG", "top=" + mMetrics.top); + Log.e("TAG", "ascent=" + mMetrics.ascent); + Log.e("TAG", "descent=" + mMetrics.descent); + Log.e("TAG", "bottom=" + mMetrics.bottom); + Log.e("TAG", "leading=" + mMetrics.leading); +``` +结果: +``` +05-15 21:18:13.315 13112-13112/com.gcssloop.canvas E/TAG: top=-152.98828 +05-15 21:18:13.315 13112-13112/com.gcssloop.canvas E/TAG: ascent=-129.88281 +05-15 21:18:13.315 13112-13112/com.gcssloop.canvas E/TAG: descent=34.179688 +05-15 21:18:13.315 13112-13112/com.gcssloop.canvas E/TAG: bottom=37.939453 +05-15 21:18:13.315 13112-13112/com.gcssloop.canvas E/TAG: leading=0.0 +``` + +**由于FontMetrics中的 ascent 与 descent 比较常用,所以可以直接通过Paint获取:** +``` java + Log.e("TAG", "P.ascent=" + mPaint.ascent()); + Log.e("TAG", "P.descent=" + mPaint.descent()); +``` +结果,可以看到与通过FontMetrics获得的结果相同。 +``` +05-15 21:24:18.950 13112-13112/com.gcssloop.canvas E/TAG: P.ascent=-129.88281 +05-15 21:24:18.955 13112-13112/com.gcssloop.canvas E/TAG: P.descent=34.179688 +``` + + +## 文字居中 + +对于绘制居中的文本来说,我们可以封装一个方法用中心点作为绘制坐标,在绘制的时候转换为实际坐标。 + +根据前面的知识可知,想让文字水平居中很容易,只需要设置 TextAlign 为 CENTER,那么基线X(BaseLineX)自然就是这个字符串的中心了。 + +而让文字垂直居中则有些麻烦了,因为基线Y(BaseLineY)既不是顶部,底部,也不是中心,所以文本居中最难的内容就是计算BaseLineY的位置。 + +我们已知: + +> 1. 中心位置坐标,centerX, centerY +2. 文本高度:height = descent-ascent +3. descent的坐标:descentY = centerY + 1/2height +4. baseLineY坐标:baseLineY = descentY-descent + +通过上面内容可以推算出如下公式: + +> baseLineY = centerY - 1/2(ascent + descent) + +**根据公式我们可以封装一个方法:** + +``` java + /** + * 居中绘制文本 + * + * @param text + * @param canvas + * @param paint + */ + public void drawTextByCenter(String text, float x, float y, Canvas canvas, Paint paint) { + Paint tempPaint = new Paint(paint); // 创建一个临时画笔,防止影响原来画笔的状态 + tempPaint.setTextAlign(Paint.Align.CENTER); // 设置文本对齐方式为居中 + + // 通过y计算出baseline的位置 + float baseline = y - (tempPaint.descent() + tempPaint.ascent()) / 2; + + canvas.drawText(text, x, baseline, tempPaint); //绘制文本 + } +``` + +**测试方法是否正确** + +``` java + canvas.translate(mCenterX, mCenterY); + + String text = "ASSA"; + mPaint.setColor(Color.BLACK); + + drawTextByCenter(text, 0, 0, canvas, mPaint); +``` + +结果: + + + +## 绘制多行 + +前面讲的所有绘制文本都是绘制单行文本,而对于长文本就束手无策了,但是我们偶尔也需要绘制一些长文本,例如绘制一段文本,这样前面的就无法满足需求了。 + +我们先思考一下如何才能绘制一段长文本让其可以自动换行,如自动测量文本长度,然后根据测量的内容截开成n行,然后一行一行的绘制。 + + + + + + + + + From 7485212306ff9128805c28bb5c1777a481b543df Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 16 Oct 2016 06:15:53 +0800 Subject: [PATCH 464/615] Update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 842cdcfc..ebecd7b4 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ * [安卓自定义View进阶 - Matrix Camera](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B11%5DMatrix_3D_Camera.md) * [安卓自定义View进阶 - 事件分发机制原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B12%5DDispatch-TouchEvent-Theory.md) * [安卓自定义View进阶 - 事件分发机制详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B15%5DDispatch-TouchEvent-Source.md) + ****** ## [教程类](https://github.com/GcsSloop/AndroidNote/tree/master/Course/README.md) From 383ae9e0cc2350f2bbe4f50a43e48e7b6a7b9117 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 16 Oct 2016 17:31:38 +0800 Subject: [PATCH 465/615] Update --- CustomView/Demo/PieView.zip | Bin 46473 -> 45694 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/CustomView/Demo/PieView.zip b/CustomView/Demo/PieView.zip index 633b42150474dfb1b54e5b00232285b19d1fa22c..f88db430606fe0e3d9564e305deb332e0a63a70b 100644 GIT binary patch delta 3611 zcmZ`*3s@6Z79J)%!XpVv0wIAAd5TJ4m7=sNAVmd5lCo%gq9ThR)FM%_vPQOBDMCfP zR^+t^K2QvV25q})VU^mhRti2=6j!VJ;iIitTv74O-aB_DGsIo;CEv{dpL6b+`~UY0 z#lMkn`bdF#7SGm+K!2Sj>Ky`a&xV;itqFdg*oX;4iU~gaTq;q6)DfOL776r+A=yR; zn9I8oI-*^R^i}qyS7XJtWsx6i?#ur?($4tQE(?6%930&A*L!zk`BO_ow=R6LdLMYu zRT*xMnS42F;MC)>71vfY1Ya9RT ze>|mhd)n5cxkDe68ZVC1D-K-aKNUS1m-}L_=JT}&{xBx3yz||>Z<|y#kL`0Ks(PB+ z&vlwcCpugV@xp`In_Qv?;x_-V=*sR{|A{x}qk2uDOlM4*ZIY&(hLt2*Oq>A}Cp~X8(Y)oV8JSo`!m$FC&_T-AM+%MY4)Uk-y_Ja)Nxa zz!r%Qo{{rx5!#x}dtyUff&SILpvl=6!*HaujA&jh1}xnY=H;we+nKN7-~P-mvk z%}ie(nztq`RP}yxYO-$in)DQ{3xUkU8Y*f|N0_)sAG(5{RWxp9Y1_2bOH*Q|L`M>b zV${XqlKmSau4?z(T2TF`WY?akG5Q(t{@Rr(H-qNa?i%#Ep4%5itT=u)DB4L`xL&t) z$;jQp5mP?gn*Fn8d9hddH>c8uPVC}!bl%|iXx|xl+FjZH>zj4sQ+J)|4VqrtQ4v>> z{`}wq!Y3oC|N7%o=U)|7{C1*c?V#Rw`h`B#msx`ka@@Z^-8Q+MG;60yR~-ww@&(V2hS5V?+>DpaLmnN2`Z&!tX>sd@h%^75 z)_ux+>|pS`pC#Q>`48uxU-Y%4)}c#~^NYTBp$NJpv<;fVf&cQ{fs~1qORP-tmKdq2 zi7~NB$=Xn^Do6}#Ct1ugtb`KkNtFn)uAxf(pV~rq%?5pHchDtJVoTN4`T~hCfW28N z3}$bP!tv~lgXlecgKW4`M7y&?beeW&@rXGT-+FySDGj0OpSxkhf>yUgoNp_hi!YXl zGjPUPu`kaPnf=b4{&~YsPa|}ASfDTH_V55xq%PD!`3Rj4jdVFq{#rVX$3tPS#JF1&n zsRT6@LL6hPxQQ=zRQBPE4OM$^mZaK+)96fpPq4Jc3sakGqB$bOySajpy-qu8ZE*!G z48nwbC2isc-nX!#cJTL)*?%XvN|0bEJ(MC&Ma(Z`-WC&S^q%ZFbt z!i5=s(fbRRz}zI#$B9opEgE&;P5l_f0}`H6dMK(gGIg05A5s&MPf%kx*C+-H_Q`zX zcx>46wVBx~R2gfQt;mL>6W5dXfMrJ%K?2T_=9oA;HYq!Ed0r?J4N%$1`(?b%b_8f~ z_V#3o^v~lyHX83``{nwT4s0DXxS2BOA*^?uJAEXaZuS?}TUFtV2)4#=FC z{lTKRdJl`4fnt2DVnE3OA-NMVLH5Y4I1}83=xv1hflWsRTqfb5kc@Pu8AsrAm>vsA z*dqsJWF?n#1hpcCJ=Pc~8&u?91fb6722UA{t%BGM3Il%|A>m_Gd=*&=G`9-LjUp5e zhoGHx-)|t>&ajSb#hgPb(!rI=YB}VNPyIQFX))IAF_P^$?68V7adAh`B6ef?ZGf!V zjb7iAb}AawT&tk@>(wYHW5skJn$}MAS)=Cl`o=M29m{q$O2g4cd*5XW;WG>i#Z%MT zo*?W;62xSVc728KNiF3&8=XP4mos+>=m(%bA|z{lV3ddTPW=R#e^Cth(a)KAI(vhP zR4GwBNHjR(eOd&udjRpy&{Mueh59AbuFU(K?VW0z32kAb(Nk-;iW^tf9ts?Ct zlob|6WhujlWevhCJ;T_6h-Npg&vKfDtZkWBjmG9K_9 zWAA7gLDVE0`K63(vXG#M^)rN6=*+7{||+lb37*FC03)tu}a*tya)N;4!WHnBH?F; Lm>_y;(A|Fl@k-$c delta 4504 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 S?PD;;@OMNSgNe&Q-u@4mA&0#H From d873e1f6307451f9e1d4427abdff380a3c4575fc Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 16 Oct 2016 17:38:12 +0800 Subject: [PATCH 466/615] Update --- CustomView/Advance/[02]Canvas_BasicGraphics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[02]Canvas_BasicGraphics.md b/CustomView/Advance/[02]Canvas_BasicGraphics.md index 28820e87..86336f5e 100644 --- a/CustomView/Advance/[02]Canvas_BasicGraphics.md +++ b/CustomView/Advance/[02]Canvas_BasicGraphics.md @@ -476,12 +476,12 @@ public class PieView extends View { // 设置数据 public void setData(ArrayList mData) { this.mData = mData; - initDate(mData); + initData(mData); invalidate(); // 刷新 } // 初始化数据 - private void initDate(ArrayList mData) { + private void initData(ArrayList mData) { if (null == mData || mData.size() == 0) // 数据有问题 直接返回 return; From 9623462edaccdeb395a6bc6b0860501238f04590 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 17 Oct 2016 18:25:39 +0800 Subject: [PATCH 467/615] Update --- CustomView/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CustomView/README.md b/CustomView/README.md index 85791f40..664ace01 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -43,6 +43,12 @@

+******* + +

+ +

+ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From 2321fcac249db3135c10be132ac6fb2db2c48771 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 18 Oct 2016 17:02:46 +0800 Subject: [PATCH 468/615] Update --- CustomView/Base/[02]AngleAndRadian.md | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/CustomView/Base/[02]AngleAndRadian.md b/CustomView/Base/[02]AngleAndRadian.md index dab77f5a..2d4dd12f 100644 --- a/CustomView/Base/[02]AngleAndRadian.md +++ b/CustomView/Base/[02]AngleAndRadian.md @@ -20,17 +20,17 @@ 由于两者进制是不同的(**角度是60进制,弧度是10进制**),在合适的地方使用合适的单位来描述会更加方便。 > **例如:** -角度是60进位制,遇到30°6′这样的角,应该转化为10进制的30.1°。但弧度就不需要,因为弧度本身就是十进制的实数。 +> 角度是60进位制,遇到30°6′这样的角,应该转化为10进制的30.1°。但弧度就不需要,因为弧度本身就是十进制的实数。 ## 二.角度与弧度的定义 角度和弧度一样都是描述角的一种度量单位,下面是它们的定义: -名称 | 定义 -:---:| --- -角度 | 两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。**当这段弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度.** -弧度 | 两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。**当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度.** +| 名称 | 定义 | +| :--: | ---------------------------------------- | +| 角度 | 两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。**当这段弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度.** | +| 弧度 | 两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。**当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度.** | **如图:** @@ -47,14 +47,16 @@ C = 2πr; 一周对应的角度为360度(角度),对应的弧度为2π弧度。 -故: **180度 = π弧度.** +故的等价关系: **180(度) = π(弧度).** -可得: +由等价关系可得如下换算公式: -公式 | 例子 -----------------------|--------------------- -**弧度 = 角度xπ/180** | 2π = 360 x π / 180 -**角度 = 弧度x180/π** | 360 = 2π x 180 / π +> rad 是弧度, deg 是角度 + +| 公式 | 例子 | +| ----------------------- | ------------------ | +| **rad = deg x π / 180** | 2π = 360 x π / 180 | +| **deg = rad x 180 / π** | 360 = 2π x 180 / π | 维基百科的公式: From 5f270c2f752be9e182591c9072805b0af3094be7 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 19 Oct 2016 00:14:57 +0800 Subject: [PATCH 469/615] Update --- CustomView/Advance/[07]Path_Over.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[07]Path_Over.md b/CustomView/Advance/[07]Path_Over.md index a942b63d..19007696 100644 --- a/CustomView/Advance/[07]Path_Over.md +++ b/CustomView/Advance/[07]Path_Over.md @@ -282,7 +282,7 @@ Path的布尔运算有五种逻辑,如下: 代码: -​``` java +``` java int x = 80; int r = 100; From e6de20672bb31def5e00922a065ef37539ac8a1d Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 19 Oct 2016 04:09:56 +0800 Subject: [PATCH 470/615] Update --- CustomView/Advance/[05]Path_Basic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[05]Path_Basic.md b/CustomView/Advance/[05]Path_Basic.md index a46a6e3a..85f12f53 100644 --- a/CustomView/Advance/[05]Path_Basic.md +++ b/CustomView/Advance/[05]Path_Basic.md @@ -213,9 +213,9 @@ close方法用于连接当前最后一个点和最初的一个点(如果两个 ``` -很明显,两个lineTo分别代表第1和第2条线,而close在此处的作用就算连接了B(200,0)点和圆的O之间的第3条线,使之形成一个封闭的图形。 +很明显,两个lineTo分别代表第1和第2条线,而close在此处的作用就算连接了B(200,0)点和原点O之间的第3条线,使之形成一个封闭的图形。 -**注意:close的作用是封闭路径,与当前最后一个点和第一个点并不等价。如果连接了最后一个点和第一个点仍然无法形成封闭图形,则close什么 也不做。** +**注意:close的作用是封闭路径,与连接当前最后一个点和第一个点并不等价。如果连接了最后一个点和第一个点仍然无法形成封闭图形,则close什么 也不做。** ### 第2组: addXxx与arcTo From 8cb6e5d8162e3227f8bbec3031da01b96b044bd4 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 20 Oct 2016 00:39:14 +0800 Subject: [PATCH 471/615] Update --- CustomView/Advance/[15]Dispatch-TouchEvent-Source.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md b/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md index 503d2ed6..b31bb10b 100644 --- a/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md +++ b/CustomView/Advance/[15]Dispatch-TouchEvent-Source.md @@ -64,7 +64,7 @@ A: **如果不去看源码,想一下让自己设计会怎样?** * 单击事件(onClickListener) 需要两个两个事件(ACTION_DOWN 和 ACTION_UP )才能触发,如果先分配给onClick判断,等它判断完,用户手指已经离开屏幕,黄花菜都凉了,定然造成 View 无法响应其他事件,应该最后调用。(最后) * 长按事件(onLongClickListener) 同理,也是需要长时间等待才能出结果,肯定不能排到前面,但因为不需要ACTION_UP,应该排在 onClick 前面。(onLongClickListener > onClickListener) * 触摸事件(onTouchListener) 如果用户注册了触摸事件,说明用户要自己处理触摸事件了,这个应该排在最前面。(最前) -* View自身处理(onTouchEvent) 提供了一种默认的处理方式,如果用户已经处理好了,也就不需要了,所以应该排在 onClickListener 后面。(onClickListener > onTouchListener) +* View自身处理(onTouchEvent) 提供了一种默认的处理方式,如果用户已经处理好了,也就不需要了,所以应该排在 onTouchListener 后面。(onTouchListener > onTouchEvent) **所以事件的调度顺序应该是 `onTouchListener > onTouchEvent > onLongClickListener > onClickListener`**。 From 8caccc5aac60601fb609a30e8527f2e78a392034 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 22 Oct 2016 23:44:35 +0800 Subject: [PATCH 472/615] Update --- Course/Markdown/markdown-editor.md | 65 ++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 Course/Markdown/markdown-editor.md diff --git a/Course/Markdown/markdown-editor.md b/Course/Markdown/markdown-editor.md new file mode 100644 index 00000000..796e6452 --- /dev/null +++ b/Course/Markdown/markdown-editor.md @@ -0,0 +1,65 @@ +自从接触了 Markdown 之后,就一直用 Markdown 作为自己的主要书写工具,不论是平时做一些简单的纪录,还是用来写博客,写文档都是非常方便。本文就是用 Markdown 进行书写的。 + +> 我最早因为 GitHub 而了解到 Markdown,当是支持 Markdown 的平台并不多,现在发现很多平台都已经开始支持 Markdown了,不论是老牌的 CSDN 还是比较新的 简书、掘金、DiyCode 等都支持使用Markdown进行写作,借此趋势,赶紧向还不了解 Markdown 的魔法师强势安利一波。 +> +> 如果你已经开始使用 Markdown了,那么本文作用对你可以能并不大,请看后续文章。 + + + +## 什么是 Markdown ? + +**Markdown 是一种轻量级标记语言,创始人为約翰·格魯伯(John Gruber)。 它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档”。** + +相比于 HTML (~~How To Make Love~~ 大雾), **Markdown 更加精简,更加注重内容,其主要宗旨是「易读易写」** 一般 Markdown 最终都是要转换为 HTML 的,可用于书写博客或者网页,但借助某些工具,可以讲 Markdown 转换为 pdf,word,Latex 等其他常见的文件格式。 + + + +## 为什么选择 Markdown ? + +**选择 Markdown 但理由只有一个:方便,节省时间!** + +至于为什么这样说,请看下面内容: + +* **语法简洁**,没有任何编程基础的人十几分钟语言即可入门。 +* **注重内容**,专注于内容编写,不再因为格式拍版而苦恼 (word格式刷工具哭晕在厕所)。 +* **易阅读性**,即便是没有经过转换的 Markdown 文件,大部分文字内容仍可阅读。 +* **易编辑性**,任何文本编辑器都能编辑 Markdown 文件。 +* **跨平台性**,任何平台均能打开 Markdown 文件,由于是纯文本文件,不存在格式兼容的问题。 +* **导出方便**,支持导出为 HTML,PDF,Word(.docx),LaTex 等常见格式(需要工具支持)。 + +> 在 Windows 上编写的文档,非常方便的就能在 Mac 上继续编辑,方便数据迁移,降低沟通成本。 + + + +## Markdown 存在的问题 + +前面吹嘘了 Markdown 的那么多优点,下面就说一下其中的不足: + +* **图片问题**,很多人都觉得 Markdown 文件插入图片麻烦,还要自己上传找链接。 +* **语法兼容**,基础语法是兼容的,但不同工具(平台)的扩展语法不兼容(由于没有统一标准)。 +* **细节控制**,Markdown只提供最基础的格式,其显示样式主要由CSS控制,很难针对性的控制部分内容。 + +> 以上应该是 Markdown 最常见的一些麻烦,不过不必担心,**后续文章会教大家来如何解决这些问题,取其精华,去其糟粕,让 Markdown 运用得心应手**。 + + + +## Markdown 编辑器推荐 + +俗话说,工欲善其事,必先利其器,虽然 Markdown 用任何文本编辑器都能打开编辑,但仍需要专业工具进行转化,常见 Markdown 编辑器我基本上都尝试用过,在此简单推荐几种,大家找适合自己的就行。 + +**仅推荐本地编辑器,在线编辑器根据需要自己选择,很多平台都已经支持直接用 Markdown 进行编辑了。** + +| 编辑器 | 支持平台 | 支持导出格式 | +| ---------------------------------------- | --------------------------- | ---------------------------------------- | +| [**Typora**](http://www.typora.io/)
正在开发, 界面简洁, 对 HTML 语法支持较弱, 支持导出文件类型较多。 | Mac、
Windows、
Linux | HTML、
Word(.docx)、
PDF、
LaTex 等 | +| [**EME**](https://eme.moe/)
正在开发, 界面简洁,对 HTML 语法支持友好,支持导出文件类型较少。 | Mac、
Windows、
Linux | 仅 PDF | +| [**Mou**](http://25.io/mou/)
停止开发, 界面简洁, 对 HTML 语法支持友好, 但支持导出文件类型较少。 | Mac | HTML、
PDF | +| [**Sublime Text**](http://www.sublimetext.com/3)
神兵利器,需要安装插件才能使用, 相对比较麻烦, 适合高级魔法师。 | Mac、
Windows、
Linux | 多种格式(插件) | +| [**Atom**](https://atom.io/)
神兵利器, 支持多种常见的编程语言, 如果仅仅是为了写 Markdown 不推荐安装。 | Mac、
Windows、
Linux | HTML、
PDF(插件) | + + + +## 快速入门 + +前面是为了帮助还不了解Markdown + From c6a9c902b3d4afcb7f1a22765168d8e09182a79f Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 23 Oct 2016 23:34:08 +0800 Subject: [PATCH 473/615] Update --- Course/Markdown/{markdown-editor.md => markdown-start.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Course/Markdown/{markdown-editor.md => markdown-start.md} (100%) diff --git a/Course/Markdown/markdown-editor.md b/Course/Markdown/markdown-start.md similarity index 100% rename from Course/Markdown/markdown-editor.md rename to Course/Markdown/markdown-start.md From e02c1949645a5bf219f7c07706c8b700489a4134 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 24 Oct 2016 17:33:54 +0800 Subject: [PATCH 474/615] Update --- CustomView/Base/[03]Color.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/Base/[03]Color.md b/CustomView/Base/[03]Color.md index 77694a0c..86d3983c 100644 --- a/CustomView/Base/[03]Color.md +++ b/CustomView/Base/[03]Color.md @@ -82,6 +82,8 @@ RGB 从0x00到0xff表示颜色从浅到深。 ``` java int color = getResources().getColor(R.color.mycolor); + + int color = getColor(R.color.myColor); //API 23 及以上支持该方法 ``` ### 4.在xml文件(layout或style)中引用或者创建颜色 From e0fbf45afbbc8e0681fd2893cb71e116e443f88d Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 25 Oct 2016 22:45:50 +0800 Subject: [PATCH 475/615] Update --- Course/Markdown/markdown-grammar.md | 331 ++++++++++++++++++++++++++++ Course/Markdown/markdown-start.md | 125 ++++++++++- 2 files changed, 449 insertions(+), 7 deletions(-) create mode 100644 Course/Markdown/markdown-grammar.md diff --git a/Course/Markdown/markdown-grammar.md b/Course/Markdown/markdown-grammar.md new file mode 100644 index 00000000..da5c9660 --- /dev/null +++ b/Course/Markdown/markdown-grammar.md @@ -0,0 +1,331 @@ +# Markdown基础语法 + +为保证语法兼容性,本文只介绍基础语法,扩展语法等其它内容,会在后续的文章中单独介绍。 +**注意:所有的标记符号均使用英文,中文无效。** + +**** + +## 标题 + +Markdown 支持多种标题格式。 + +利用 `=` (等号)和 `-`(减号)可以定义一级标题和二级标题,(任何数量的 `=` 和 `-` 都有效果) : + + + + + + + + + + + + + + +
Markdown预览
一级标题
====

一级标题

二级标题
----

二级标题

+ +通过在行首插入 1 到 6 个 # ,来定义对应的 1 到 6 阶 标题,个人推荐使用这种,例如: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Markdown预览
# 一级标题

一级标题

## 二级标题

二级标题

### 三级标题

三级标题

#### 四级标题

四级标题

##### 五级标题
五级标题
###### 六级标题
六级标题
+ +**** + +## 段落和换行 + +在 Markdown 中段落由一行或者多行文本组成,相邻的两行文字会被视为同一段落,如果存在空行则被视为不同段落( Markdown 对空行的定义是看起来是空行就是空行,即使空行中存在 `空格` `TAB` `回车` 等不可见字符,同样会被视为空行)。 + +Markdown支持段内换行,如果你想进行段落内换行可以在上一行结尾插入两个以上的空格后再回车。 + + + + + + + + + + + + + + + + + + +
Markdown预览
+ 第一行
+ 相邻被视为同一段落。 +
+

+ 第一行 相邻被视为同一段落。 +

+
+ 第一行[空格][空格]
+ 上一行结尾存在两个空格,段内换行 +
+

+ 第一行
+ 上一行结尾存在两个空格,段内换行。 +

+
+ 第一行
+
+ 两行之间存在空行,视为不同段落。 +
+

+ 第一行 +

+

+ 两行之间存在空行,视为不同段落。 +

+
+ +****** + +## 强调 + +删除线的 `~` 符号一般位于键盘左上角位置。 + + + + + + + + + + + + + + + + + + + + + + +
Markdown预览
*倾斜* + 倾斜 +
**粗体**粗体
~~删除线~~删除线
+ > 引用 + +
引用
+
+ +****** + +## 链接和图片 + +为了规避某些平台的防盗链机制,图片推荐使用图床,否则在不同平台上发布需要重新上传很麻烦的,图床最好选大平台的图床,一时半会不会倒闭的那种,个人目前主要用的是微博图床 [Chrome插件-微博图床](https://chrome.google.com/webstore/detail/%E6%96%B0%E6%B5%AA%E5%BE%AE%E5%8D%9A%E5%9B%BE%E5%BA%8A/fdfdnfpdplfbbnemmmoklbfjbhecpnhf?hl=zh-CN) 以及 [Alfred脚本-微博图床](https://imciel.com/2016/07/17/weibo-picture-upload-alfred-workflow/) + + + + + + + + + + + + + + +
Markdown预览
[GcsSloop](http://www.gcssloop.com)GcsSloop
![GcsSloop Blog](http://www.gcssloop.com/assets/siteinfo/friends/gcssloop.jpg)GcsSloop Blog
+ +****** + +## 列表 + +无序列表前面可以用 `*` `+` `-` 等,结果是相同的。 +有序列表的数字即便不按照顺序排列,结果仍是有序的。 + + + + + + + + + + + + + + + + + +
Markdown预览
+ * 项目
+ * 项目
+ * 项目
+   * 子项目
+   * 子项目
+ * 项目 +
+
    +
  • 项目
  • +
  • 项目
  • +
  • 项目 +
      +
    • 子项目
    • +
    • 子项目
    • +
    +
  • +
  • 项目
  • +
+
+ 1. 项目
+ 2. 项目
+ 3. 项目
+   1. 子项目
+   2. 子项目
+ 4. 项目 +
+
    +
  1. 项目
  2. +
  3. 项目
  4. +
  5. 项目 +
      +
    1. 子项目
    2. +
    3. 子项目
    4. +
    +
  6. +
  7. 项目
  8. +
+
+ +**** + +## 下划线和特殊符号 + +由于 Markdown 使用一些特殊符号进行标记,当我们想要在文档中使用这些特殊符号并防止被 Markdown 转换的时候,可以使用 `\` (转义符) 将这些特殊符号进行转义。 + + + + + + + + + + + + + + +
Markdown预览
+ 在一行中用三个以上的星号、减号、下划线来建立一个分隔线
+ --- +
+
+
可以利用反斜杠(转义字符)来插入一些在语法中有特殊意义的符号
+ \*Hi\* +
*Hi*
+ +**** + +## 代码 + +### 1.行内代码 + +行内代码可以使用反引号来标记(反引号一般位于键盘左上角,要用英文): + +``` +一句话 `行内代码` 一句话。 +``` + +**预览:** + +一句话 `行内代码` 一句话。 + +### 2.多行代码 + +多行代码使用 3 个反引号来标记(反引号一般位于键盘左上角,要用英文) ,在第一个 ````` 后面可以跟语言类型,没有语言类型可以省略不写: + +``` +​``` java +// 我是注释 +int a = 5; +​``` +``` + +**预览:** + +``` java +// 我是注释 +int a = 5; +``` + + + +**** + +## 表格 + +**扩展的 Markdown 支持手写表格**,格式也非常简单,第二行分割线部分可以使用 `:` 来控制内容状态。 +**注意,Markdown 标准(原生)语法中没有表格支持,但现在多数平台已经支持了该语法,如 GitHub,CSDN,简书 等均支持,所以写在这里:** + +**Markdown:** + +``` +| 默认 | 靠右 | 居中 | 靠左 | +| ---- | ---: | :--: | :--- | +| 内容 | 内容 | 内容 | 内容 | +| 内容 | 内容 | 条目 | 内容 | +``` + +**预览:** + +| 默认 | 靠右 | 居中 | 靠左 | +| ---- | ---: | :--: | :--- | +| 内容 | 内容 | 内容 | 内容 | +| 内容 | 内容 | 条目 | 内容 | + + +## 参考资料 + +[Markdown-语法说明](http://www.markdown.cn/) + + +## About Me + +### 作者微博: @GcsSloop + + \ No newline at end of file diff --git a/Course/Markdown/markdown-start.md b/Course/Markdown/markdown-start.md index 796e6452..ffca84e8 100644 --- a/Course/Markdown/markdown-start.md +++ b/Course/Markdown/markdown-start.md @@ -1,10 +1,14 @@ -自从接触了 Markdown 之后,就一直用 Markdown 作为自己的主要书写工具,不论是平时做一些简单的纪录,还是用来写博客,写文档都是非常方便。本文就是用 Markdown 进行书写的。 +# Markdown 快速入门 + +自从接触了 Markdown 之后,就一直用 Markdown 作为自己的主要书写工具,不论是平时做一些简单的纪录,还是用来写博客,写文档都是非常方便。你现在看到的这篇文章就是用 Markdown 进行书写的。 > 我最早因为 GitHub 而了解到 Markdown,当是支持 Markdown 的平台并不多,现在发现很多平台都已经开始支持 Markdown了,不论是老牌的 CSDN 还是比较新的 简书、掘金、DiyCode 等都支持使用Markdown进行写作,借此趋势,赶紧向还不了解 Markdown 的魔法师强势安利一波。 > -> 如果你已经开始使用 Markdown了,那么本文作用对你可以能并不大,请看后续文章。 +> **如果你已经开始使用 Markdown了,那么本文作用对你可以能并不大,请看后续文章。** + +**** ## 什么是 Markdown ? @@ -14,6 +18,8 @@ +**** + ## 为什么选择 Markdown ? **选择 Markdown 但理由只有一个:方便,节省时间!** @@ -27,10 +33,12 @@ * **跨平台性**,任何平台均能打开 Markdown 文件,由于是纯文本文件,不存在格式兼容的问题。 * **导出方便**,支持导出为 HTML,PDF,Word(.docx),LaTex 等常见格式(需要工具支持)。 -> 在 Windows 上编写的文档,非常方便的就能在 Mac 上继续编辑,方便数据迁移,降低沟通成本。 +在 Windows 上编写的文档,非常方便的就能在 Mac 上继续编辑,方便数据迁移,降低沟通成本。 +**** + ## Markdown 存在的问题 前面吹嘘了 Markdown 的那么多优点,下面就说一下其中的不足: @@ -39,9 +47,9 @@ * **语法兼容**,基础语法是兼容的,但不同工具(平台)的扩展语法不兼容(由于没有统一标准)。 * **细节控制**,Markdown只提供最基础的格式,其显示样式主要由CSS控制,很难针对性的控制部分内容。 -> 以上应该是 Markdown 最常见的一些麻烦,不过不必担心,**后续文章会教大家来如何解决这些问题,取其精华,去其糟粕,让 Markdown 运用得心应手**。 - +以上应该是 Markdown 最常见的一些麻烦,不过不必担心,**后续文章会教大家来如何解决这些问题,取其精华,去其糟粕,让 Markdown 运用得心应手**。 +**** ## Markdown 编辑器推荐 @@ -57,9 +65,112 @@ | [**Sublime Text**](http://www.sublimetext.com/3)
神兵利器,需要安装插件才能使用, 相对比较麻烦, 适合高级魔法师。 | Mac、
Windows、
Linux | 多种格式(插件) | | [**Atom**](https://atom.io/)
神兵利器, 支持多种常见的编程语言, 如果仅仅是为了写 Markdown 不推荐安装。 | Mac、
Windows、
Linux | HTML、
PDF(插件) | - +**** ## 快速入门 -前面是为了帮助还不了解Markdown +本文是为了帮助还不了解 Markdown 的魔法师有一个简单的认知,所以快速入门只说最基本的一些内容。 + + + +### 标题 + +通过在行首插入 1 到 6 个 `#` ,来定义对应的 1 到 6 阶 标题: + + + + + + + + + + + + + + + + + + +
Markdown预览
# 一级标题

一级标题

## 二级标题

二级标题

### 三级标题

三级标题

+ + + +### 分段 + +在 Markdown 中段落由一行或者多行文本组成,相邻的两行文字会被视为同一段落,如果存在空行则被视为不同段落( Markdown 对空行的定义是看起来是空行就是空行,即使空行中存在 `空格` `TAB` `回车` 等不可见字符,同样会被视为空行)。 + + + + + + + + + + + + + + +
Markdown预览
+ 第一行
+ 相邻被视为同一段落。 +
+

+ 第一行 相邻被视为同一段落。 +

+
+ 第一行
+
+ 两行之间存在空行,视为不同段落。 +
+

+ 第一行 +

+

+ 两行之间存在空行,视为不同段落。 +

+
+ + + +### 链接和图片 + + + + + + + + + + + + + + +
Markdown预览
[GcsSloop](http://www.gcssloop.com)GcsSloop
![GcsSloop Blog](http://www.gcssloop.com/assets/siteinfo/friends/gcssloop.jpg)GcsSloop Blog
+ + + +知道了上面这些内容就已经算是入门了,可以用 Markdown 进行快乐的写作,如果想了解更多语法相关内容,请看下一篇 [Markdown实用技巧-基础语法][markdown-grammar] + + +## 参考资料 + +[Markdown-基础语法](http://www.markdown.cn/) + + +## About Me + +### 作者微博: @GcsSloop + + + +[markdown-grammar]: /markdown/markdown-grammar "Markdown实用技巧-语法" + + From 1a8e20396555b11efe5617dd0077af301b918e22 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 28 Oct 2016 21:15:38 +0800 Subject: [PATCH 476/615] Update --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ebecd7b4..a6d027ac 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,9 @@ * [优雅的发布Android开源库(论JitPack的优越性)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/ReleaseLibraryByJitPack.md) * [用JitPack发布时附加文档和源码](https://github.com/GcsSloop/AndroidNote/blob/master/Course/jitpack-javadoc.md) +* [Markdown 快速入门](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-start.md) +* [Markdown 基础语法](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-grammar.md) + ****** ## Tips From ab011079e4c3ac91a381ffba2df5ca6d3d1c5c5d Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 28 Oct 2016 21:16:40 +0800 Subject: [PATCH 477/615] Update --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a6d027ac..176fc41d 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,9 @@ * [优雅的发布Android开源库(论JitPack的优越性)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/ReleaseLibraryByJitPack.md) * [用JitPack发布时附加文档和源码](https://github.com/GcsSloop/AndroidNote/blob/master/Course/jitpack-javadoc.md) -* [Markdown 快速入门](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-start.md) +------ + +* [Markdown 快速入门](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-start.md) * [Markdown 基础语法](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-grammar.md) ****** From 966b91d89159cc0a9385df34f115e62646033da2 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 29 Oct 2016 22:15:04 +0800 Subject: [PATCH 478/615] Update --- Course/Markdown/markdown-grammar.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Course/Markdown/markdown-grammar.md b/Course/Markdown/markdown-grammar.md index da5c9660..a84c9f40 100644 --- a/Course/Markdown/markdown-grammar.md +++ b/Course/Markdown/markdown-grammar.md @@ -1,4 +1,4 @@ -# Markdown基础语法 +# Markdown 基础语法 为保证语法兼容性,本文只介绍基础语法,扩展语法等其它内容,会在后续的文章中单独介绍。 **注意:所有的标记符号均使用英文,中文无效。** @@ -328,4 +328,4 @@ int a = 5; ### 作者微博: @GcsSloop - \ No newline at end of file + From 1d2bdb1c9beb3ac03c9b317579064ce2e7c838af Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 30 Oct 2016 22:41:47 +0800 Subject: [PATCH 479/615] Update --- CustomView/Advance/[16]MotionEvent | 1 + 1 file changed, 1 insertion(+) create mode 100644 CustomView/Advance/[16]MotionEvent diff --git a/CustomView/Advance/[16]MotionEvent b/CustomView/Advance/[16]MotionEvent new file mode 100644 index 00000000..f34de326 --- /dev/null +++ b/CustomView/Advance/[16]MotionEvent @@ -0,0 +1 @@ +# MotionEvent From 0457d83787ba151bec0d721d5f2e17ff7d5fc347 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 30 Oct 2016 22:42:12 +0800 Subject: [PATCH 480/615] Update --- CustomView/Advance/{[16]MotionEvent => [16]MotionEvent.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename CustomView/Advance/{[16]MotionEvent => [16]MotionEvent.md} (100%) diff --git a/CustomView/Advance/[16]MotionEvent b/CustomView/Advance/[16]MotionEvent.md similarity index 100% rename from CustomView/Advance/[16]MotionEvent rename to CustomView/Advance/[16]MotionEvent.md From 8f4c4f26f041908cc5c42f9c832c9149d3652e73 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 1 Nov 2016 23:17:27 +0800 Subject: [PATCH 481/615] Update --- Course/Markdown/markdown-link.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Course/Markdown/markdown-link.md diff --git a/Course/Markdown/markdown-link.md b/Course/Markdown/markdown-link.md new file mode 100644 index 00000000..7d82df34 --- /dev/null +++ b/Course/Markdown/markdown-link.md @@ -0,0 +1 @@ +# Markdown From f39da495322b9db8991c8875ecf2791a49bac0ee Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 2 Nov 2016 09:43:18 +0800 Subject: [PATCH 482/615] Update --- CustomView/Advance/[16]MotionEvent.md | 308 +++++++++++++++++++++++++- 1 file changed, 307 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[16]MotionEvent.md b/CustomView/Advance/[16]MotionEvent.md index f34de326..8d0548d2 100644 --- a/CustomView/Advance/[16]MotionEvent.md +++ b/CustomView/Advance/[16]MotionEvent.md @@ -1 +1,307 @@ -# MotionEvent +# Android MotionEvent 详解 + +Android MotionEvent 详解,之前用了两篇文章 [事件分发机制原理][customview/dispatch-touchevent-theory] 和 [事件分发机制详解][customview/dispatch-touchevent-source] 来讲解事件分发,而作为事件分发主角之一的 MotionEvent 并没有过多的说明,本文就带大家了解 MotionEvent 的相关内容,简要介绍触摸事件,主要包括 单点触控、多点触控、鼠标事件 以及 getAction() 和 getActionMasked() 的区别。 + +Android 将所有的输入事件都放在了 MotionEvent 中,随着安卓的不断发展壮大,MotionEvent 也开始变得越来越复杂,下面是我自己整理的 MotionEvent 大事记: + +| 版本号 | 更新内容 | +| :-------------------: | --------------------------- | +| Android 1.0 (API 1 ) | 支持单点触控和轨迹球的事件。 | +| Android 1.6 (API 4 ) | 支持手势。 | +| Android 2.2 (API 8 ) | 支持多点触控。 | +| Android 3.1 (API 12) | 支持触控笔,鼠标,键盘,操纵杆,游戏控制器等输入工具。 | + +以上仅仅是简要的说明几次比较大的变动,细小的修复和更新不计其数,此处就不一一列出了,反正也没人关心这些东西。 +MotionEvent 负责集中处理所有类型设备的输入事件,但是由于某些设备使用的几率较小本文会忽略讲解,或者简要讲解,例如: +1、轨迹球只出现在最早的设备上,现代的设备上已经见不到了,本文不再叙述。 +2、触控笔和手指处理流程基本相同,不再多说。 +3、鼠标在手机上使用概率也比较小,会在文末简要介绍。 + + + +## 单点触控 + +单点触控就非常简单啦,入门的工程师都会用,上一篇文章也简要介绍过,主要涉及以下几个事件: + +| 事件 | 简介 | +| -------------- | ------------------------ | +| ACTION_DOWN | 手指 **初次接触到屏幕** 时触发。 | +| ACTION_MOVE | 手指 **在屏幕上滑动** 时触发,会多次触发。 | +| ACTION_UP | 手指 **离开屏幕** 时触发。 | +| ACTION_CANCEL | 事件 **被上层拦截** 时触发。 | +| ACTION_OUTSIDE | 手指 **不在控件区域** 时触发。 | + +和以下的几个方法: + +| 方法 | 简介 | +| :---------- | ---------------------- | +| getAction() | 获取事件类型。 | +| getX() | 获得触摸点在当前 View 的 X 轴坐标。 | +| getY() | 获得触摸点在当前 View 的 Y 轴坐标。 | +| getRawX() | 获得触摸点在整个屏幕的 X 轴坐标。 | +| getRawY() | 获得触摸点在整个屏幕的 Y 轴坐标。 | + +> 关于 `get` 和 `getRaw` 的区别可以参考这一篇文章 [安卓自定义View基础-坐标系][customview/CoordinateSystem] + +单点触控一次简单的交互流程是这样的: + +**手指落下(ACTION_DOWN) -> 多次移动(ACTION_MOVE) -> 离开(ACTION_UP)** + +> - 本次事例中 ACTION_MOVE 有多次触发。 +> - 如果仅仅是单击(手指按下再抬起),不会触发 ACTION_MOVE。 + +![单点触摸事件流程](http://ww4.sinaimg.cn/large/005Xtdi2jw1f8oz1704ylg30bo0jqgmx.gif) + +针对单点触控的事件处理一般是这样写的: + +```java +@Override +public boolean onTouchEvent(MotionEvent event) { + // ▼ 注意这里使用的是 getAction(),先埋一个小尾巴。 + switch (event.getAction()){ + case MotionEvent.ACTION_DOWN: + // 手指按下 + break; + case MotionEvent.ACTION_MOVE: + // 手指移动 + break; + case MotionEvent.ACTION_UP: + // 手指抬起 + break; + case MotionEvent.ACTION_CANCEL: + // 事件被拦截 + break; + case MotionEvent.ACTION_OUTSIDE: + // 超出区域 + break; + } + return super.onTouchEvent(event); +} +``` + +相信小伙伴对此已经非常熟悉了,经常使用的东西,我也不啰嗦了。 + +但其中有两个比较特殊的事件: `ACTION_CANCEL` 和 `ACTION_OUTSIDE` 。 +为什么说特殊呢,因为它们是由程序触发而产生的,而且触发条件也非常特殊,通常情况下即便不处理这两个事件也没有什么问题。接下来我们就扒一扒它们的真面目: + +### ACTION_CANCEL + +**`ACTION_CANCEL` 的触发条件是事件被上层拦截**,然而我们在 [事件分发机制原理][customview/dispatch-touchevent-theory] 一文中了解到当事件被上层 View 拦截的时候,ChildView 是收不到任何事件的,ChildView 收不到任何事件,自然也不会收到 `ACTION_CANCEL` 了,所以说这个 `ACTION_CANCEL` 的正确触发条件并不是这样,那么是什么呢? + +**事实上,只有上层 View 回收事件处理权的时候,ChildView 才会收到一个 `ACTION_CANCEL` 事件。** + +这样说可能不太容易不理解,咱举个例子? + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f9auctayt4j302s03o744.jpg) + +> 例如:上层 View 是一个 RecyclerView,它收到了一个 `ACTION_DOWN` 事件,由于这个可能是点击事件,所以它先传递给对应 ItemView,询问 ItemView 是否需要这个事件,然而接下来又传递过来了一个 `ACTION_MOVE` 事件,且移动的方向和 RecyclerView 的可滑动方向一致,所以 RecyclerView 判断这个事件是滚动事件,于是要收回事件处理权,这时候对应的 ItemView 会收到一个 `ACTION_CANCEL` ,并且不会再收到后续事件。 +> +> **通俗一点?** +> +> RecyclerView:儿砸,这里有一个 `ACTION_DOWN` 你看你要不要。 +> ItemView :好嘞,我看看。 +> RecyclerView:噫?居然是移动事件`ACTION_MOVE`,我要滚起来了,儿砸,我可能要把你送去你姑父家(缓存区)了,在这之前给你一个 `ACTION_CANCEL`,你要收好啊。 +> ItemView :…... +> +> 这是实际开发中最有可能见到 `ACTION_CANCEL` 的场景了。 + + + +### ACTION_OUTSIDE + +`ACTION_OUTSIDE`的触发条件更加奇葩,从字面上看,outside 意思不就是超出区域么?然而不论你如何滑动超出控件区域都不会触发 `ACTION_OUTSIDE` 这个事件。相信很多魔法师都对此很是疑惑,说好的超出区域呢? + +实际上这个事件根本就不是在这里用的,看官方解释(装一下逼): + +>  A movement has happened outside of the normal bounds of the UI element. This does not provide a full gesture, but only the initial location of the movement/touch. +> +> 一个触摸事件已经发生了UI元素的正常范围之外。因此不再提供完整的手势,只提供 运动/触摸 的初始位置。 + +我们知道,正常情况下,如果初始点击位置在该视图区域之外,该视图根本不可能会收到事件,然而,万事万物都不是绝对的,肯定还有一些特殊情况,你可曾还记得点击 Dialog 区域外关闭吗?Dialog 就是一个特殊的视图(没有占满屏幕大小的窗口),能够接收到视图区域外的事件(虽然在通常情况下你根本用不到这个事件),除了 Dialog 之外,你最可能看到这个事件的场景是悬浮窗,当然啦,想要接收到视图之外的事件需要一些特殊的设置。 + +> 设置视图的 WindowManager 布局参数的 flags为[`FLAG_WATCH_OUTSIDE_TOUCH`](http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_WATCH_OUTSIDE_TOUCH),这样点击事件发生在这个视图之外时,该视图就可以接收到一个 `ACTION_OUTSIDE` 事件。 +> +> 参见StackOverflow:[How to dismiss the dialog with click on outside of the dialog?](http://stackoverflow.com/questions/8384067/how-to-dismiss-the-dialog-with-click-on-outside-of-the-dialog) + +由于这个事件用到的几率比较小,此处就不展开叙述了,以后用到的时候再详细讲解。 + + + +## 多点触控 + +Android 在 2.2 版本的时候开始支持多点触控,一旦出现了多点触控,很多东西就突然之间变得麻烦起来了,首先要解决的问题就是 **多个手指同时按在屏幕上,会产生很多的事件,这些事件该如何区分呢?** + +为了区分这些事件,工程师们用了一个很简单的办法--**编号,当手指第一次按下时产生一个唯一的号码,手指抬起或者事件被拦截就回收编号,就这么简单。** + +**第一次按下的手指特殊处理作为主指针,之后按下的手指作为辅助指针**,然后随之衍生出来了以下事件(注意增加的事件和事件简介的变化): + +| 事件 | 简介 | +| --------------------------- | ------------------------------ | +| ACTION_DOWN | **第一个** 手指 **初次接触到屏幕** 时触发。 | +| ACTION_MOVE | 手指 **在屏幕上滑动** 时触发,会多次触发。 | +| ACTION_UP | **最后一个** 手指 **离开屏幕** 时触发。 | +| **ACTION_POINTER_DOWN** | 有非主要的手指按下(**即按下之前已经有手指在屏幕上**)。 | +| **ACTION_POINTER_UP** | 有非主要的手指抬起(**即抬起之后仍然有手指在屏幕上**)。 | +| 以下事件类型不推荐使用 | ------------------ | +| ~~ACTION_POINTER\_1\_DOWN~~ | 第 2 个手指按下,已废弃,不推荐使用。 | +| ~~ACTION_POINTER\_2\_DOWN~~ | 第 3 个手指按下,已废弃,不推荐使用。 | +| ~~ACTION_POINTER\_3\_DOWN~~ | 第 4 个手指按下,已废弃,不推荐使用。 | +| ~~ACTION_POINTER\_1\_UP~~ | 第 2 个手指抬起,已废弃,不推荐使用。 | +| ~~ACTION_POINTER\_2\_UP~~ | 第 3 个手指抬起,已废弃,不推荐使用。 | +| ~~ACTION_POINTER\_3\_UP~~ | 第 4 个手指抬起,已废弃,不推荐使用。 | + +和以下方法: + +| 方法 | 简介 | +| ------------------------------- | ---------------------------------------- | +| getActionMasked() | 与 `getAction()` 类似,**多点触控必须使用这个方法获取事件类型**。 | +| getActionIndex() | 获取该事件是哪个指针(手指)产生的。 | +| getPointerCount() | 获取在屏幕上手指的个数。 | +| getPointerId(int pointerIndex) | 获取一个指针(手指)的唯一标识符ID,在手指按下和抬起之间ID始终不变。 | +| findPointerIndex(int pointerId) | 通过PointerId获取到当前状态下PointIndex,之后通过PointIndex获取其他内容。 | +| getX(int pointerIndex) | 获取某一个指针(手指)的X坐标 | +| getY(int pointerIndex) | 获取某一个指针(手指)的Y坐标 | + +由于多点触控部分涉及内容比较多,也很复杂,我准备单独用一篇文章进行详细叙述,所以这里只叙述一些基础的内容作为铺垫: + +### getAction() 与 getActionMasked() + +当多个手指在屏幕上按下的时候,会产生大量的事件,如何在获取事件类型的同时区分这些事件就是一个大问题了。 + +一般来说我们可以通过为事件添加一个int类型的index属性来区分,但是我们知道谷歌工程师是有洁癖的(在 [自定义View分类与流程][customview/CustomViewProcess] 的onMeasure中已经见识过了),为了添加一个通常数值不会超过10的index属性就浪费一个int大小的空间简直是不能忍受的,于是工程师们将这个index属性和事件类型直接合并了。 + +int类型共32位(0x00000000),他们用最低8位(0x000000**ff**)表示事件类型,再往前的8位(0x0000**ff**00)表示事件编号,以手指按下为例讲解数值是如何合成的: + +> ACTION_DOWN 的默认数值为 (0x00000000) +> ACTION_POINTER_DOWN 的默认数值为 (0x00000005) + +| 手指按下 | 触发事件(数值) | +| :-----: | :--------------------------------------- | +| 第1个手指按下 | ACTION_DOWN (0x0000**00**00) | +| 第2个手指按下 | ACTION_POINTER_DOWN (0x0000**01**05) | +| 第3个手指按下 | ACTION_POINTER_DOWN (0x0000**02**05) | +| 第4个手指按下 | ACTION_POINTER_DOWN (0x0000**03**05) | + +**注意:** +上面表格中用粗体标示出的数值,可以看到随着按下手指数量的增加,这个数值也是一直变化的,进而导致我们使用 `getAction()` 获取到的数值无法与标准的事件类型进行对比,为了解决这个问题,他们创建了一个 `getActionMasked()` 方法,这个方法可以清除index数值,让其变成一个标准的事件类型。 +**1、多点触控时必须使用 `getActionMasked()` 来获取事件类型。** +**2、单点触控时由于事件数值不变,使用 `getAction()` 和 `getActionMasked()` 两个方法都可以。** +**3、使用 getActionIndex() 可以获取到这个index数值。不过请注意,getActionIndex() 只在 down 和 up 时有效,move 时是无效的。** + +### PointId + +虽然前面刚刚说了一个 actionIndex,可以使用 getActionIndex() 获得,但通过 actionIndex 字面意思知道,这个只表示事件的序号,而且根据其说明文档解释,这个 ActionIndex 只有在手指按下(down)和抬起(up)时是有用的,在移动(move)时是没有用的,事件追踪非常重要的一环就是移动(move),然而它却没卵用,这也太不实在了 ( ̄Д ̄)ノ + +**郑重声明:追踪事件流,请认准 PointId,这是唯一官方指定标准,不要相信 ActionIndex 那个小婊砸。** + +PointId 在手指按下时产生,手指抬起或者事件被取消后消失,是一个事件流程中唯一不变的标识,可以在手指按下时 通过 `getPointerId(int pointerIndex)` 获得。 (参数中的 pointerIndex 就是 actionIndex) + +关于事件流的追踪等问题在讲解多点触控时再详细讲解。 + + + +## 历史数据(批处理) + +由于我们的设备非常灵敏,手指稍微移动一下就会产生一个移动事件,所以移动事件会产生的特别频繁,为了提高效率,设计师会将近期的多个移动事件(move)按照事件发生的顺序进行排序打包放在同一个 MotionEvent 中,与之对应的产生了以下方法: + +| 事件 | 简介 | +| --------------------------------- | ---------------------------------------- | +| getHistorySize() | 获取历史事件集合大小 | +| getHistoricalX(int pos) | 获取第pos个历史事件x坐标
(pos < getHistorySize()) | +| getHistoricalY(int pos) | 获取第pos个历史事件y坐标
(pos < getHistorySize()) | +| getHistoricalX (int pin, int pos) | 获取第pin个手指的第pos个历史事件x坐标
(pin < getPointerCount(), pos < getHistorySize() ) | +| getHistoricalY (int pin, int pos) | 获取第pin个手指的第pos个历史事件y坐标
(pin < getPointerCount(), pos < getHistorySize() ) | + +**注意:** + +1. pin 全称是 pointerIndex,表示第几个手指,此处为了节省空间使用了缩写。 +2. 历史数据只有 ACTION_MOVE 事件。 +3. 历史数据单点触控和多点触控均可以用。 + +下面是官方文档给出的一个简单使用示例: + +```java +void printSamples(MotionEvent ev) { + final int historySize = ev.getHistorySize(); + final int pointerCount = ev.getPointerCount(); + for (int h = 0; h < historySize; h++) { + System.out.printf("At time %d:", ev.getHistoricalEventTime(h)); + for (int p = 0; p < pointerCount; p++) { + System.out.printf(" pointer %d: (%f,%f)", + ev.getPointerId(p), ev.getHistoricalX(p, h), ev.getHistoricalY(p, h)); + } + } + System.out.printf("At time %d:", ev.getEventTime()); + for (int p = 0; p < pointerCount; p++) { + System.out.printf(" pointer %d: (%f,%f)", + ev.getPointerId(p), ev.getX(p), ev.getY(p)); + } +} +``` + + + + + +## 鼠标事件 + +由于触控笔事件和手指事件处理流程大致相同,所以就不讲解了,这里讲解一下与鼠标相关的几个事件: + +| 事件 | 简介 | +| ------------------ | ---------------------------------------- | +| ACTION_HOVER_ENTER | 指针移入到窗口或者View区域,但没有按下。 | +| ACTION_HOVER_MOVE | 指针在窗口或者View区域移动,但没有按下。 | +| ACTION_HOVER_EXIT | 指针移出到窗口或者View区域,但没有按下。 | +| ACTION_SCROLL | 滚轮滚动,可以触发水平滚动(AXIS_HSCROLL)或者垂直滚动(AXIS_VSCROLL) | + +注意: + +1、这些事件类型是 安卓4.0 (API 14) 才添加的。 +2、使用 ` getActionMasked()` 获得这些事件类型。 +3、这些事件不会传递到 [onTouchEvent(MotionEvent)](https://developer.android.com/reference/android/view/View.html#onTouchEvent(android.view.MotionEvent)) 而是传递到 [onGenericMotionEvent(MotionEvent)](https://developer.android.com/reference/android/view/View.html#onGenericMotionEvent(android.view.MotionEvent)) 。 + + + +## 输入设备类型判断 + +输入设备类型判断也是安卓4.0 (API 14) 才添加的,主要包括以下几种设备: + +| 设备类型 | 简介 | +| ----------------- | ---- | +| TOOL_TYPE_ERASER | 橡皮擦 | +| TOOL_TYPE_FINGER | 手指 | +| TOOL_TYPE_MOUSE | 鼠标 | +| TOOL_TYPE_STYLUS | 手写笔 | +| TOOL_TYPE_UNKNOWN | 未知类型 | + +**使用 `getToolType(int pointerIndex)` 来获取对应的输入设备类型,pointIndex可以为0,但必须小于 `getPointerCount()`。** + + + +## 总结 + +虽然本文标题是 MotionEvent 详解,但由于 MotionEvent 实在太庞大了,本文只能涉及一些比较常用的内容,某些不太常用的内容就在以后用到的时候再详细介绍吧,像游戏手柄等输入设备由于我暂时不做游戏开发,也没有过多了解,所以就不介绍给大家啦。 + +由于个人水平有限,文章中可能会出现错误,如果你觉得哪一部分有错误,或者发现了错别字等内容,欢迎在评论区告诉我,另外,据说关注 [作者微博](http://weibo.com/GcsSloop) 不仅能第一时间收到新文章消息,还能变帅哦。 + + + +## 参考资料 + +[MotionEvent ](https://developer.android.com/reference/android/view/MotionEvent.html) +[Android MotionEvent详解](http://www.jianshu.com/p/0c863bbde8eb) + + + +## About Me + +### 作者微博: @GcsSloop + + + + + +[customview/CoordinateSystem]: http://www.gcssloop.com/customview/CoordinateSystem "安卓自定义View基础-坐标系" +[customview/CustomViewProcess]: http://www.gcssloop.com/customview/CustomViewProcess "安卓自定义View进阶-分类与流程" +[customview/dispatch-touchevent-theory]: http://www.gcssloop.com/customview/dispatch-touchevent-theory "安卓自定义View进阶-事件分发机制原理" +[customview/dispatch-touchevent-source]: http://www.gcssloop.com/customview/dispatch-touchevent-source "安卓自定义View进阶-事件分发机制详解" \ No newline at end of file From 6bde98d0373d39ec3cc99776a1c9fbe9a2508d36 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 3 Nov 2016 23:17:59 +0800 Subject: [PATCH 483/615] Update --- CustomView/Advance/[16]MotionEvent.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[16]MotionEvent.md b/CustomView/Advance/[16]MotionEvent.md index 8d0548d2..5be26dd8 100644 --- a/CustomView/Advance/[16]MotionEvent.md +++ b/CustomView/Advance/[16]MotionEvent.md @@ -202,7 +202,7 @@ PointId 在手指按下时产生,手指抬起或者事件被取消后消失, ## 历史数据(批处理) -由于我们的设备非常灵敏,手指稍微移动一下就会产生一个移动事件,所以移动事件会产生的特别频繁,为了提高效率,设计师会将近期的多个移动事件(move)按照事件发生的顺序进行排序打包放在同一个 MotionEvent 中,与之对应的产生了以下方法: +由于我们的设备非常灵敏,手指稍微移动一下就会产生一个移动事件,所以移动事件会产生的特别频繁,为了提高效率,系统会将近期的多个移动事件(move)按照事件发生的顺序进行排序打包放在同一个 MotionEvent 中,与之对应的产生了以下方法: | 事件 | 简介 | | --------------------------------- | ---------------------------------------- | From a8ac3aa01490cf5fbd1fa4032913aeefb5cc842c Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 4 Nov 2016 17:12:41 +0800 Subject: [PATCH 484/615] Update --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 176fc41d..6449598c 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ * [安卓自定义View进阶 - Matrix Camera](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B11%5DMatrix_3D_Camera.md) * [安卓自定义View进阶 - 事件分发机制原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B12%5DDispatch-TouchEvent-Theory.md) * [安卓自定义View进阶 - 事件分发机制详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B15%5DDispatch-TouchEvent-Source.md) + * [安卓自定义View进阶 - MotionEvent 详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B16%5DMotionEvent.md) + ****** From 7d37cb7fcd2daebd4e7afec4a00288be6e1050bf Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 4 Nov 2016 17:14:17 +0800 Subject: [PATCH 485/615] Update --- CustomView/Advance/[16]MotionEvent.md | 69 +++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[16]MotionEvent.md b/CustomView/Advance/[16]MotionEvent.md index 5be26dd8..6daca725 100644 --- a/CustomView/Advance/[16]MotionEvent.md +++ b/CustomView/Advance/[16]MotionEvent.md @@ -1,4 +1,4 @@ -# Android MotionEvent 详解 +# MotionEvent 详解 Android MotionEvent 详解,之前用了两篇文章 [事件分发机制原理][customview/dispatch-touchevent-theory] 和 [事件分发机制详解][customview/dispatch-touchevent-source] 来讲解事件分发,而作为事件分发主角之一的 MotionEvent 并没有过多的说明,本文就带大家了解 MotionEvent 的相关内容,简要介绍触摸事件,主要包括 单点触控、多点触控、鼠标事件 以及 getAction() 和 getActionMasked() 的区别。 @@ -47,8 +47,8 @@ MotionEvent 负责集中处理所有类型设备的输入事件,但是由于 **手指落下(ACTION_DOWN) -> 多次移动(ACTION_MOVE) -> 离开(ACTION_UP)** -> - 本次事例中 ACTION_MOVE 有多次触发。 -> - 如果仅仅是单击(手指按下再抬起),不会触发 ACTION_MOVE。 +> * 本次事例中 ACTION_MOVE 有多次触发。 +> * 如果仅仅是单击(手指按下再抬起),不会触发 ACTION_MOVE。 ![单点触摸事件流程](http://ww4.sinaimg.cn/large/005Xtdi2jw1f8oz1704ylg30bo0jqgmx.gif) @@ -84,6 +84,8 @@ public boolean onTouchEvent(MotionEvent event) { 但其中有两个比较特殊的事件: `ACTION_CANCEL` 和 `ACTION_OUTSIDE` 。 为什么说特殊呢,因为它们是由程序触发而产生的,而且触发条件也非常特殊,通常情况下即便不处理这两个事件也没有什么问题。接下来我们就扒一扒它们的真面目: + + ### ACTION_CANCEL **`ACTION_CANCEL` 的触发条件是事件被上层拦截**,然而我们在 [事件分发机制原理][customview/dispatch-touchevent-theory] 一文中了解到当事件被上层 View 拦截的时候,ChildView 是收不到任何事件的,ChildView 收不到任何事件,自然也不会收到 `ACTION_CANCEL` 了,所以说这个 `ACTION_CANCEL` 的正确触发条件并不是这样,那么是什么呢? @@ -188,6 +190,21 @@ int类型共32位(0x00000000),他们用最低8位(0x000000**ff**)表示事件 **2、单点触控时由于事件数值不变,使用 `getAction()` 和 `getActionMasked()` 两个方法都可以。** **3、使用 getActionIndex() 可以获取到这个index数值。不过请注意,getActionIndex() 只在 down 和 up 时有效,move 时是无效的。** +目前来说获取事件类型使用 `getActionMasked()` 就行了,但是如果一定要编译时兼容古董版本的话,可以考虑使用这样的写法: + +```java +final int action = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) + ? event.getActionMasked() + : event.getAction(); +switch (action){ + case MotionEvent.ACTION_DOWN: + // TODO + break; +} +``` + + + ### PointId 虽然前面刚刚说了一个 actionIndex,可以使用 getActionIndex() 获得,但通过 actionIndex 字面意思知道,这个只表示事件的序号,而且根据其说明文档解释,这个 ActionIndex 只有在手指按下(down)和抬起(up)时是有用的,在移动(move)时是没有用的,事件追踪非常重要的一环就是移动(move),然而它却没卵用,这也太不实在了 ( ̄Д ̄)ノ @@ -241,6 +258,50 @@ void printSamples(MotionEvent ev) { +## 获取事件发生的时间 + +获取事件发生的时间。 + +| 方法 | 简介 | +| ------------------------------- | ------------ | +| getDownTime() | 获取手指按下时的时间。 | +| getEventTime() | 获取当前事件发生的时间。 | +| getHistoricalEventTime(int pos) | 获取历史事件发生的时间。 | + +> 1. pos 表示历史数据中的第几个数据。( pos < getHistorySize() ) +> 2. 返回值类型为 long,单位是毫秒。 + +## 获取压力(接触面积大小) + +MotionEvent支持获取某些输入设备(手指或触控笔)的与屏幕的接触面积和压力大小,主要有以下方法: + +> 描述中使用了手指,触控笔也是一样的。 + +| 方法 | 简介 | +| ---------------------------------------- | ---------------------------- | +| getSize () | 获取第1个手指与屏幕接触面积的大小 | +| getSize (int pin) | 获取第pin个手指与屏幕接触面积的大小 | +| getHistoricalSize (int pos) | 获取历史数据中第1个手指在第pos次事件中的接触面积 | +| getHistoricalSize (int pin, int pos) | 获取历史数据中第pin个手指在第pos次事件中的接触面积 | +| getPressure () | 获取第一个手指的压力大小 | +| getPressure (int pin) | 获取第pin个手指的压力大小 | +| getHistoricalPressure (int pos) | 获取历史数据中第1个手指在第pos次事件中的压力大小 | +| getHistoricalPressure (int pin, int pos) | 获取历史数据中第pin个手指在第pos次事件中的压力大小 | + +> 1. pin 全称是 pointerIndex,表示第几个手指。(pin < getPointerCount() ) +> 2. pos 表示历史数据中的第几个数据。( pos < getHistorySize() ) + +**注意:** + +**1、获取接触面积大小和获取压力大小是需要硬件支持的。** +**2、非常不幸的是大部分设备所使用的电容屏不支持压力检测,但能够大致检测出接触面积。** +**3、大部分设备的 `getPressure()` 是使用接触面积来模拟的。** +**4、由于某些未知的原因(可能系统版本和硬件问题),某些设备不支持该方法。** + +我用不同的设备对这两个方法进行了测试,然而不同设备测试出来的结果不相同,之后经过我多方查证,发现是系统问题,有的设备上只有 `getSize()` 能用,有的设备上只有 `getPressure()` 能用,而有的则两个都不能用。 + +**由于获取接触面积和获取压力大小受系统和硬件影响,使用的时候一定要进行数据检测,以防因为设备问题而导致程序出错。** + ## 鼠标事件 @@ -304,4 +365,4 @@ void printSamples(MotionEvent ev) { [customview/CoordinateSystem]: http://www.gcssloop.com/customview/CoordinateSystem "安卓自定义View基础-坐标系" [customview/CustomViewProcess]: http://www.gcssloop.com/customview/CustomViewProcess "安卓自定义View进阶-分类与流程" [customview/dispatch-touchevent-theory]: http://www.gcssloop.com/customview/dispatch-touchevent-theory "安卓自定义View进阶-事件分发机制原理" -[customview/dispatch-touchevent-source]: http://www.gcssloop.com/customview/dispatch-touchevent-source "安卓自定义View进阶-事件分发机制详解" \ No newline at end of file +[customview/dispatch-touchevent-source]: http://www.gcssloop.com/customview/dispatch-touchevent-source "安卓自定义View进阶-事件分发机制详解" From dce067e8c1cfc664ae06c627213e8703dd602fb6 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 4 Nov 2016 17:15:37 +0800 Subject: [PATCH 486/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6449598c..650392c4 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ * [安卓自定义View进阶 - Matrix Camera](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B11%5DMatrix_3D_Camera.md) * [安卓自定义View进阶 - 事件分发机制原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B12%5DDispatch-TouchEvent-Theory.md) * [安卓自定义View进阶 - 事件分发机制详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B15%5DDispatch-TouchEvent-Source.md) - * [安卓自定义View进阶 - MotionEvent 详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B16%5DMotionEvent.md) + * [安卓自定义View进阶 - MotionEvent详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B16%5DMotionEvent.md) ****** From bfbab13bc7789d4a36324e1277397ac3454f9118 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 5 Nov 2016 22:18:34 +0800 Subject: [PATCH 487/615] Update --- CustomView/Advance/[16]MotionEvent.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[16]MotionEvent.md b/CustomView/Advance/[16]MotionEvent.md index 6daca725..94c9c8f1 100644 --- a/CustomView/Advance/[16]MotionEvent.md +++ b/CustomView/Advance/[16]MotionEvent.md @@ -92,7 +92,7 @@ public boolean onTouchEvent(MotionEvent event) { **事实上,只有上层 View 回收事件处理权的时候,ChildView 才会收到一个 `ACTION_CANCEL` 事件。** -这样说可能不太容易不理解,咱举个例子? +这样说可能不太容易理解,咱举个例子? ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f9auctayt4j302s03o744.jpg) From 3c5658053b304e9db3cfe5b54b1764590c3fe064 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 6 Nov 2016 23:10:49 +0800 Subject: [PATCH 488/615] Update --- CustomView/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CustomView/README.md b/CustomView/README.md index 664ace01..cb873f7d 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -47,6 +47,7 @@

+

### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From 0739442b436c5d99ff42893f3615c90e30f78e77 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 7 Nov 2016 23:08:14 +0800 Subject: [PATCH 489/615] Update --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 650392c4..41cb0496 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,9 @@ * [优雅的发布Android开源库(论JitPack的优越性)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/ReleaseLibraryByJitPack.md) * [用JitPack发布时附加文档和源码](https://github.com/GcsSloop/AndroidNote/blob/master/Course/jitpack-javadoc.md) ------- +****** + +## Markdown * [Markdown 快速入门](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-start.md) * [Markdown 基础语法](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-grammar.md) From 601741899d1982afe7d7a0a855a828c057550f1b Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 8 Nov 2016 04:01:45 +0800 Subject: [PATCH 490/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 41cb0496..5ac46879 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ > #### PS:点击分类标题可以查看该分类的详细信息。 -## [博客](http://www.gcssloop.com/#blog) +## [博客](http://www.gcssloop.com/#blog "GcsSloop的博客") 新开的博客,在博客中可以获得更好的阅读体验,同时在博客的评论区可以更及时的向我反馈文章中的问题。 From e50525389b803bf72a5ffa1d61e7bc41f7479510 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 8 Nov 2016 13:31:40 +0800 Subject: [PATCH 491/615] Update --- CustomView/Advance/Code/SearchView.java | 44 +++++++++++++++---------- CustomView/Advance/Code/SearchView.md | 44 +++++++++++++++---------- 2 files changed, 54 insertions(+), 34 deletions(-) diff --git a/CustomView/Advance/Code/SearchView.java b/CustomView/Advance/Code/SearchView.java index 8f3a3a23..c6ee6262 100644 --- a/CustomView/Advance/Code/SearchView.java +++ b/CustomView/Advance/Code/SearchView.java @@ -16,6 +16,33 @@ public class SearchView extends View { private int mViewWidth; private int mViewHeight; + public SearchView(Context context) { + this(context,null); + } + + public SearchView(Context context, AttributeSet attrs) { + super(context, attrs); + initAll(); + } + + public void initAll() { + + initPaint(); + + initPath(); + + initListener(); + + initHandler(); + + initAnimator(); + + // 进入开始动画 + mCurrentState = State.STARTING; + mStartingAnimator.start(); + + } + // 这个视图拥有的状态 public static enum State { NONE, @@ -57,24 +84,7 @@ public static enum State { private int count = 0; - public SearchView(Context context) { - super(context); - - initPaint(); - - initPath(); - - initListener(); - initHandler(); - - initAnimator(); - - // 进入开始动画 - mCurrentState = State.STARTING; - mStartingAnimator.start(); - - } private void initPaint() { mPaint = new Paint(); diff --git a/CustomView/Advance/Code/SearchView.md b/CustomView/Advance/Code/SearchView.md index 19d404a3..311df8e3 100644 --- a/CustomView/Advance/Code/SearchView.md +++ b/CustomView/Advance/Code/SearchView.md @@ -21,6 +21,33 @@ public class SearchView extends View { private int mViewWidth; private int mViewHeight; + public SearchView(Context context) { + this(context,null); + } + + public SearchView(Context context, AttributeSet attrs) { + super(context, attrs); + initAll(); + } + + public void initAll() { + + initPaint(); + + initPath(); + + initListener(); + + initHandler(); + + initAnimator(); + + // 进入开始动画 + mCurrentState = State.STARTING; + mStartingAnimator.start(); + + } + // 这个视图拥有的状态 public static enum State { NONE, @@ -62,24 +89,7 @@ public class SearchView extends View { private int count = 0; - public SearchView(Context context) { - super(context); - - initPaint(); - - initPath(); - - initListener(); - initHandler(); - - initAnimator(); - - // 进入开始动画 - mCurrentState = State.STARTING; - mStartingAnimator.start(); - - } private void initPaint() { mPaint = new Paint(); From 77ed21e10a284c16bb8198e4f93b5a0585072392 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 9 Nov 2016 22:45:55 +0800 Subject: [PATCH 492/615] Update --- Course/Markdown/markdown-link.md | 189 ++++++++++++++++++++++++++++++- 1 file changed, 188 insertions(+), 1 deletion(-) diff --git a/Course/Markdown/markdown-link.md b/Course/Markdown/markdown-link.md index 7d82df34..265575ec 100644 --- a/Course/Markdown/markdown-link.md +++ b/Course/Markdown/markdown-link.md @@ -1 +1,188 @@ -# Markdown +# Markdown实用技巧-链接和图片 + +Sloop 喝过半杯咖啡,涨红的脸色渐渐复了原,旁人便又问道,“ Sloop,你当真会写文章么?” Sloop 看着问他的人,显出不屑置辩的神气。他们便接着说道,“你怎的连半个赞也捞不到呢?” Sloop 立刻显出颓唐不安模样,脸上笼上了一层灰色,嘴里说些话;这回可是全是技术名词之类,一些不懂了。在这时候,众人也都哄笑起来:办公室内外充满了快活的空气。 + +在这些时候,我可以附和着笑,老板是决不责备的。而且老板见了 Sloop,也每每这样问他,引人发笑。Sloop 自己知道不能和他们谈天,便只好向实习生说话。有一回对我说道,“你会用 Markdown 么?” 我略略点一点头。他说,“会用 Markdown,……我便考你一考。Markdown 的链接,你是怎样写的?” 我想,码农一样的人,也配考我么?便回过脸去,不再理会。Sloop 等了许久,很恳切的说道,“不能写罢?……我教给你,记着!这些写法应该记着。将来做程序员的时候,写文档要用。”我暗想我和程序员的等级还很远呢,而且我们这里的程序员也从不写文档;又好笑,又不耐烦,懒懒的答他道,“谁要你教,不是一对方括号后面跟一对圆括号么?” Sloop 显出极高兴的样子,将两个指头的长指甲敲着电脑,点头说,“对呀对呀!……链接有4样基本写法,你知道么?” 我愈不耐烦了,努着嘴走远。Sloop 刚想打开编辑器,给我演示,见我毫不热心,便又叹一口气,显出极惋惜的样子。 + +***** + +## 前言 + +**本文是适用于对 Markdown 有一定了解的魔法师,以帮助他们挖掘更多关于 Markdown 的可能性,例如:链接的不同类型以及使用方式,如何在新标签页打开链接,如何控制图片大小等,对 Markdown 还不了解的魔法师请参考 [Markdown快速入门][markdown-start] 和 [Markdown基础语法][markdown-grammar] 。** + +**注意:以下的部分语法不属于标准语法,存在不兼容的问题,不能保证所有平台都能够使用。对于非标准语法(拓展语法)我会进行标注说明。** + +***** + +## 行内式链接: + +```markdown +博客地址: [GcsSloop](http://www.gcssloop.com) +博客地址: [GcsSloop](http://www.gcssloop.com "GcsSloop的博客") +``` + +博客地址: [GcsSloop](http://www.gcssloop.com) +博客地址: [GcsSloop](http://www.gcssloop.com "GcsSloop的博客") + +***** + +## 参考式链接: + +```markdown +[GcsSloop的博客][gcssloop] + +[gcssloop]: http://www.gcssloop.com +// 或者 +[gcssloop]: http://www.gcssloop.com "点击访问GcsSloop的博客" +``` + +[GcsSloop的博客][gcssloop] + +**为什么要使用参考式呢?** +在写文章的时候很可能会在文章不同的地方引用同一篇文章,使用参考式可以少写一点字符。 +更重要的是,参考文章的链接可能会改变,如果将参考链接统一写在文末的话,改起来会更容易。 + +***** + +## 自动链接: + +```markdown + +``` + + + +***** + +## 相对链接: + +**如果你的内容是发布在 GitHub 或者自己的个人网站上,那么相对链接是一个很好用的东西**,例如引用本站的一张图片可以这样写: + +```markdown +![头像](/assets/siteinfo/avatar.jpg) +``` + +![头像](/assets/siteinfo/avatar.jpg) + +**相对链接优点:** + +* 线下预览和线上效果相同,不受网络影响。 +* 避免了分别上传图片导致的麻烦。 +* GitHub复制仓库更方便,改仓库名字不会导致资源链接失效。 + +**相对链接缺点:** + +* 不适用于需要在多平台发布的文章。 +* 某些本地编辑器不支持读取相对链接。 + +***** + +## 图片链接: + +图片链接其实就是把图片和链接嵌套在一起: + +> 顺便为 DiyCode 打一个小广告,欢迎更多小伙伴的加入。 + +```markdown +[![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f9e6ii0bsgj30xc04gaau.jpg)](http://www.diycode.cc/wiki/encouragement) +``` + +[![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f9e6ii0bsgj30xc04gaau.jpg)](http://www.diycode.cc/wiki/encouragement){:target="_blank"} + +***** + +**注意:从这里开始往下的部分,属于拓展语法,可能存在某些平台(编辑器)无法识别的问题,请亲自测试后再使用。** + +## 在新标签页打开: + +Markdown 的默认链接方式都是在当前标签页打开的,这就会导致打开链接之后原始页面被覆盖掉,如果想要让链接在新标签页打开可以在后面添加上 `{:target="_blank"}` 或者使用 HTML 语法。 + +``` +[GcsSloop](http://www.gcssloop.com){:target="_blank"} + +[GcsSloop的博客][gcssloop]{:target="_blank"} + +{:target="_blank"} + +关于GcsSloop +``` + +[GcsSloop](http://www.gcssloop.com){:target="_blank"}
+[GcsSloop的博客][gcssloop]{:target="_blank"}
+{:target="_blank"}
+关于GcsSloop + +注意: 部分平台可能不识别 `{:target="_blank"}` 标签,例如你正在看的这个 GitHub 就不识别。。 + +***** + +## 注释(脚注): + +注释一般用于解释一些专业名词或者难以理解的内容,由于注释的解释部分一般放在文末,所以又称为脚注: + +``` +GcsSloop[^1]是一个超级魔法师[^2] 。 + +[^1]: GcsSloop:非著名程序员。 +[^2]: 魔法师:会魔法的人类 +``` + +GcsSloop[^1]是一个超级魔法师[^2] 。 + +注意:脚注不论在何处定义,最终都是显示在文末。部分平台不识别该语法。 + +***** + +## 控制图片大小 + +使用 `{:width="300" height="100"}` 或者 HTML 格式可以控制图片显示大小,图片有宽度(width)和高度(height)两个属性,如果只指定了一个,另一个会按照比例缩放。 + +``` +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f9k7b8a6vmj312w0rg143.jpg){:width="300"} + + +``` + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f9k7b8a6vmj312w0rg143.jpg){:width="300"} + +右键,新标签页打开图片,你会发现原图其实挺大的。 +注意: 部分平台可能不识别 `{:width="300" height="100"}` 标签,你正在看的这个 GitHub 依旧不识别。 + +***** + +## 总结: + +Markdown 存在很多的变种,对其语法进行了不同程度的拓展,使其更加的强大,但是使用拓展语法之前请三思。个人建议如下: + +* 如果文章(文档)只在单一平台发布,使用任何该平台支持的拓展语法都没问题。 +* 如果文章(文档)需要在多个平台发布,尽量使用标准语法,使用拓展语法之前请注意测试平台兼容性。 +* 图片尽量使用图床管理,而且要进行本地备份。 + + +***** + +## About Me + +### 作者微博: @GcsSloop + + + +## 参考链接: + +[Markdown-基础语法](http://www.markdown.cn/) +[Markdown语法:在新窗口新标签页中打开](http://yinping4256.github.io/cn/Markdown%E8%AF%AD%E6%B3%95%E5%9C%A8%E6%96%B0%E7%AA%97%E5%8F%A3%E6%96%B0%E6%A0%87%E7%AD%BE%E9%A1%B5%E4%B8%AD%E6%89%93%E5%BC%80/) + + +### 注释: + +[^1]: GcsSloop:非著名程序员。 +[^2]: 魔法师:会魔法的人类 + + + + +[markdown-start]: http://www.gcssloop.com/markdown/markdown-star "Markdown实用技巧-快速入门" + +[markdown-grammar]: http://www.gcssloop.com/markdown/markdown-grammar "Markdown实用技巧-基础语法" + +[gcssloop]: http://www.gcssloop.com "点击访问GcsSloop的博客" From 5a2c379d45ccbe8dadbdc03ffbfe83fa276aee3d Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 9 Nov 2016 22:48:19 +0800 Subject: [PATCH 493/615] Update --- Course/Markdown/markdown-link.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Course/Markdown/markdown-link.md b/Course/Markdown/markdown-link.md index 265575ec..05e2a57e 100644 --- a/Course/Markdown/markdown-link.md +++ b/Course/Markdown/markdown-link.md @@ -91,8 +91,12 @@ Sloop 喝过半杯咖啡,涨红的脸色渐渐复了原,旁人便又问道 ***** +IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII + **注意:从这里开始往下的部分,属于拓展语法,可能存在某些平台(编辑器)无法识别的问题,请亲自测试后再使用。** +IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII + ## 在新标签页打开: Markdown 的默认链接方式都是在当前标签页打开的,这就会导致打开链接之后原始页面被覆盖掉,如果想要让链接在新标签页打开可以在后面添加上 `{:target="_blank"}` 或者使用 HTML 语法。 From db0d1ded31844ff636d3fbde72bc2b91a4d08fd7 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 9 Nov 2016 22:50:45 +0800 Subject: [PATCH 494/615] Update --- Course/Markdown/markdown-link.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Course/Markdown/markdown-link.md b/Course/Markdown/markdown-link.md index 05e2a57e..fdf47d57 100644 --- a/Course/Markdown/markdown-link.md +++ b/Course/Markdown/markdown-link.md @@ -133,7 +133,7 @@ GcsSloop[^1]是一个超级魔法师[^2] 。 GcsSloop[^1]是一个超级魔法师[^2] 。 -注意:脚注不论在何处定义,最终都是显示在文末。部分平台不识别该语法。 +注意:脚注不论在何处定义,最终都是显示在文末。部分平台不识别该语法,GitHub 依旧不识别。 ***** From 757db08821caccb118ad1f1fdd87819479618e43 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 10 Nov 2016 21:42:23 +0800 Subject: [PATCH 495/615] Update --- Course/Markdown/markdown-link.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Course/Markdown/markdown-link.md b/Course/Markdown/markdown-link.md index fdf47d57..5c3d40cc 100644 --- a/Course/Markdown/markdown-link.md +++ b/Course/Markdown/markdown-link.md @@ -1,5 +1,7 @@ # Markdown实用技巧-链接和图片 +博客地址: http://www.gcssloop.com/markdown/markdown-links + Sloop 喝过半杯咖啡,涨红的脸色渐渐复了原,旁人便又问道,“ Sloop,你当真会写文章么?” Sloop 看着问他的人,显出不屑置辩的神气。他们便接着说道,“你怎的连半个赞也捞不到呢?” Sloop 立刻显出颓唐不安模样,脸上笼上了一层灰色,嘴里说些话;这回可是全是技术名词之类,一些不懂了。在这时候,众人也都哄笑起来:办公室内外充满了快活的空气。 在这些时候,我可以附和着笑,老板是决不责备的。而且老板见了 Sloop,也每每这样问他,引人发笑。Sloop 自己知道不能和他们谈天,便只好向实习生说话。有一回对我说道,“你会用 Markdown 么?” 我略略点一点头。他说,“会用 Markdown,……我便考你一考。Markdown 的链接,你是怎样写的?” 我想,码农一样的人,也配考我么?便回过脸去,不再理会。Sloop 等了许久,很恳切的说道,“不能写罢?……我教给你,记着!这些写法应该记着。将来做程序员的时候,写文档要用。”我暗想我和程序员的等级还很远呢,而且我们这里的程序员也从不写文档;又好笑,又不耐烦,懒懒的答他道,“谁要你教,不是一对方括号后面跟一对圆括号么?” Sloop 显出极高兴的样子,将两个指头的长指甲敲着电脑,点头说,“对呀对呀!……链接有4样基本写法,你知道么?” 我愈不耐烦了,努着嘴走远。Sloop 刚想打开编辑器,给我演示,见我毫不热心,便又叹一口气,显出极惋惜的样子。 From c2fcb422d6121461c8152d0f58678434cf58fe33 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 14 Nov 2016 00:19:43 +0800 Subject: [PATCH 496/615] Update --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5ac46879..1ebb8588 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@

## [自定义View](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) - + * 基础篇 * [安卓自定义View基础 - 坐标系](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B01%5DCoordinateSystem.md) * [安卓自定义View基础 - 角度弧度](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Base/%5B02%5DAngleAndRadian.md) @@ -53,6 +53,7 @@ * [Markdown 快速入门](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-start.md) * [Markdown 基础语法](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-grammar.md) +* [Markdown 基础语法](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-grammar.md) ****** @@ -62,7 +63,7 @@ * [程序员不可不知的版权协议](https://github.com/GcsSloop/AndroidNote/blob/magic-world/ChaosCrystal/%E5%BC%80%E6%BA%90%E5%85%B1%E4%BA%AB%E5%8D%8F%E8%AE%AE.md) ****** - + ## [速查表](https://github.com/GcsSloop/AndroidNote/tree/master/QuickChart/README.md) * [Canvas常用操作速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Canvas.md) From 9fe13234466a2a0b2c21ce7736ed3c994b8a3cad Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 15 Nov 2016 00:25:45 +0800 Subject: [PATCH 497/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1ebb8588..85ac6cc0 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ * [Markdown 快速入门](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-start.md) * [Markdown 基础语法](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-grammar.md) -* [Markdown 基础语法](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-grammar.md) +* [Markdown 链接图片](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-link.md) ****** From 0130ee225e8befe8efab1669e04384acd79f79fc Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 16 Nov 2016 23:40:56 +0800 Subject: [PATCH 498/615] Update --- CustomView/Advance/[17]touch-matrix-region.md | 576 ++++++++++++++++++ 1 file changed, 576 insertions(+) create mode 100644 CustomView/Advance/[17]touch-matrix-region.md diff --git a/CustomView/Advance/[17]touch-matrix-region.md b/CustomView/Advance/[17]touch-matrix-region.md new file mode 100644 index 00000000..0803a838 --- /dev/null +++ b/CustomView/Advance/[17]touch-matrix-region.md @@ -0,0 +1,576 @@ +# 特殊控件的事件处理方案 + +本文带大家了解 Android 特殊形状控件的事件处理方式,主要是利用了 Region 和 Matrix 的一些方法,超级实用的事件处理方案,相信看完本篇之后,任何奇葩控件的事件处理都会变得十分简单。 + +不得不说,Android 对事件体系封装的非常棒,即便对事件体系不太了解的人,只要简单的调用方法就能使用,而且具有防呆设计,能够保证事件流的完整性和统一性,最大可能性的避免了事件处理的混乱,着实令人佩服。 + +然而世界上并没有绝对完美的东西,**当【事件处理】遇上【自定义View】,一场好戏就开演了,玩的好叫坐镇军前,指挥千军万马而分毫不乱,玩的不好就是抓耳挠腮,眼见敌人前后包抄而无可奈何。** + +## 特殊形状控件 + +在通常的情况下,自定义 View 直接使用系统的事件体系处理就行,我们也不需要特殊处理,然而当一些特殊的控件出现的时候,麻烦就来了,举个栗子: + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f9t9u0tignj308c08cq3f.jpg) + +这是一个在遥控器上非常常见的按键布局,注意中间上下左右选择的部分,看起来十分简单,然而当你真正准备在手机上实现的时候麻烦就出现了。因为所有的View默认都是矩形的,所以事件接收区域也是矩形的,如果直接使用系统提供的 View 来组合出一摸一样的布局也很简单,但点击区域该如何处理?显然这样有部分点击区域是在控件外面的,并且控件之间会产生重叠区域,点击的时候容易判断错误,例如: + +> 红色方框表示用 View 组合的情况下,单个 View 的可点击区域。 + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f9ta3eymeej308c08cwf1.jpg) + +当我们面对这样比较奇特的控件的时候,有很多处理办法,比较投机的一种就是背景贴一个静态图,按钮做成透明的,设置小一点,放在对应的位置,这样可以保证不会误触,当然了如果想要点击效果可以在按钮按下的时候更新一下背景图,这样虽然也可以,但可点击区域会变小,体验效果会变差。设计方案变得非常复杂,而且逻辑也不容易处理,可以说是一种非常糟糕的设计。 + +当然了,看了我这么多文章的小伙伴应该也猜到我接下来要说什么了,没错,就是自定义 View。当我们面对一些奇葩控件的时候,自定义 View 就变成了一种非常好用的处理方案。 + +相信小伙伴们看过 [前面的文章][CustomViewIndex] 之后,对各种图形的绘制已经不成问题了,所以我们直接处理重点问题。 + + + +## 特殊形状控的点击区域判断 + +要进行特殊形状的点击判断,要用到一个之前没有使用过的类:Region。 + +Region 直接翻译的意思是 地域,区域。**在此处应该是区域的意思**。它和 Path 有些类似,但 Path 可以是不封闭图形,而 Region 总是封闭的。可以通过 `setPath` 方法将 Path 转换为 Region。 + + **本文中我们重点要使用到的是 Region 中的 `contains` 方法,这个方法可以判断一个点是否包含在该区域内。** + +下面是一个简单的示例程序: + +```java +public class RegionClickView extends View { + Paint mPaint; + Region globalRegion; + Region circleRegion1; + Region circleRegion2; + Path circlePath1; + Path circlePath2; + + public RegionClickView(Context context) { + super(context); + + mPaint = new Paint(); + mPaint.setStyle(Paint.Style.FILL); + mPaint.setColor(Color.GRAY); + + // 用Path创建两个圆 + circlePath1 = new Path(); + circlePath2 = new Path(); + circlePath1.addCircle(100, 100, 50, Path.Direction.CW); + circlePath2.addCircle(400, 400, 50, Path.Direction.CW); + + // 创建 Region + circleRegion1 = new Region(); + circleRegion2 = new Region(); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + // 将剪裁边界设置为视图大小 + globalRegion = new Region(0, 0, w, h); + + // ▼将 Path 添加到 Region 中 + circleRegion1.setPath(circlePath1, globalRegion); + circleRegion2.setPath(circlePath2, globalRegion); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getAction()){ + case MotionEvent.ACTION_DOWN: + int x = (int) event.getX(); + int y = (int) event.getY(); + + // ▼点击区域判断 + if (circleRegion1.contains(x,y)){ + Toast.makeText(this.getContext(),"圆1被点击",Toast.LENGTH_SHORT).show(); + } + if (circleRegion2.contains(x,y)){ + Toast.makeText(this.getContext(),"圆2被点击",Toast.LENGTH_SHORT).show(); + } + break; + } + return super.onTouchEvent(event); + } + + @Override + protected void onDraw(Canvas canvas) { + // ▼注意此处将全局变量转化为局部变量,方便 GC 回收 Canvas + Path circle1 = circlePath1; + Path circle2 = circlePath2; + + // 绘制两个圆 + canvas.drawPath(circle1,mPaint); + canvas.drawPath(circle2,mPaint); + } +} +``` + +> 代码中比较重要的内容都用 ▼ 符号标记出来了。 + +上述代码非常简单,就是创建了两个 Path,在 Path 中添加圆形,之后将 Path 设置到 Region 中,当手指在屏幕上按下的时候判断手指按下位置是否在 Region 区域内。 + +代码整体逻辑非常简单,大家测试一下就行了。 + + + +## 画布变换后坐标转换问题 + +还是上述的例子,绘制一个上下左右选择按键,这个控件是上下左右对称的,熟悉我代码风格的小伙伴都知道,如果遇上这种问题,我肯定是要将坐标系平移到这个控件中心的,这样数据比较好计算,然而进行画布变换操作会产生一个新问题:**手指触摸的坐标系和画布坐标系不统一,就可能引起手指触摸位置和绘制位置不统一。** + +举个栗子: + +> 在手指按下位置绘制一个圆。 + +```java +public class CanvasVonvertTouchTest extends CustomView{ + float down_x = -1; + float down_y = -1; + + public CanvasVonvertTouchTest(Context context) { + this(context, null); + } + + public CanvasVonvertTouchTest(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getActionMasked()){ + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_MOVE: + down_x = event.getX(); + down_y = event.getY(); + invalidate(); + break; + + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + down_x = down_y = -1; + invalidate(); + break; + } + + return true; + } + + @Override + protected void onDraw(Canvas canvas) { + float x = down_x; + float y = down_y; + + // 绘制触摸坐标系,颜色为灰色,为了能够显示出坐标系,将坐标系位置稍微偏移了一点 + drawTouchCoordinateSpace(canvas); + + canvas.translate(mViewWidth/2, mViewHeight/2); // 画布平移 + + // 绘制平移后的坐标系,颜色为红色 + drawTranslateCoordinateSpace(canvas); + + // 如果没有就返回 + if (x == -1 && y == -1) + return; + + // 在触摸位置绘制一个小圆 + canvas.drawCircle(x,y,20,mDeafultPaint); + } + + /** + * 绘制触摸坐标系,颜色为灰色,为了能够显示出坐标系,将坐标系位置稍微偏移了一点 + */ + private void drawTouchCoordinateSpace(Canvas canvas) { + canvas.save(); + canvas.translate(10,10); + CanvasAidUtils.set2DAxisLength(1000, 0, 1400, 0); + CanvasAidUtils.setLineColor(Color.GRAY); + CanvasAidUtils.draw2DCoordinateSpace(canvas); + canvas.restore(); + } + + /** + * 绘制平移后的坐标系,颜色为红色 + */ + private void drawTranslateCoordinateSpace(Canvas canvas) { + CanvasAidUtils.set2DAxisLength(500, 500, 700, 700); + CanvasAidUtils.setLineColor(Color.RED); + CanvasAidUtils.draw2DCoordinateSpace(canvas); + CanvasAidUtils.draw2DCoordinateSpace(canvas); + } +} +``` + +可以看到,直接拿手指触摸位置的坐标来绘制会导致绘制位置不正确,大概会像这样子: + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f9tdc3p84uj308c0d4mx9.jpg) + +两者坐标是相同的,但是由于坐标系不同,导致实际显示位置不同。 + +**那么问题来了,我们在之前的文章中讲过,映射不同坐标系的坐标用 什么来着?** +**是 Matrix。** + +如果看过我之前的文章但没有想起来的说明你们根本没有认真看,全部拖出去糟蹋 5 分钟! +没看过的点 [Matrix原理][Matrix_Basic] 和 [Matrix详解][Matrix_Method] 。 + +> **Matrix 是一个矩阵,主要功能是坐标映射,数值转换。** + +那么接下来我们就对上面的示例进行简单的改造一下,让触摸位置和实际绘制绘制重合。 + +**注意:比较重要的修改位置用▼标记出来了。** + +```java +public class CanvasVonvertTouchTest extends CustomView{ + float down_x = -1; + float down_y = -1; + + public CanvasVonvertTouchTest(Context context) { + this(context, null); + } + + public CanvasVonvertTouchTest(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getActionMasked()){ + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_MOVE: + // ▼ 注意此处使用 getRawX,而不是 getX + down_x = event.getRawX(); + down_y = event.getRawY(); + invalidate(); + break; + + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + down_x = down_y = -1; + invalidate(); + break; + } + + return true; + } + + @Override + protected void onDraw(Canvas canvas) { + float[] pts = {down_x, down_y}; + + // 绘制触摸坐标系,颜色为灰色,为了能够显示出坐标系,将坐标系位置稍微偏移了一点 + drawTouchCoordinateSpace(canvas); + + canvas.translate(mViewWidth/2, mViewHeight/2); // 画布平移 + + // 绘制平移后的坐标系,颜色为红色 + drawTranslateCoordinateSpace(canvas); + + // 如果没有就返回 + if (pts[0] == -1 && pts[1] == -1) + return; + + // ▼ 获得当前矩阵的逆矩阵 + Matrix invertMatrix = new Matrix(); + canvas.getMatrix().invert(invertMatrix); + + // ▼ 使用 mapPoints 将触摸位置转换为画布坐标 + invertMatrix.mapPoints(pts); + + // 在触摸位置绘制一个小圆 + canvas.drawCircle(pts[0],pts[1],20,mDeafultPaint); + } + + /** + * 绘制触摸坐标系,颜色为灰色,为了能够显示出坐标系,将坐标系位置稍微偏移了一点 + */ + private void drawTouchCoordinateSpace(Canvas canvas) { + canvas.save(); + canvas.translate(10,10); + CanvasAidUtils.set2DAxisLength(1000, 0, 1400, 0); + CanvasAidUtils.setLineColor(Color.GRAY); + CanvasAidUtils.draw2DCoordinateSpace(canvas); + canvas.restore(); + } + + /** + * 绘制平移后的坐标系,颜色为红色 + */ + private void drawTranslateCoordinateSpace(Canvas canvas) { + CanvasAidUtils.set2DAxisLength(500, 500, 700, 700); + CanvasAidUtils.setLineColor(Color.RED); + CanvasAidUtils.draw2DCoordinateSpace(canvas); + CanvasAidUtils.draw2DCoordinateSpace(canvas); + } +} + +``` + +**绘制结果:** + +小白点和黑色的圆没有完全重合是因为系统显示触摸位置的绘制逻辑和我使用的绘制逻辑不太相同,两者的位置是一样的。 + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f9te2mzxcvj308c0d40st.jpg) + +其实核心部分就这两点: + +```java +// ▼ 注意此处使用 getRawX,而不是 getX +down_x = event.getRawX(); +down_y = event.getRawY(); + +// ------------------------------------- + +// ▼ 获得当前矩阵的逆矩阵 +Matrix invertMatrix = new Matrix(); +canvas.getMatrix().invert(invertMatrix); + +// ▼ 使用 mapPoints 将触摸位置转换为画布坐标 +invertMatrix.mapPoints(pts); +``` + +1. 使用全局坐标系 +2. 使用逆矩阵的 mapPoints + +**原理嘛,其实非常简单,我们在画布上正常的绘制,需要将画布坐标系转换为全局坐标系后才能真正的绘制内容。所以我们反着来,将获得到的全局坐标系坐标使用当前画布的逆矩阵转化一下,就转化为当前画布的坐标系坐标了,如果对 [Matrix原理][Matrix_Basic] 和 [Matrix详解][Matrix_Method] 理解了,即便我不说你们也肯定会想到这个方案的。** + +## 仿遥控器按钮代码示例 + +在解决了上述两大难题之后,相信不论形状如何奇葩的自定义控件,基本上都难不倒大家了,最后用一个简单的示例作为结尾,还是文章开头所举的例子,核心内容就是上面讲的两个东西。 + +```java +public class RemoteControlMenu extends CustomView { + Path up_p, down_p, left_p, right_p, center_p; + Region up, down, left, right, center; + + Matrix mMapMatrix = null; + + int CENTER = 0; + int UP = 1; + int RIGHT = 2; + int DOWN = 3; + int LEFT = 4; + int touchFlag = -1; + int currentFlag = -1; + + MenuListener mListener = null; + + int mDefauColor = 0xFF4E5268; + int mTouchedColor = 0xFFDF9C81; + + + public RemoteControlMenu(Context context) { + this(context, null); + } + + public RemoteControlMenu(Context context, AttributeSet attrs) { + super(context, attrs); + + up_p = new Path(); + down_p = new Path(); + left_p = new Path(); + right_p = new Path(); + center_p = new Path(); + + up = new Region(); + down = new Region(); + left = new Region(); + right = new Region(); + center = new Region(); + + mDeafultPaint.setColor(mDefauColor); + mDeafultPaint.setAntiAlias(true); + + mMapMatrix = new Matrix(); + + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mMapMatrix.reset(); + + // 注意这个区域的大小 + Region globalRegion = new Region(-w, -h, w, h); + int minWidth = w > h ? h : w; + minWidth *= 0.8; + + int br = minWidth / 2; + RectF bigCircle = new RectF(-br, -br, br, br); + + int sr = minWidth / 4; + RectF smallCircle = new RectF(-sr, -sr, sr, sr); + + float bigSweepAngle = 84; + float smallSweepAngle = -80; + + // 根据视图大小,初始化 Path 和 Region + center_p.addCircle(0, 0, 0.2f * minWidth, Path.Direction.CW); + center.setPath(center_p, globalRegion); + + right_p.addArc(bigCircle, -40, bigSweepAngle); + right_p.arcTo(smallCircle, 40, smallSweepAngle); + right_p.close(); + right.setPath(right_p, globalRegion); + + down_p.addArc(bigCircle, 50, bigSweepAngle); + down_p.arcTo(smallCircle, 130, smallSweepAngle); + down_p.close(); + down.setPath(down_p, globalRegion); + + left_p.addArc(bigCircle, 140, bigSweepAngle); + left_p.arcTo(smallCircle, 220, smallSweepAngle); + left_p.close(); + left.setPath(left_p, globalRegion); + + up_p.addArc(bigCircle, 230, bigSweepAngle); + up_p.arcTo(smallCircle, 310, smallSweepAngle); + up_p.close(); + up.setPath(up_p, globalRegion); + + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + float[] pts = new float[2]; + pts[0] = event.getRawX(); + pts[1] = event.getRawY(); + mMapMatrix.mapPoints(pts); + + int x = (int) pts[0]; + int y = (int) pts[1]; + + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + touchFlag = getTouchedPath(x, y); + currentFlag = touchFlag; + break; + case MotionEvent.ACTION_MOVE: + currentFlag = getTouchedPath(x, y); + break; + case MotionEvent.ACTION_UP: + currentFlag = getTouchedPath(x, y); + // 如果手指按下区域和抬起区域相同且不为空,则判断点击事件 + if (currentFlag == touchFlag && currentFlag != -1 && mListener != null) { + if (currentFlag == CENTER) { + mListener.onCenterCliched(); + } else if (currentFlag == UP) { + mListener.onUpCliched(); + } else if (currentFlag == RIGHT) { + mListener.onRightCliched(); + } else if (currentFlag == DOWN) { + mListener.onDownCliched(); + } else if (currentFlag == LEFT) { + mListener.onLeftCliched(); + } + } + touchFlag = currentFlag = -1; + break; + case MotionEvent.ACTION_CANCEL: + touchFlag = currentFlag = -1; + break; + } + + invalidate(); + return true; + } + + // 获取当前触摸点在哪个区域 + int getTouchedPath(int x, int y) { + if (center.contains(x, y)) { + return 0; + } else if (up.contains(x, y)) { + return 1; + } else if (right.contains(x, y)) { + return 2; + } else if (down.contains(x, y)) { + return 3; + } else if (left.contains(x, y)) { + return 4; + } + return -1; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.translate(mViewWidth / 2, mViewHeight / 2); + + // 获取测量矩阵(逆矩阵) + if (mMapMatrix.isIdentity()) { + canvas.getMatrix().invert(mMapMatrix); + } + + // 绘制默认颜色 + canvas.drawPath(center_p, mDeafultPaint); + canvas.drawPath(up_p, mDeafultPaint); + canvas.drawPath(right_p, mDeafultPaint); + canvas.drawPath(down_p, mDeafultPaint); + canvas.drawPath(left_p, mDeafultPaint); + + // 绘制触摸区域颜色 + mDeafultPaint.setColor(mTouchedColor); + if (currentFlag == CENTER) { + canvas.drawPath(center_p, mDeafultPaint); + } else if (currentFlag == UP) { + canvas.drawPath(up_p, mDeafultPaint); + } else if (currentFlag == RIGHT) { + canvas.drawPath(right_p, mDeafultPaint); + } else if (currentFlag == DOWN) { + canvas.drawPath(down_p, mDeafultPaint); + } else if (currentFlag == LEFT) { + canvas.drawPath(left_p, mDeafultPaint); + } + mDeafultPaint.setColor(mDefauColor); + } + + public void setListener(MenuListener listener) { + mListener = listener; + } + + // 点击事件监听器 + public interface MenuListener { + void onCenterCliched(); + + void onUpCliched(); + + void onRightCliched(); + + void onDownCliched(); + + void onLeftCliched(); + } +} +``` + +**运行效果:** + +当手指在某一区域活动时,该区域会高亮显示,如果注册了监听器,点击某一区域会触发监听器回调。 + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f9tinrk6ilj308c0eat92.jpg) + + + +## 总结 + +本文虽然代码比较多,但核心概念非常简单,主要涉及以下两点: + +1. Region 的区域检测。 +2. Matrix 的坐标映射。 + +**这两个知识点都不是很难,然而灵活运用起来却是非常强大的,如果有对 Matrix 不了解的小伙伴,推荐去看我 [之前的文章][CustomViewIndex],里面有关于Matrix的详细介绍,** + + + +## About Me + +### 作者微博: @GcsSloop + + + + + +[CustomViewIndex]: http://www.gcssloop.com/customview/CustomViewIndex +[Matrix_Basic]: http://www.gcssloop.com/customview/Matrix_Basic +[Matrix_Method]: http://www.gcssloop.com/customview/Matrix_Method + + + From 0041d3eb5433f6cfdf1012c94c5e76958af8e55b Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 17 Nov 2016 17:22:05 +0800 Subject: [PATCH 499/615] Update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 85ac6cc0..d372db4c 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ * [安卓自定义View进阶 - 事件分发机制原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B12%5DDispatch-TouchEvent-Theory.md) * [安卓自定义View进阶 - 事件分发机制详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B15%5DDispatch-TouchEvent-Source.md) * [安卓自定义View进阶 - MotionEvent详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B16%5DMotionEvent.md) + * [安卓自定义View进阶 - 特殊形状控件事件处理方案](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B17%5Dtouch-matrix-region.md) ****** From 4b537be9b6ef957d9f81c2c3c03a15a12df716f9 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 18 Nov 2016 23:31:40 +0800 Subject: [PATCH 500/615] Update --- CustomView/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CustomView/README.md b/CustomView/README.md index cb873f7d..6fefef4f 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -48,6 +48,7 @@

+

### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From 4ec645d9b2e10d092a9f7f45165cdb7c7c2edd78 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 19 Nov 2016 23:36:22 +0800 Subject: [PATCH 501/615] Update --- CustomView/Advance/[17]touch-matrix-region.md | 153 ++++++++---------- 1 file changed, 63 insertions(+), 90 deletions(-) diff --git a/CustomView/Advance/[17]touch-matrix-region.md b/CustomView/Advance/[17]touch-matrix-region.md index 0803a838..487026a2 100644 --- a/CustomView/Advance/[17]touch-matrix-region.md +++ b/CustomView/Advance/[17]touch-matrix-region.md @@ -1,26 +1,31 @@ # 特殊控件的事件处理方案 + 本文带大家了解 Android 特殊形状控件的事件处理方式,主要是利用了 Region 和 Matrix 的一些方法,超级实用的事件处理方案,相信看完本篇之后,任何奇葩控件的事件处理都会变得十分简单。 不得不说,Android 对事件体系封装的非常棒,即便对事件体系不太了解的人,只要简单的调用方法就能使用,而且具有防呆设计,能够保证事件流的完整性和统一性,最大可能性的避免了事件处理的混乱,着实令人佩服。 然而世界上并没有绝对完美的东西,**当【事件处理】遇上【自定义View】,一场好戏就开演了,玩的好叫坐镇军前,指挥千军万马而分毫不乱,玩的不好就是抓耳挠腮,眼见敌人前后包抄而无可奈何。** +> #### 注意: +> +> 本文中所有的 自定义View 均继承自 CustomView ,这是一个自定义的超类,目的是简化 自定义View 部分常用操作,你可以在 [ViewSupport](https://github.com/GcsSloop/ViewSupport/wiki/CustomView) 中找到它以及关于它的简介。 + ## 特殊形状控件 在通常的情况下,自定义 View 直接使用系统的事件体系处理就行,我们也不需要特殊处理,然而当一些特殊的控件出现的时候,麻烦就来了,举个栗子: ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f9t9u0tignj308c08cq3f.jpg) -这是一个在遥控器上非常常见的按键布局,注意中间上下左右选择的部分,看起来十分简单,然而当你真正准备在手机上实现的时候麻烦就出现了。因为所有的View默认都是矩形的,所以事件接收区域也是矩形的,如果直接使用系统提供的 View 来组合出一摸一样的布局也很简单,但点击区域该如何处理?显然这样有部分点击区域是在控件外面的,并且控件之间会产生重叠区域,点击的时候容易判断错误,例如: +这是一个在遥控器上非常常见的按键布局,注意中间上下左右选择的部分,看起来十分简单,然而当你真正准备在手机上实现的时候麻烦就出现了。因为所有的 View 默认都是矩形的,所以事件接收区域也是矩形的,如果直接使用系统提供的 View 来组合出一摸一样的布局也很简单,但点击区域该如何处理?显然有部分点击区域是在控件外面的,并且会产生重叠区域: -> 红色方框表示用 View 组合的情况下,单个 View 的可点击区域。 +> 红色方框表示 View 的可点击区域。 ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f9ta3eymeej308c08cwf1.jpg) -当我们面对这样比较奇特的控件的时候,有很多处理办法,比较投机的一种就是背景贴一个静态图,按钮做成透明的,设置小一点,放在对应的位置,这样可以保证不会误触,当然了如果想要点击效果可以在按钮按下的时候更新一下背景图,这样虽然也可以,但可点击区域会变小,体验效果会变差。设计方案变得非常复杂,而且逻辑也不容易处理,可以说是一种非常糟糕的设计。 +当我们面对这样比较奇特的控件的时候,有很多处理办法,比较投机的一种就是背景贴一个静态图,按钮做成透明的,设置小一点,放在对应的位置,这样可以保证不会误触,当然了如果想要点击效果可以在按钮按下的时候更新一下背景图,这样虽然也可以,但是这样会导致可点击区域变小,体验效果变差,设计方案变得复杂,而且逻辑也不容易处理,是一种非常糟糕的设计。 -当然了,看了我这么多文章的小伙伴应该也猜到我接下来要说什么了,没错,就是自定义 View。当我们面对一些奇葩控件的时候,自定义 View 就变成了一种非常好用的处理方案。 +当然了,看了我这么多文章的小伙伴应该也猜到接下来要说什么了,没错,就是自定义 View。当我们面对一些奇葩控件的时候,自定义 View 就变成了一种非常好用的处理方案。 相信小伙伴们看过 [前面的文章][CustomViewIndex] 之后,对各种图形的绘制已经不成问题了,所以我们直接处理重点问题。 @@ -34,44 +39,33 @@ Region 直接翻译的意思是 地域,区域。**在此处应该是区域的 **本文中我们重点要使用到的是 Region 中的 `contains` 方法,这个方法可以判断一个点是否包含在该区域内。** -下面是一个简单的示例程序: +接下来是一个简单的示例,**判断手指是否是在圆形区域内按下**: + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f9xtlae5wzj308c0ea3yn.jpg) + +代码: ```java -public class RegionClickView extends View { - Paint mPaint; - Region globalRegion; - Region circleRegion1; - Region circleRegion2; - Path circlePath1; - Path circlePath2; +public class RegionClickView extends CustomView { + Region circleRegion; + Path circlePath; public RegionClickView(Context context) { super(context); - - mPaint = new Paint(); - mPaint.setStyle(Paint.Style.FILL); - mPaint.setColor(Color.GRAY); - - // 用Path创建两个圆 - circlePath1 = new Path(); - circlePath2 = new Path(); - circlePath1.addCircle(100, 100, 50, Path.Direction.CW); - circlePath2.addCircle(400, 400, 50, Path.Direction.CW); - - // 创建 Region - circleRegion1 = new Region(); - circleRegion2 = new Region(); + mDeafultPaint.setColor(0xFF4E5268); + circlePath = new Path(); + circleRegion = new Region(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - // 将剪裁边界设置为视图大小 - globalRegion = new Region(0, 0, w, h); - + // ▼在屏幕中间添加一个圆 + circlePath.addCircle(w/2, h/2, 300, Path.Direction.CW); + // ▼将剪裁边界设置为视图大小 + Region globalRegion = new Region(-w, -h, w, h); // ▼将 Path 添加到 Region 中 - circleRegion1.setPath(circlePath1, globalRegion); - circleRegion2.setPath(circlePath2, globalRegion); + circleRegion.setPath(circlePath, globalRegion); } @Override @@ -82,45 +76,39 @@ public class RegionClickView extends View { int y = (int) event.getY(); // ▼点击区域判断 - if (circleRegion1.contains(x,y)){ - Toast.makeText(this.getContext(),"圆1被点击",Toast.LENGTH_SHORT).show(); - } - if (circleRegion2.contains(x,y)){ - Toast.makeText(this.getContext(),"圆2被点击",Toast.LENGTH_SHORT).show(); + if (circleRegion.contains(x,y)){ + Toast.makeText(this.getContext(),"圆被点击",Toast.LENGTH_SHORT).show(); } break; } - return super.onTouchEvent(event); + return true; } @Override protected void onDraw(Canvas canvas) { - // ▼注意此处将全局变量转化为局部变量,方便 GC 回收 Canvas - Path circle1 = circlePath1; - Path circle2 = circlePath2; - - // 绘制两个圆 - canvas.drawPath(circle1,mPaint); - canvas.drawPath(circle2,mPaint); + // 绘制圆 + canvas.drawPath(circle1,mDeafultPaint); } } ``` > 代码中比较重要的内容都用 ▼ 符号标记出来了。 -上述代码非常简单,就是创建了两个 Path,在 Path 中添加圆形,之后将 Path 设置到 Region 中,当手指在屏幕上按下的时候判断手指按下位置是否在 Region 区域内。 - -代码整体逻辑非常简单,大家测试一下就行了。 +上述代码非常简单,就是创建了个 Path 并在其中添加圆形,之后将 Path 设置到 Region 中,当手指在屏幕上按下的时候判断手指位置是否在 Region 区域内。 ## 画布变换后坐标转换问题 -还是上述的例子,绘制一个上下左右选择按键,这个控件是上下左右对称的,熟悉我代码风格的小伙伴都知道,如果遇上这种问题,我肯定是要将坐标系平移到这个控件中心的,这样数据比较好计算,然而进行画布变换操作会产生一个新问题:**手指触摸的坐标系和画布坐标系不统一,就可能引起手指触摸位置和绘制位置不统一。** +还是本文一开始的例子,绘制一个上下左右选择按键,这个控件是上下左右对称的,熟悉我代码风格的小伙伴都知道,如果遇上这种问题,我肯定是要将坐标系平移到这个控件中心的,这样数据比较好计算,然而进行画布变换操作会产生一个新问题:**手指触摸的坐标系和画布坐标系不统一,就可能引起手指触摸位置和绘制位置不统一。** 举个栗子: -> 在手指按下位置绘制一个圆。 +> 画布移动后在手指按下位置绘制一个圆,可以看到,直接拿手指触摸位置的坐标来绘制会导致绘制位置不正确,**两者坐标是相同的,但是由于坐标系不同,导致实际显示位置不同。** + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f9tdc3p84uj308c0d4mx9.jpg) + +代码: ```java public class CanvasVonvertTouchTest extends CustomView{ @@ -160,24 +148,20 @@ public class CanvasVonvertTouchTest extends CustomView{ float x = down_x; float y = down_y; - // 绘制触摸坐标系,颜色为灰色,为了能够显示出坐标系,将坐标系位置稍微偏移了一点 - drawTouchCoordinateSpace(canvas); - - canvas.translate(mViewWidth/2, mViewHeight/2); // 画布平移 - - // 绘制平移后的坐标系,颜色为红色 - drawTranslateCoordinateSpace(canvas); + drawTouchCoordinateSpace(canvas); // 绘制触摸坐标系 灰色 + + // ▼注意画布平移 + canvas.translate(mViewWidth/2, mViewHeight/2); + + drawTranslateCoordinateSpace(canvas); // 绘制平移后的坐标系,红色 - // 如果没有就返回 - if (x == -1 && y == -1) - return; + if (x == -1 && y == -1) return; // 如果没有就返回 - // 在触摸位置绘制一个小圆 - canvas.drawCircle(x,y,20,mDeafultPaint); + canvas.drawCircle(x,y,20,mDeafultPaint); // 在触摸位置绘制一个小圆 } /** - * 绘制触摸坐标系,颜色为灰色,为了能够显示出坐标系,将坐标系位置稍微偏移了一点 + * 绘制触摸坐标系,灰色,为了能够显示出坐标系,将坐标系位置稍微偏移了一点 */ private void drawTouchCoordinateSpace(Canvas canvas) { canvas.save(); @@ -189,7 +173,7 @@ public class CanvasVonvertTouchTest extends CustomView{ } /** - * 绘制平移后的坐标系,颜色为红色 + * 绘制平移后的坐标系,红色 */ private void drawTranslateCoordinateSpace(Canvas canvas) { CanvasAidUtils.set2DAxisLength(500, 500, 700, 700); @@ -200,12 +184,6 @@ public class CanvasVonvertTouchTest extends CustomView{ } ``` -可以看到,直接拿手指触摸位置的坐标来绘制会导致绘制位置不正确,大概会像这样子: - -![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f9tdc3p84uj308c0d4mx9.jpg) - -两者坐标是相同的,但是由于坐标系不同,导致实际显示位置不同。 - **那么问题来了,我们在之前的文章中讲过,映射不同坐标系的坐标用 什么来着?** **是 Matrix。** @@ -214,7 +192,11 @@ public class CanvasVonvertTouchTest extends CustomView{ > **Matrix 是一个矩阵,主要功能是坐标映射,数值转换。** -那么接下来我们就对上面的示例进行简单的改造一下,让触摸位置和实际绘制绘制重合。 +那么接下来我们就对上面的示例进行简单的改造一下,让触摸位置和实际绘制绘制重合。小白点和黑色的圆没有完全重合是因为系统显示触摸位置的绘制逻辑和我使用的绘制逻辑不太相同导致的。 + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f9te2mzxcvj308c0d40st.jpg) + +代码: **注意:比较重要的修改位置用▼标记出来了。** @@ -256,17 +238,13 @@ public class CanvasVonvertTouchTest extends CustomView{ protected void onDraw(Canvas canvas) { float[] pts = {down_x, down_y}; - // 绘制触摸坐标系,颜色为灰色,为了能够显示出坐标系,将坐标系位置稍微偏移了一点 - drawTouchCoordinateSpace(canvas); - - canvas.translate(mViewWidth/2, mViewHeight/2); // 画布平移 - - // 绘制平移后的坐标系,颜色为红色 - drawTranslateCoordinateSpace(canvas); - - // 如果没有就返回 - if (pts[0] == -1 && pts[1] == -1) - return; + drawTouchCoordinateSpace(canvas); // 绘制触摸坐标系,灰色 + // ▼注意画布平移 + canvas.translate(mViewWidth/2, mViewHeight/2); + + drawTranslateCoordinateSpace(canvas); // 绘制平移后的坐标系,红色 + + if (pts[0] == -1 && pts[1] == -1) return; // 如果没有就返回 // ▼ 获得当前矩阵的逆矩阵 Matrix invertMatrix = new Matrix(); @@ -301,15 +279,8 @@ public class CanvasVonvertTouchTest extends CustomView{ CanvasAidUtils.draw2DCoordinateSpace(canvas); } } - ``` -**绘制结果:** - -小白点和黑色的圆没有完全重合是因为系统显示触摸位置的绘制逻辑和我使用的绘制逻辑不太相同,两者的位置是一样的。 - -![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f9te2mzxcvj308c0d40st.jpg) - 其实核心部分就这两点: ```java @@ -336,6 +307,10 @@ invertMatrix.mapPoints(pts); 在解决了上述两大难题之后,相信不论形状如何奇葩的自定义控件,基本上都难不倒大家了,最后用一个简单的示例作为结尾,还是文章开头所举的例子,核心内容就是上面讲的两个东西。 +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f9tinrk6ilj308c0eat92.jpg) + +代码: + ```java public class RemoteControlMenu extends CustomView { Path up_p, down_p, left_p, right_p, center_p; @@ -545,8 +520,6 @@ public class RemoteControlMenu extends CustomView { 当手指在某一区域活动时,该区域会高亮显示,如果注册了监听器,点击某一区域会触发监听器回调。 -![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f9tinrk6ilj308c0eat92.jpg) - ## 总结 From a71f8d9f80789d01563686959973d2cecf49d644 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 20 Nov 2016 21:11:57 +0800 Subject: [PATCH 502/615] Update --- ChaosCrystal/Markdowm/README.md | 1 - .../\345\237\272\346\234\254\350\257\255\346\263\225.md" | 3 --- 2 files changed, 4 deletions(-) delete mode 100644 ChaosCrystal/Markdowm/README.md delete mode 100644 "ChaosCrystal/Markdowm/\345\237\272\346\234\254\350\257\255\346\263\225.md" diff --git a/ChaosCrystal/Markdowm/README.md b/ChaosCrystal/Markdowm/README.md deleted file mode 100644 index 7d82df34..00000000 --- a/ChaosCrystal/Markdowm/README.md +++ /dev/null @@ -1 +0,0 @@ -# Markdown diff --git "a/ChaosCrystal/Markdowm/\345\237\272\346\234\254\350\257\255\346\263\225.md" "b/ChaosCrystal/Markdowm/\345\237\272\346\234\254\350\257\255\346\263\225.md" deleted file mode 100644 index b711b2b6..00000000 --- "a/ChaosCrystal/Markdowm/\345\237\272\346\234\254\350\257\255\346\263\225.md" +++ /dev/null @@ -1,3 +0,0 @@ -# Markdown 基本语法 - -## 标题 From 4cbf83c34df92880f804112a00a95889e9bbce3a Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 21 Nov 2016 22:55:19 +0800 Subject: [PATCH 503/615] Update --- CustomView/Advance/[17]touch-matrix-region.md | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[17]touch-matrix-region.md b/CustomView/Advance/[17]touch-matrix-region.md index 487026a2..026ed5df 100644 --- a/CustomView/Advance/[17]touch-matrix-region.md +++ b/CustomView/Advance/[17]touch-matrix-region.md @@ -1,5 +1,4 @@ -# 特殊控件的事件处理方案 - +# 特殊形状控件的事件处理方案 本文带大家了解 Android 特殊形状控件的事件处理方式,主要是利用了 Region 和 Matrix 的一些方法,超级实用的事件处理方案,相信看完本篇之后,任何奇葩控件的事件处理都会变得十分简单。 @@ -11,6 +10,8 @@ > > 本文中所有的 自定义View 均继承自 CustomView ,这是一个自定义的超类,目的是简化 自定义View 部分常用操作,你可以在 [ViewSupport](https://github.com/GcsSloop/ViewSupport/wiki/CustomView) 中找到它以及关于它的简介。 +## ⚠️ 警告:测试本文章示例之前请关闭硬件加速。 + ## 特殊形状控件 在通常的情况下,自定义 View 直接使用系统的事件体系处理就行,我们也不需要特殊处理,然而当一些特殊的控件出现的时候,麻烦就来了,举个栗子: @@ -86,8 +87,10 @@ public class RegionClickView extends CustomView { @Override protected void onDraw(Canvas canvas) { + // ▼注意此处将全局变量转化为局部变量,方便 GC 回收 canvas + Path circle = circlePath; // 绘制圆 - canvas.drawPath(circle1,mDeafultPaint); + canvas.drawPath(circle,mDeafultPaint); } } ``` @@ -522,6 +525,35 @@ public class RemoteControlMenu extends CustomView { +## 关于硬件加速的问题 + +**硬件加速是个好东西,但是处理不好会引起诸多问题,博主为了怕麻烦我一直关闭硬件加速。** + +然而硬件加速在 Android 4.0 以上是默认开启的,这就导致了有好几位魔法师反馈测试结果和我的测试结果不同,我来简单说明一下硬件加速干了什么事情,以及这些文章中的锅是如何产生的,应该由谁来背。 + +我在 [Matrix 原理][Matrix_Basic] 中说过 Matrix 的作用: **Matrix作用就是坐标映射。** +其核心功能就是将单个 View 的坐标系转化为屏幕(物理)坐标系,虽然转换一次费不了多少时间,但是当执行动画效果等需要大量快速重绘的情况下,耗费的时间就需要考量一下了,于是乎,硬件加速干了一件非常**精明**的事情,**把所有画布坐标系都设置为屏幕(物理)坐标系**,之后在 View 绘制区域设置一个遮罩,保证绘制内容不会超过 View 自身的大小,**这样就直接跳过坐标转换过程,可以节省坐标系之间数值转换耗费的时间**。因此导致了以下问题: + +1. 开启硬件加速情况下 event.getX() 和 不开启情况下 event.getRawX() 等价,获取到的是屏幕(物理)坐标 (本文的锅)。 +2. 开启硬件加速情况下 event.getRawX() 数值是一个错误数值,因为本身就是全局的坐标又叠加了一次 View 的偏移量,所以肯定是不正确的 (本文的锅)。 +3. 从 Canvas 获取到的 Matrix 是全局的,默认情况下 x,y 偏移量始终为0,因此你不能从这里拿到当前 View 的偏移量 ( Matrix系列文章中的锅 )。 +4. 由于其使用的是遮罩来控制绘制区域,所以如果重绘 path 时,如果 path 区域变大,但没有执行单步操作会导致 path 绘制不完整或者看起来比较奇怪 (Path系列文章中的锅)。 + +很显然,这个硬件加速有点6,制造了各种锅想让我来背,然而智慧的我早已看穿一切,默默的把硬件加速关闭了,因为我不知道它还有多少锅没亮出来。 + +**这里顺便挖个坑,等我搞明白硬件加速扔锅的逻辑之后,专门写一篇硬件加速的文章,把硬件加速的锅全埋进去,再也不背这口大黑锅了**。 +**(╯°Д°)╯︵ ┻━┻** + + + +**个人建议:** + +1. 如果应用不需要大量重绘,那么硬件加速开启和关闭都无所谓,推荐关闭。 +2. 如果应用要兼容到 3.0 以下,建议不要使用硬件加速的特性,或者进行兼容性处理。 +3. 如果应用存在大量的动画等需要快速重绘的场景,在开启硬件加速时注意测试。 +4. 如果 自定义View 出现与绘图相关的异常,请务必检查一下硬件加速。 +5. 如果想关掉硬件加速看这里: [Android如何关闭硬件加速](https://github.com/GcsSloop/AndroidNote/issues/7) 。 + ## 总结 本文虽然代码比较多,但核心概念非常简单,主要涉及以下两点: From b262f0d463c2a0a84738d2d14bae973423014900 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 22 Nov 2016 20:47:36 +0800 Subject: [PATCH 504/615] Update --- CustomView/Advance/[17]touch-matrix-region.md | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/CustomView/Advance/[17]touch-matrix-region.md b/CustomView/Advance/[17]touch-matrix-region.md index 026ed5df..cf23d6cb 100644 --- a/CustomView/Advance/[17]touch-matrix-region.md +++ b/CustomView/Advance/[17]touch-matrix-region.md @@ -1,16 +1,9 @@ -# 特殊形状控件的事件处理方案 +# 特殊控件的事件处理方案 本文带大家了解 Android 特殊形状控件的事件处理方式,主要是利用了 Region 和 Matrix 的一些方法,超级实用的事件处理方案,相信看完本篇之后,任何奇葩控件的事件处理都会变得十分简单。 -不得不说,Android 对事件体系封装的非常棒,即便对事件体系不太了解的人,只要简单的调用方法就能使用,而且具有防呆设计,能够保证事件流的完整性和统一性,最大可能性的避免了事件处理的混乱,着实令人佩服。 - -然而世界上并没有绝对完美的东西,**当【事件处理】遇上【自定义View】,一场好戏就开演了,玩的好叫坐镇军前,指挥千军万马而分毫不乱,玩的不好就是抓耳挠腮,眼见敌人前后包抄而无可奈何。** - -> #### 注意: -> -> 本文中所有的 自定义View 均继承自 CustomView ,这是一个自定义的超类,目的是简化 自定义View 部分常用操作,你可以在 [ViewSupport](https://github.com/GcsSloop/ViewSupport/wiki/CustomView) 中找到它以及关于它的简介。 - -## ⚠️ 警告:测试本文章示例之前请关闭硬件加速。 +不得不说,Android 对事件体系封装的非常棒,即便对事件体系不太了解的人,只要简单的调用方法就能使用,而且具有防呆设计,能够保证事件流的完整性和统一性,最大可能性的避免了事件处理的混乱,着实令人佩服。 +**然而世界上并没有绝对完美的东西,当"事件处理"遇上"自定义View",一场好戏就开演了。** ## 特殊形状控件 @@ -30,7 +23,10 @@ 相信小伙伴们看过 [前面的文章][CustomViewIndex] 之后,对各种图形的绘制已经不成问题了,所以我们直接处理重点问题。 - +> #### 注意: +> +> 本文中所有的 自定义View 均继承自 CustomView ,这是一个自定义的超类,目的是简化 自定义View 部分常用操作,你可以在 [ViewSupport](https://github.com/GcsSloop/ViewSupport/wiki/CustomView) 中找到它以及关于它的简介。 +> **⚠️ 警告:测试本文章示例之前请关闭硬件加速。** ## 特殊形状控的点击区域判断 @@ -548,12 +544,14 @@ public class RemoteControlMenu extends CustomView { **个人建议:** -1. 如果应用不需要大量重绘,那么硬件加速开启和关闭都无所谓,推荐关闭。 -2. 如果应用要兼容到 3.0 以下,建议不要使用硬件加速的特性,或者进行兼容性处理。 -3. 如果应用存在大量的动画等需要快速重绘的场景,在开启硬件加速时注意测试。 +1. APP全局关闭硬件加速。 +2. 针对动画较多的 Activity 或者 View 单独开启硬件加速。 +3. 如果应用要兼容到 3.0 以下,不要使用硬件加速的特性,或者进行兼容处理。 4. 如果 自定义View 出现与绘图相关的异常,请务必检查一下硬件加速。 5. 如果想关掉硬件加速看这里: [Android如何关闭硬件加速](https://github.com/GcsSloop/AndroidNote/issues/7) 。 + + ## 总结 本文虽然代码比较多,但核心概念非常简单,主要涉及以下两点: From b54a9d3ef0906e842760bee3dd9ce2a3a8770baf Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 22 Nov 2016 20:51:31 +0800 Subject: [PATCH 505/615] Update --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d372db4c..0c492c03 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,13 @@ * 商业用途请点击最下面图片联系本人。 -## About Me +## 博文修复计划 + +由于自己的知识水平有限,书写的文章难免会出现一些问题。 + +随着知识增长和知识面的扩大,发现了一些之前未曾注意到的问题,故有此博文修复计划,本次修复不仅会修复之前文章中的瑕疵和纰漏,甚至会对文章的知识结构稍作调整,所有修复的文章和调整后的内容都会在微博重新发布声明,点击下面关注我的微博可以第一时间了解到相关信息,另外据说关注我的微博会变帅哦。 + +本次博文修复计划主要针对 个人博客 和 GitHub,由于博主精力有限以及某些平台自身限制,对于其他平台仅能修复部分内容。 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From 41e7a1638594a6328f1fa4f5ddb3f30a279e7d99 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 23 Nov 2016 23:20:39 +0800 Subject: [PATCH 506/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c492c03..1887f124 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ 随着知识增长和知识面的扩大,发现了一些之前未曾注意到的问题,故有此博文修复计划,本次修复不仅会修复之前文章中的瑕疵和纰漏,甚至会对文章的知识结构稍作调整,所有修复的文章和调整后的内容都会在微博重新发布声明,点击下面关注我的微博可以第一时间了解到相关信息,另外据说关注我的微博会变帅哦。 -本次博文修复计划主要针对 个人博客 和 GitHub,由于博主精力有限以及某些平台自身限制,对于其他平台仅能修复部分内容。 +**本次博文修复计划主要针对 个人博客 和 GitHub,由于博主精力有限以及某些平台自身限制,对于其他平台仅能修复部分内容。** ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From 311f9de00f649005714f7c2695767a53284fac19 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 24 Nov 2016 23:38:49 +0800 Subject: [PATCH 507/615] Update --- CustomView/Advance/[04]Canvas_PictureText.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[04]Canvas_PictureText.md b/CustomView/Advance/[04]Canvas_PictureText.md index 9644f4f1..ba7f2c4f 100644 --- a/CustomView/Advance/[04]Canvas_PictureText.md +++ b/CustomView/Advance/[04]Canvas_PictureText.md @@ -362,7 +362,7 @@ PS:图片左上角位置默认为坐标原点。 绘制文字部分大致可以分为三类: -第一类只能指定文本基线位置位置(基线x默认在字符串左侧,基线y默认在字符串下方)。
+第一类只能指定文本基线位置(基线x默认在字符串左侧,基线y默认在字符串下方)。
第二类可以分别指定每个文字的位置。
第三类是指定一个路径,根据路径绘制文字。
From 939fd5c4c1980ccbc2c899067c6a78ac849b67e9 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 25 Nov 2016 23:54:41 +0800 Subject: [PATCH 508/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1887f124..715b72ab 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ 随着知识增长和知识面的扩大,发现了一些之前未曾注意到的问题,故有此博文修复计划,本次修复不仅会修复之前文章中的瑕疵和纰漏,甚至会对文章的知识结构稍作调整,所有修复的文章和调整后的内容都会在微博重新发布声明,点击下面关注我的微博可以第一时间了解到相关信息,另外据说关注我的微博会变帅哦。 -**本次博文修复计划主要针对 个人博客 和 GitHub,由于博主精力有限以及某些平台自身限制,对于其他平台仅能修复部分内容。** +**本次博文修复计划主要针对 [个人博客](http://www.gcssloop.com/#blog) 和 [GitHub](https://github.com/GcsSloop),由于博主精力有限以及某些平台自身限制,对于其他平台仅能修复部分内容。** ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From b5713c40746cb7196e0388d6592cd85b5dc8c53d Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 26 Nov 2016 16:27:37 +0800 Subject: [PATCH 509/615] Update --- CustomView/Base/[02]AngleAndRadian.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/CustomView/Base/[02]AngleAndRadian.md b/CustomView/Base/[02]AngleAndRadian.md index 2d4dd12f..07235471 100644 --- a/CustomView/Base/[02]AngleAndRadian.md +++ b/CustomView/Base/[02]AngleAndRadian.md @@ -39,15 +39,9 @@ ## 三.角度和弧度的换算关系 -根据角度和弧度的的定义和圆的相关知识非常容易就能得出两者的换算公式: +**圆一周对应的角度为360度(角度),对应的弧度为2π弧度。** -先设圆的周长为C. 半径为r - -C = 2πr; - -一周对应的角度为360度(角度),对应的弧度为2π弧度。 - -故的等价关系: **180(度) = π(弧度).** +**故得等价关系:360(角度) = 2π(弧度) ==> 180(角度) = π(弧度)** 由等价关系可得如下换算公式: From f0e9997628b66b1e567ba165b565d9a5aec47db0 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 27 Nov 2016 23:28:01 +0800 Subject: [PATCH 510/615] Update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 715b72ab..51884e98 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,7 @@ * 明确署名,即至少注明 `作者:GcsSloop` 字样以及文章的原始链接,且不得使用 `rel="nofollow"` 标记。 * 商业用途请点击最下面图片联系本人。 +***** ## 博文修复计划 From 34083af9b1f2b26befa1c5830b055f99ec66ac8b Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 27 Nov 2016 23:31:15 +0800 Subject: [PATCH 511/615] Update --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 51884e98..ad505ae6 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,16 @@ 时空折跃准备完毕,[点击开始传送](https://github.com/GcsSloop/AndroidNote/tree/magic-world)。 +***** + +## 博文修复计划 + +由于自己的知识水平有限,书写的文章难免会出现一些问题。 + +随着知识增长和知识面的扩大,发现了一些之前未曾注意到的问题,故有此博文修复计划,本次修复不仅会修复之前文章中的瑕疵和纰漏,甚至会对文章的知识结构稍作调整,所有修复的文章和调整后的内容都会在微博重新发布声明,点击下面关注我的微博可以第一时间了解到相关信息,另外据说关注我的微博会变帅哦。 + +**本次博文修复计划主要针对 [个人博客](http://www.gcssloop.com/#blog) 和 [GitHub](https://github.com/GcsSloop),由于博主精力有限以及某些平台自身限制,对于其他平台仅能修复部分内容。** + ****** ## 版权声明 @@ -118,16 +128,6 @@ * 明确署名,即至少注明 `作者:GcsSloop` 字样以及文章的原始链接,且不得使用 `rel="nofollow"` 标记。 * 商业用途请点击最下面图片联系本人。 -***** - -## 博文修复计划 - -由于自己的知识水平有限,书写的文章难免会出现一些问题。 - -随着知识增长和知识面的扩大,发现了一些之前未曾注意到的问题,故有此博文修复计划,本次修复不仅会修复之前文章中的瑕疵和纰漏,甚至会对文章的知识结构稍作调整,所有修复的文章和调整后的内容都会在微博重新发布声明,点击下面关注我的微博可以第一时间了解到相关信息,另外据说关注我的微博会变帅哦。 - -**本次博文修复计划主要针对 [个人博客](http://www.gcssloop.com/#blog) 和 [GitHub](https://github.com/GcsSloop),由于博主精力有限以及某些平台自身限制,对于其他平台仅能修复部分内容。** - ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From 7aae549fe655c907c814191c0e48ca86d9d49e11 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 29 Nov 2016 22:36:39 +0800 Subject: [PATCH 512/615] Update --- Lecture/gdg-developer-growth-guide.md | 164 ++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100755 Lecture/gdg-developer-growth-guide.md diff --git a/Lecture/gdg-developer-growth-guide.md b/Lecture/gdg-developer-growth-guide.md new file mode 100755 index 00000000..d98b68c2 --- /dev/null +++ b/Lecture/gdg-developer-growth-guide.md @@ -0,0 +1,164 @@ +# 程序员练级指北 + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1fa7c95aispj30rs07qmyp.jpg) + +之前非常有幸收到 [脉脉不得语](https://github.com/inferjay) 的邀请参加 郑州GDG[^1] 举办的 DevFest[^2] 活动,并上台分享了一下自己的拙见,回来之后我将自己演讲的内容整理了一下,并分享给大家,希望对一些人有帮助,关于 郑州GDG 更多的活动内容,大家可以到 [GDGZhengzou](https://github.com/GDGZhengzhou/Events) 查看。另外,欢迎关注我的 [GitHub](https://github.com/GcsSloop) 和 [微博](http://weibo.com/GcsSloop) 。 + +**我在本次活动中的演讲主题是《程序员练级指北》,主要内容如何从零开始,并逐渐成长为一名合格的程序员,里面的内容是基于自身的经历和见解所书写的,并不一定适合所有人,建议选择性采纳。** + +**为了演讲不那么枯燥乏味,我用了很多口语化的描述,并将程序员分了等级,从零装备的新手到钻石级别套装的大佬,其实各个等级之间并没有严格的分界点,只是大致的划分,大家理解便好。另外本文和现场演讲可能稍有差别,下面开始正文。** + +Hello,大家好,我是 GcsSloop,今天是我第一次在这么多陌生人面前装逼,啊不,演讲,心里很是忐忑,现在我还能感受到自己的心扑通扑通的跳。 + +我呢,主要学习 Android,爱好装逼,喜欢钱,目前正在向段子手的方向上越走越远。 + +非常高兴今天能站在这里向大家分享我自己的观点,因为在坐的的技术牛人太多了,作为一个没什么技术实力的新人,不敢在这里班门弄斧讲技术,要不然正讲着哪位大牛突然站起来说我讲的不对,这不就尴尬了么。 + +由于本人爱好装逼,自然也研究了一些心得,所以我今天分享一下程序员如何在不同阶段正确的装逼。 + +## 第一阶段 - 新手村 + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1fa7a60w9nqj30m80c0gma.jpg) + +作为编程的新手,自然是不能在大佬面前装逼的,否则分分钟被吊打。这一阶段我们要先给自己定一个小目标,什么是小目标呢?例如挣他个一百万?这对于我们来说当然是不现实的,作为编程菜鸟,小目标当然是稍微努力一下就能完成的,例如:看完几个新手教程,时间不要太长,两三天能完成的任务量就够了。当然了,光看还不行的,要发在朋友圈,让大家觉得你是一个非常有上进心的人。 + +**为什么要发在朋友圈呢?装逼是一方面,除此之外,过了两天你就会发现,这两天光顾着打游戏了,新手教程居然忘记看了,这时候去看看朋友圈,再看看上面的赞,心里想如果这要是不弄完以后还如何在朋友面前装逼,自己装的逼跪着也要学完。** + +这一阶段注意两点: + +1. **任务周期要短,任务量要小**,如果周期太长,例如一个月,到月底发现弄不完了,就会想反正也弄不完了,就这样吧,容易破罐子破摔。 +2. **要形成周围的监督机制**,如果没人看着,反正也没人知道,那就随便学喽,过不了几天自己就放弃了。 + +如果按照计划执行了第一阶段的任务,那么经过大约一两个月的时间,新手教程基本上就看完了,相当于集齐了一套新手装备,顺利进入下一阶段。 + +## 第二阶段 - 初级套装 + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1fa7abwlqq8j30m80c0dgm.jpg) + +初级套装虽然攻击和防御力都很弱,但至少能单挑一些野怪了,有了一定的装逼资本,这时候就要在新手村附近刷一些野怪练级。 + +既然是刷怪升级,自然要选一个怪物比较集中的地方,最好还要有不同等级的怪物,这样方便刷经验,这个地方是哪里呢?个人觉得最适合的地方就是学校OJ题库,不一定要是自己学校的,大部分学校的OJ题库都是开放的,这里面的题目比较多,难度也分了很多等级,是非常适合新手练习的场所。不熟悉OJ系统的建议搜索了解一下。 + +**这一阶段非常容易卡关,经常发现自己有两点不会,就是这也不会,那也不会。** + +然而作为编程界的新手,我们遇到的大部分问题肯定已经有大神踩过坑了,在99%的情况下,用百度或者Google搜索题目描述就能得到攻略方式,但不要偷懒直接复制,要自己亲自写一遍代码,这样有助于自己了解不同类型题目的模式。 + +如果你发现了一道题的答案搜索不到,但是自己解决了,那么恭喜你捡到宝了,说明你遇到了一个稀有的或者新增的怪物,赶紧整理一下攻略过程发博客吧,又能装逼了。 + +这样过了一段时间你就会发现,这些野怪大部分都很弱,只会几种常见的套路而已,除了最基础的题型外,归纳起来就是:堆、栈、树、表、图。 + +每一类野怪都有特定的攻略方法,常用的有:枚举,遍历,分治,贪婪,动态,线性,暴力打表 以及 抖机灵。 + +我在大一的时候加入了学校的打野攻略组,就是传说中的ACM,在里面待了大约有一年的时间,虽然没拿过大奖项,但好在通过刷题把自己的基础巩固了。 + +这一阶段反映自己进步的最好标准就是 做题量 和 排行榜,我最高在校内排到前5,两年没有更新的情况下目前依旧在前50之内,不要问我哪个学校的,是我学校的,看一下OJ排行榜自然能认出我,我在排行榜上也叫GcsSloop。 + +装逼完毕,进入下一阶段。 + +## 第三阶段 - 青铜套装 + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1fa7afft4xgj30m80c00tc.jpg) + +刷野怪时间长了就会发现其实也挺没意思的,不过好在能够练装备,把数据结构知识和一些常见的算法弄明白,熟悉敌人的攻击套路,这样经过一段时间后,装备基本也升级到青铜了,这时候就应该尝试去挑战一下区域小boss了。 + +什么是挑战区域小boss呢,就是尝试制作一个完整的项目并发布出去,有人使用即可。 + +挑战小boss可以组团或者单挑,个人虽然喜欢组团,但无奈我们学校这个服务器太弱了,基本找不到合适的队友,尝试了几次组队最终都以失败而告终,无奈只能去单挑。 + +单挑boss要量力而行,不能找太强的boss,根据我自己的经验,单挑太强的boss会死的很难看,自己曾经有无数个项目胎死腹中或者半路夭折。 + +选择一个比较弱的boss,例如:发布一个简单的 app 到应用市场,获取到一定的下载量,或者写一个开源库,获得一点 star。 + +**这一阶段锻炼的是项目构建能力,能够完整的构建一个项目并发布出去,有人使用就算成功了。** + +这样既能带来成就感,又能装逼,发完之后记得告诉身边的人自己有内容发布了,再次装一波。 + +## 第四阶段 - 白银套装 + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1fa7ajkrs5aj30m80c0751.jpg) + +单挑完一些区域小boss后,将套装升级为白银,有了一定的装逼资本,此时发现总在朋友圈装逼成就感太差了,这时候可以去论坛、贴吧、社区、微博等地方好好的装一把,让那些装备还没有升级起来的小白看看这套锃亮的白银套装是多么耀眼,不过仍要注意不能太过火,在出来帮助新手解决问题的时候顺便展示一下白银套装的威力就行了,装的太狠容易被大佬发现抓起来吊打,这不就尴尬了么。 + +顺便说一下,如果从培训机构出来的,正常应该是白银初级,自身有基础加上比较努力可能会达到白银中级,能拿到白银套装说明已经达到了职业程序员最基本的标准。 + +**很多人打到白银就开始迷茫了,去挑战小boss吧太没成就感,那些看起来就很肥美的中级和高级boss基本已经被大公司瓜分了,自己根本无从插手。所以这时候就要考虑加入公司的问题了。** + +那些比较好的公司,例如:网易、阿里、腾讯 等肯定有一堆人挤破头都想进,作为一个刚刚拿到白银套装的人想挤进去不能说没有机会,但肯定很难。但作为拥有白银套装的人,想加入一些小公司倒还算比较容易。 + +个人建议初期有条件优先选择比较大的公司,因为这些公司资源多,有成熟的体系,可以帮助我们快速的在某一方向上获得长足的发展。 + +后期则优先选择发展型的小公司,如果是从大公司跳向一个小公司,一般都会担任不错的职位,这可以帮助我们锻炼技术之外的能力,另外一个原因是随着公司成长可以分得一些红利。 + +加入公司自然要考虑自身和公司的关系。 + +个人觉得最核心的一点就是不要依附于公司,也不要抱有敌意,最好的办法就是和公司成为**利益共同体**,在自己为公司创造价值的同时利用公司强大的资源提升自己的能力。 + +如果太过于依附公司,认为自己努力工作一定能得到相应回报的,根据经济学的假设,人都是自私而理性的,老板亦是如此,所以这类人大部分情况下都不会得到预期的结果。 + +对公司抱有敌意,认为自己就是打工赚钱的,想偷懒干最少的活,拿最多的钱,因为在偷懒的同时错失了很多发展机会,所以这类人大部分会随着技术的升级而被淘汰掉。 + +**如何与公司成为利益共同体呢?首先要明确自己的目标,自己加入公司是为了提升自己的能力,而不仅仅是来打工赚钱的,想要实现这一目标则是想办法干更多的活,这样老板肯定乐意,而我们通过干更多的活来接触更多的信息,并且把接触到的信息沉淀成为自己的经验积累,对自身发展也是有益的。** + +当然了,我们也不是傻子,当我们自身产生的价值远远超过公司给我们的薪资并且公司资源已经无法支撑我们继续提升的时候,就该抛弃这家公司跳槽了,这一次跳槽势必能进入一个更好的公司深造,可以利用更庞大的资源来辅助我们发展,接触到更多的信息。在信息时代,信息就是金钱,将信息沉淀成为个人经验并不能第一时间转化为金钱,但是总能在未来的某一时刻爆发出惊人的力量。 + +## 第五阶段 - 黄金套装 + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1fa7ar2u1gjj30m80c03zb.jpg) + +在白银阶段,就具备了职业程序员的基本素养,但是离出任CTO,迎娶白富美,走上人生巅峰还差的很远呢,想要实现这些目标,首先要拿到黄金套装。 + +一般来说技术发现有两个方向可走:**深度 和 广度。** + +我自己使用的是树形型结构,大树的树,**一到两门追求深度,做树木主干,其余的最求广度,做树木枝叶**。 + +> 有些人也称为T型知识结构,不过我觉得树形更佳贴切,因为我的所有周边技能都是围绕主干展开的,并且是可生长(拓展)的。 + +我的主方向 Android,自学了 C、Java、Python、Web、Photoshop 等相关知识,除了主方向Android之外,其他方向作为辅助方向,仅仅了解了最基础的内容,也就是能够靠着搜索引擎写一些简单小程序的程度。 + +树型知识架构有很多好处: + +1. **不被单一语言束缚,在实际场景中可以选择最合适的语言**。 +2. **可以跨领域突破,我在研究 Android 2D 绘图逻辑的时候就借鉴了很多 PS 的知识**。 +3. **预留发展空间大,假设某一天,Android市场饱和了或者前景变差了,我可以快速的从树枝中选择一支比较擅长的发展成为主干,而不用每次都从零开始**。 + +其实我们大部分人都是俗人,是不是黄金套装都无所谓,能赚钱才行,很多人来做技术也是为了赚钱,所以接下来我说的是如何想办法用最小的代价产生最大的价值。想要赚钱首先要明白最基本的商业逻辑,如果我们通过正常的方式从别人那里赚到钱了,说明我们为别人提供了价值,这样别人才愿意付费给我们。 + +所以我们要想办法用最小的代价为别人提供最大的价值,我写代码之前会多思考,没错,就是学生时代老师经常说的多思考。不过那时候没有人告诉我们该思考什么,因此我自己摸索出来了一套东西。 + +1. **思考核心目标**,我们是为了某一件事情而写程序,并不是因为写程序了所以要完成这件事情。**核心目标是完成这件事情,而不是写程序。** +2. **思考是否可以偷懒**,我是否可以用更简单的方式完成目标,例如**不写代码,少写代码**。 +3. **如果写代码了,是否可以产生附加价值**,例如我写这一段代码是否可以抽取成为一个开源库,是否可以将其中的设计思想整理成文共享出去。 +4. **如何产生更大的价值**,我的开源库或者文章如何才能服务更多人,让更多人了解到我的东西。因为只有服务更多人,才能产生更大的价值,我们也才可能从中拿走一部分利润。 + +经历过这几步的思考,基本上就已经能将所写的每一段代码的价值潜力都发掘出来,进而用最小的力气服务最多的人。当然了,为了别人服务,只是产生了价值,在通常情况下,这部分价值是无法直接提现的,也就是说仅仅产生了价值但自身并没有收益。 + +不过非常值得庆幸的是,今年很有可能成为内容付费元年,今年已经出来了很多内容变现工具,我知道的就有,微博长文打赏,简书打赏,知乎live,diycode原创打赏 和 掘金原创打赏。 + +另外,最重要的是,**随着社会的快速发展,很多人有钱了,开始愿意为自己喜欢的事物打赏,这是一切的基础。** + + +## 第六阶段 - 钻石套装 + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1fa7aswevd3j30m80c0gm8.jpg) + +能拿到钻石套装的人在全球范围内都是屈指可数的,这一类人通常是某一领域的开拓者,就是我们所说的 XXX之父。这些开拓者已经将自己的影响力渗透进了社会的各行各业,说他们推动了社会的进步也是可以的,我有生之年不说集齐套装,仅仅能拿一件钻石武器便足以令我心满意足了。 + +## 结语 + +前面啰嗦了这么多,最后告诉大家一个小秘密,如果你想要研究一个人发展的根本,不要直接去问他,因为别人很少会告诉你自己赖以生存的核心技能,他们只会告诉你看起来很光鲜的皮毛,就是所谓的心灵鸡汤,这些听起来很励志,但落实在自己身上通常没什么用,大多数情况下只会给你带来两三天的激情而已。 + +正确的方法是观察他在做什么事情,以及分析他做这些事情的背后逻辑。如果你能把这些逻辑想清楚了,就把别人真正的核心技能偷过来了。之后根据自身情况一步一步的学着做就行了。 + +**所以说,你们如果你们想了解我在做什么,为什么不考虑关注一下我的 [新浪微博](http://weibo.com/GcsSloop) 呢?关注一下又不会吃亏!** + +### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) + + + +[^1]: GDG 全称 Google Developer Group,中文意思是 **谷歌开发者社区** 。 +[^2]: DevFest 开发者节,今年(2016)的举办时间是 9月1日 到 11月30日 之间,全球大部分谷歌开发者社区都会举办该活动,一年一次。 + + + + + From e978659ba03f9680665e3b23ed8ca774e47898f8 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 30 Nov 2016 20:44:26 +0800 Subject: [PATCH 513/615] Update --- ...20\347\240\201\350\247\243\346\236\220.md" | 275 ++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 "SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" diff --git "a/SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" new file mode 100644 index 00000000..9c703a4d --- /dev/null +++ "b/SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -0,0 +1,275 @@ +# AtomicFile 源码解析 + +![](http://ww4.sinaimg.cn/large/005Xtdi2jw1faa9dj0nf7j30rs05kaaf.jpg) + +## 什么是 AtomicFile ? + +AtomicFile 在 `android.support.v4.util` 包下,**是一个与文件相关的工具类,其作用是保证文件读写的原子性。** 即文件读写的时候全部成功才会更新文件,如果失败则不会影响文件内容。 + +看官方对其说明: + +> Static library support version of the framework's `AtomicFile`, a helper class for performing atomic operations on a file by creating a backup file until a write has successfully completed. +> +> 静态支持库版本的AtomicFile,一个帮助类,用于通过创建备份文件对文件执行原子操作,直到写入成功完成。 +> +> Atomic file guarantees file integrity by ensuring that a file has been completely written and sync'd to disk before removing its backup. As long as the backup file exists, the original file is considered to be invalid (left over from a previous attempt to write the file). +> +> 原子文件通过确保文件在删除其备份之前已经完全写入并同步到磁盘,从而保证文件的完整性。只要备份文件存在,原始文件将被视为无效(会尝试写入备份文件中)。 +> +> Atomic file does not confer any file locking semantics. Do not use this class when the file may be accessed or modified concurrently by multiple threads or processes. The caller is responsible for ensuring appropriate mutual exclusion invariants whenever it accesses the file. +> +> 原子文件不提供任何文件锁定语义。当文件可能被多个线程或进程并发访问或修改时,不要使用此类。每当访问文件时,调用者都负责确保适当的互斥变量。 + +## 主要方法 + +| ~ | AtomicFile(File baseName)
构造方法,通过File创建AtomicFile | +| :--------------: | ---------------------------------------- | +| FileOutputStream | startWrite()
准备写文件,获得一个向文件写入的字节流(FileOutputStream)。 | +| void | finishWrite(FileOutputStream str)
写入完毕时调用。 | +| void | failWrite(FileOutputStream str)
写入失败时调用。 | +| FileInputStream | openRead()
准备读取文件,获得一个从文件读取的字节流(FileInputStream)。 | +| byte[] | readFully()
将文件中所有内容读取出来用 byte 数组返回,相当于更方便的 openRead 方法。 | +| File | getBaseFile()
获得原文件地址。 | +| void | delete()
删除 AtomicFile,包括原文件和备份文件。 | + +## AtomicFile 原理 + +AtomicFile 原理其实非常简单,下面用一张图简单展示一下其原理: + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1faaeg4kqo5j30lu0tegp5.jpg) + +## AtomicFile 源码解析 + +源码解析非常简单,根据上面表格中的内容按顺序一个一个看吧。 + + + +#### 构造函数: + +根据传进来的文件创建 AtomicFile 类,同时创建辅助备份文件(空文件)。 + +```java +private final File mBaseName; +private final File mBackupName; + +public AtomicFile(File baseName) { + mBaseName = baseName; // 记录原始文件 + mBackupName = new File(baseName.getPath() + ".bak"); // 创建备份文件 +} +``` + + + +#### 开始写入(startWrite) + +在获取向文件写入的输出流之前,它会对原文件进行备份,同时清除原文件内容。 + +同时根据其原理可知,它并不是线程安全的,如果需要多线程操作等,最好自己加锁,如果一个线程未写完,直接开启了另一个线程进行写入可能会导致文件内容丢失。 + +**另外使用这种方法获得到的 FileOutputStream 不要直接关闭,写入完成的时候需要调用 `finishWrite` 或者`failWrite` 进行关闭,否则下次读取的时候会因为备份文件存在而使本次写入失效。** + +```java +public FileOutputStream startWrite() throws IOException { + // 如果备份文件不存在,将原文件重命名为备份文件,并删除原文件 + if (mBaseName.exists()) { + if (!mBackupName.exists()) { + // 如果原文件存在且备份文件不存在,直接将原文件重命名为备份文件 + if (!mBaseName.renameTo(mBackupName)) { + Log.w("AtomicFile", "Couldn't rename file " + mBaseName + + " to backup file " + mBackupName); + } + } else { + mBaseName.delete(); // 删除原文件 + } + } + // 保证原文件存在,并根据原文件创建一个输出流。 + FileOutputStream str = null; + try { + str = new FileOutputStream(mBaseName); + } catch (FileNotFoundException e) { + File parent = mBaseName.getParentFile(); + if (!parent.mkdirs()) { + throw new IOException("Couldn't create directory " + mBaseName); + } + FileUtils.setPermissions( + parent.getPath(), + FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, + -1, -1); + try { + str = new FileOutputStream(mBaseName); + } catch (FileNotFoundException e2) { + throw new IOException("Couldn't create " + mBaseName); + } + } + return str; // 返回输出流。 +} +``` + + + +#### 写入完成(finishWrite) + +写入完成的时候需要用户调用该方法,该方法会关闭 FileOutputStream ,并且会删除备份文件以保证文件的唯一性。 + +```java +public void finishWrite(FileOutputStream str) { + if (str != null) { + FileUtils.sync(str); + try { + str.close(); + mBackupName.delete(); + } catch (IOException e) { + Log.w("AtomicFile", "finishWrite: Got exception:", e); + } + } +} +``` + + + +#### 写入失败(failWrite) + +写入失败时会调用该方法,该方法会关闭 FileOutputStream,并且从备份文件恢复文件内容。 + +```java +public void failWrite(FileOutputStream str) { + if (str != null) { + FileUtils.sync(str); + try { + str.close(); + mBaseName.delete(); + mBackupName.renameTo(mBaseName); + } catch (IOException e) { + Log.w("AtomicFile", "failWrite: Got exception:", e); + } + } +} +``` + + + +#### 准备读取(openRead) + +该方法会获取到一个读取文件的输入流(FileInputStream),并且在备份文件存在时,会简单粗暴的删除原文件,并从备份文件恢复内容。 + +```java +public FileInputStream openRead() throws FileNotFoundException { + if (mBackupName.exists()) { + mBaseName.delete(); + mBackupName.renameTo(mBaseName); + } + return new FileInputStream(mBaseName); +} +``` + + + +#### 读取全部(readFully) + +该方法会将文件中的所有内容转化为一个 byte 数组并且返回,所以不建议使用该方法读取大文件。 + +```java +public byte[] readFully() throws IOException { + FileInputStream stream = openRead(); + try { + int pos = 0; + int avail = stream.available(); + byte[] data = new byte[avail]; + // 通过循环读取的方式将文件所有内容都装入 byte 数组中。 + while (true) { + int amt = stream.read(data, pos, data.length-pos); + //Log.i("foo", "Read " + amt + " bytes at " + pos + // + " of avail " + data.length); + if (amt <= 0) { + //Log.i("foo", "**** FINISHED READING: pos=" + pos + // + " len=" + data.length); + return data; + } + pos += amt; + avail = stream.available(); + if (avail > data.length-pos) { + byte[] newData = new byte[pos+avail]; + System.arraycopy(data, 0, newData, 0, pos); + data = newData; + } + } + } finally { + stream.close(); + } +} +``` + + + +#### 获取原文件(getBaseFile) + +该方法用于获取原文件路径,但通常情况下并不推荐使用,因为获取到的原文件可能是损坏的或者无效的。 + +```java +public File getBaseFile() { + return mBaseName; +} +``` + + + +#### 删除(delete) + +该方法会直接删除原文件和备份文件。 + +```java +public void delete() { + mBaseName.delete(); + mBackupName.delete(); +} +``` + + + +## 简单示例 + + + +## FAQ + +**Q:AtmoicFile 适用于哪些文件?** + +> A:**AtomicFile 适用一次性写入的文件**。根据 AtomicFile 原理可知,每一次获取写入文件的输出流的时候都会清空原文件的内容,所以是无法给文件追加内容的。 + +**Q:AtmoicFile 是否是线程安全的?** + +> A:根据其原理就可知它没有带线程锁,所以**AtomicFile并不能保证线程安全**。 + +**Q:文件写入完毕后可以直接关闭输出字节流(FileOutputStream)么?** + +> A:AtomicFile写入完毕后是不允许直接关闭字节流的,因为直接关闭字节流会导致备份文件没有删除,因而下次读取的时候会导致读取到的是原文件,而不是更新后的文件。 +> **写入完毕后应调用 finishWrite(正常写入完成) 或者 failWrite(写入失败)。** + +**Q:文件读取完毕后可以直接关闭输入字节流(FileInputStream)么?** + +> A:可以。 + + + +## 结语 + +AtomicFile 作为一个工具类,有其方便之处,同时也有一些需要注意的地方,另外,AtomicFile 除了上述方法之外,还有另外几个方法没有在本文中说明,这几个方法由于不安全,已经被标注删除和隐藏,故本文就不在赘述了。 + +事实上 AtomicFile 逻辑及其简单,应用场景也非常有限,如果需要的话自己徒手写一个也是可以的,个人觉得它的作用并不太大,如果以后大家在源码或者其他地方见到了这个类,知道它是干什么的就行了。 + +**最后,任何工具都是双刃剑,用好了伤人,用不好伤己,希望大家用之前好好了解一下其利弊,权衡之后再做决定。** + + + +## 参考资料 + +[Guide - AtomicFile](https://developer.android.com/reference/android/support/v4/util/AtomicFile.html) +[源码 - AtomicFile](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/util/AtomicFile.java) + + + +## About Me + +### 作者微博: @GcsSloop + + \ No newline at end of file From d757a4bddeae39da29cc2b985a5e5a348ebe241d Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 30 Nov 2016 20:52:29 +0800 Subject: [PATCH 514/615] Update --- ...20\347\240\201\350\247\243\346\236\220.md" | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git "a/SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" index 9c703a4d..e0e30774 100644 --- "a/SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -22,15 +22,16 @@ AtomicFile 在 `android.support.v4.util` 包下,**是一个与文件相关的 ## 主要方法 -| ~ | AtomicFile(File baseName)
构造方法,通过File创建AtomicFile | -| :--------------: | ---------------------------------------- | -| FileOutputStream | startWrite()
准备写文件,获得一个向文件写入的字节流(FileOutputStream)。 | -| void | finishWrite(FileOutputStream str)
写入完毕时调用。 | -| void | failWrite(FileOutputStream str)
写入失败时调用。 | -| FileInputStream | openRead()
准备读取文件,获得一个从文件读取的字节流(FileInputStream)。 | -| byte[] | readFully()
将文件中所有内容读取出来用 byte 数组返回,相当于更方便的 openRead 方法。 | -| File | getBaseFile()
获得原文件地址。 | -| void | delete()
删除 AtomicFile,包括原文件和备份文件。 | +| 返回值 | 方法名称和简介 | +| :------------------: | ---------------------------------------- | +| | **AtomicFile(File baseName)**
构造方法,通过File创建AtomicFile | +| **FileOutputStream** | **startWrite()**
准备写文件,获得一个向文件写入的字节流(FileOutputStream)。 | +| **void** | **finishWrite(FileOutputStream str)**
写入完毕时调用。 | +| **void** | **failWrite(FileOutputStream str)**
写入失败时调用。 | +| **FileInputStream** | **openRead()**
准备读取文件,获得一个从文件读取的字节流(FileInputStream)。 | +| **byte[]** | **readFully()**
将文件中所有内容读取出来用 byte 数组返回,相当于更方便的 openRead 方法。 | +| **File** | **getBaseFile()**
获得原文件地址。 | +| **void** | **delete()**
删除 AtomicFile,包括原文件和备份文件。 | ## AtomicFile 原理 From 920942b15277573471a6a387a0473ef6113cde51 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 30 Nov 2016 20:58:35 +0800 Subject: [PATCH 515/615] Update --- ...icFile\346\272\220\347\240\201\350\247\243\346\236\220.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" "b/SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" index e0e30774..6f6d8995 100644 --- "a/SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" +++ "b/SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" @@ -254,9 +254,9 @@ public void delete() { ## 结语 -AtomicFile 作为一个工具类,有其方便之处,同时也有一些需要注意的地方,另外,AtomicFile 除了上述方法之外,还有另外几个方法没有在本文中说明,这几个方法由于不安全,已经被标注删除和隐藏,故本文就不在赘述了。 +AtomicFile 作为一个工具类,有其方便之处,同时也有一些需要注意的地方,例如不能追加内容,另外,AtomicFile 除了上述方法之外,还有另外几个方法没有在本文中说明,这几个方法由于不安全,已经被标注删除和隐藏,故本文就不在赘述了。 -事实上 AtomicFile 逻辑及其简单,应用场景也非常有限,如果需要的话自己徒手写一个也是可以的,个人觉得它的作用并不太大,如果以后大家在源码或者其他地方见到了这个类,知道它是干什么的就行了。 +事实上 AtomicFile 逻辑非常简单,应用场景也有限,如果需要的话自己徒手写一个也是可以的,个人觉得它的作用并不太大,如果以后大家在源码或者其他地方见到了这个类,知道它是干什么的就行了。 **最后,任何工具都是双刃剑,用好了伤人,用不好伤己,希望大家用之前好好了解一下其利弊,权衡之后再做决定。** From d9147bc5725192a628fe0f85052485a843c60119 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 30 Nov 2016 21:03:19 +0800 Subject: [PATCH 516/615] Update --- .../AtomicFile.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" => SourceAnalysis/AtomicFile.md (100%) diff --git "a/SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" b/SourceAnalysis/AtomicFile.md similarity index 100% rename from "SourceAnalysis/AtomicFile\346\272\220\347\240\201\350\247\243\346\236\220.md" rename to SourceAnalysis/AtomicFile.md From 23f3f0087ee420120103258bf81464efab2520e6 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 1 Dec 2016 15:07:45 +0800 Subject: [PATCH 517/615] Update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ad505ae6..93adc842 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,7 @@ * 保持文章原文,不作修改。 * 明确署名,即至少注明 `作者:GcsSloop` 字样以及文章的原始链接,且不得使用 `rel="nofollow"` 标记。 * 商业用途请点击最下面图片联系本人。 +* 微信公众号转载一律不授权 原创 标志。 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From 48e2b94aa52fdfded8b373d3e27380fbd0cc2fc0 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 2 Dec 2016 19:07:48 +0800 Subject: [PATCH 518/615] Update --- SourceAnalysis/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 SourceAnalysis/README.md diff --git a/SourceAnalysis/README.md b/SourceAnalysis/README.md new file mode 100644 index 00000000..f1aaca6a --- /dev/null +++ b/SourceAnalysis/README.md @@ -0,0 +1,2 @@ +# 源码解析 + From 7d3e47f4250a77ced140c317019571c972b3166f Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 3 Dec 2016 21:59:52 +0800 Subject: [PATCH 519/615] Update --- SourceAnalysis/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/SourceAnalysis/README.md b/SourceAnalysis/README.md index f1aaca6a..6924a8e2 100644 --- a/SourceAnalysis/README.md +++ b/SourceAnalysis/README.md @@ -1,2 +1,3 @@ # 源码解析 +* [AtomicFile 源码解析](https://github.com/GcsSloop/AndroidNote/blob/master/SourceAnalysis/AtomicFile.md) From ce39fd7785abd003f253b21d00fb44302de58694 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 7 Dec 2016 13:24:41 +0800 Subject: [PATCH 520/615] Update --- Course/Markdown/markdown-editor.md | 124 +++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 Course/Markdown/markdown-editor.md diff --git a/Course/Markdown/markdown-editor.md b/Course/Markdown/markdown-editor.md new file mode 100644 index 00000000..cba314c7 --- /dev/null +++ b/Course/Markdown/markdown-editor.md @@ -0,0 +1,124 @@ +# Markdown实用技巧-编辑器(Typora) + +本次的安利对象是一个 Markdown 编辑器,是会长[^1]见过的最简单,最优雅的编辑器,先来看一下它的界面吧: + +![QQ20161207-0](http://ww3.sinaimg.cn/large/006y8lVajw1fahmo8d9udj30ph0brgo0.jpg) + + + +它的界面非常简单,有多种主题可选,更重要的是**它的预览界面和编辑界面是一体的,而不像其他编辑器那样是左右分开的。** + +![](http://ww2.sinaimg.cn/large/005Xtdi2jw1fahnsrelggg30fp0dwakd.gif) + +从上面的示例中可以看出,其输入模式支持多种,不论是手动输入语法还是使用快捷键,都非常的流畅,实时看到效果变化,除此之外 Typora 还有很多优点。 + +## Typora 的优点 + +* 预览和编辑界面一体。 +* 强大的快捷键。 +* 兼容常见扩展语法。 +* 兼容 HTML (新版进行了完善)。 +* 支持 YAML 格式。 +* 支持公式编辑(LaTeX公式)。 +* 表格和代码块编辑起来非常方便。 +* 支持本地图片相对链接。 +* 支持将本地图片拖进编辑页面。 +* 支持多种导出格式(PDF,HTML,Word,LaTeX 等)。 +* 有多种主题可选。 + +虽然上面的内容在其他编辑器上也可以见到,但做到这么完善的并不多,想要尝试的小伙伴赶紧来试试吧,相信你也会爱上它的。 + +#### [点击这里进入 Typora 官网](http://www.typora.io/){:target="_blank"} + +既然 Typora 这么好,为什么不在一开始就推荐呢,这是因为在 Markdown 系列文章第一篇发布的时候,Typora 还有一些小瑕疵(HTML语法兼容部分)让会长不满意,所以只是放在了推荐首位,在最近更新了新版本之后,这一部分已经修复完善了,基本算是完美了,所以会长我才特地写一篇文章来推荐。 + +**Typora 支持在 WIndows,Linux,和 Mac 上使用,如果你正在使用的是 Mac 的话,那么恭喜你,除了上述的优点,你可以用到一些 Mac 系统才有的福利。** + +## 版本回溯功能 + +这是 Mac 系统提供的一个小功能,使用 Mac 的时候你可能会注意到一个小细节,**使用系统文本编辑器进行编辑文本的时候,从来不会提示你保存文本,即便编辑后不点保存立即退出里面的内容也不会丢失。**你可能会觉得这不就是一个自动保存功能么,有啥稀奇的? + +那么你是否遇到过这一种情况,编辑了半天的内容觉得不太好想放弃保存,继续使用之前的内容,这在Windows上很容易实现,只要编辑的时候没有手动保存,直接点击关闭不保存,再打开的时候就是编辑之前的内容。 + +然而在 Mac 上自动保存了,如果关闭后再打开,点 `Command + Z` 也没用了,这不就尴尬了,难道说遇到这种情况只能关闭前狂点 `Command + Z` 回退? + +作为一个有情怀的操作系统,自然不会意识不到这个问题,它提供了更强大的方法,那就是版本回溯,相当于一个自动的 Git 系统,这就厉害了。 + +Trpora 也用到了这一特性,点击 `File > Revert To > Browse All Versions` 就能看到了。以我之前发布的一篇文章为例: + +![](http://ww2.sinaimg.cn/large/006y8lVajw1facti4okblj31400p0gs8.jpg) + + **上图中左边为当前版本,右边为选中版本,最右侧是时间线,使用这一功能可以将文章回溯到任意时间点,妈妈再也不怕我的文章内容丢失啦,也成功避免了以下这种情况 ▼** + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1factpcyrfqj30rs0ja40l.jpg) + +由于这一功能是 Mac 系统提供的,所以不仅对纯文本有效,对 iWork 也是有效的,iWork 上面也有版本回溯功能,像 key,numbers,pages 都支持版本回溯,中文版点 `文件 > 复原 > 浏览所有版本` 即可看到过去保存的数据。 + +当然了,这只是福利之一。 + +## 更便捷的图片插入和上传方式 + +众所周知,Markdown 插入图片是一个大问题,尤其是在本地编辑的时候,但是这些在遇到 Typora 后就变的越来越简单了。 + +**对于本地图片,我们可以直接拖进来,再也不用记复杂的语法和查图片地址了,没错,只要拖进来就行,Typora 会自动识别图片并进行插入。** + +不过还有一个问题,我们的很多文章都是要发布的,直接拖进来这种方式在本地看起来没问题,但上传到网站上是读取不到本地图片的,通常解决方案就是先上传到图床上,之后再将链接插入到 Markdown 中,这样发布就没问题了。 + +但是,当一篇文章需要插入很多图片的时候,一次次的上传,一次次的复制链接,一次次的粘贴,也是很麻烦的,虽然有一些脚本可以通过快捷键进行上传,但终归还是多了一些步骤,很不方便,而且对新手很不友好,更何况很多新手根本不知道图床所谓何物。 + +这时候就要祭出 Mac 上另一个神器了: iPic [(点击此处进行下载)](https://itunes.apple.com/cn/app/ipic-tu-chuang-shen-qi-zhong/id1101244278?mt=12){:target="_blank"},它是一个专业图床管理工具,貌似出来还没多久,目前免费版只能上传到微博图床,专业版支持大部分图床,专业版一年 30RMB,如果经常使用的话,倒也不算贵。 + +**话说不还是要用图床么?** + +**但 Typora 的方便之处就在于可以和 iPic 无缝结合,纯傻瓜式一键操作,能一次性的将文章中所有本地图片上传到图床上。** + +**首先安装 iPic,运行 iPic,之后点击 `Edit > Image Tools > Upload Local Images via iPic` 就像下面这样就行了。** + +![![QQ20161207-0](../Downloads/QQ20161207-0.png)QQ20161202-8](http://ww1.sinaimg.cn/large/006y8lVajw1facuf1yjjkj30fo0dmq4v.jpg) + +**如果你觉得这样还是很麻烦的话,还有另外的选项,可以选择插入本地图片的时候自动上传到服务器,当然了,为了保护个人隐私,这一个选项默认是关闭的,首先你要找到首选项,点击 `Typora > Preferences` 或者快捷键 `Command + ,` 都行,之后打开以下两个选项,其中一个选项是后面用到的。** + +![QQ20161202-9](http://ww3.sinaimg.cn/large/006y8lVajw1fahlaeo8pej30by0ddgn8.jpg) + +**打开之后继续选择 `Edit > Image Tools > When Insert Local Images > Upload Image via iPic` 它的意思是当插入本地图片时自动通过 iPic 上传到服务器上。** + +![QQ20161203-0](http://ww2.sinaimg.cn/large/006y8lVajw1fahlajkq1gj30qe0hwtas.jpg) + +这种方案虽然方便,但是会长并不推荐大家这么做,主要还是不安全,误操作的话可能会将一些包含个人隐私的照片上传上去。 + +会长推荐另一种方案,就是 `Copy Image File to Folder`,操作步骤和上面类似,它的意思是插入本地图片时自动归档到某一个文件夹,在文章编辑完成后在点击上传按钮统一上传,这样有以下几点好处: + +* 安全,不会因为误操作将涉及隐私照片传到服务器上。 +* 相当于自动建立了一个本地图片档案,方便备份保存。 +* 如果图床上的图片丢失,可以从快速从本地备份中找到并恢复。 + + +关于 Typora 的推荐内容暂时就到这里结束啦,更多关于 Typora 的多详情请参阅 [Support](http://support.typora.io/){:target="_blank"}。关于 Markdown 的更多内容请参见之前的文章: + +[Markdown实用技巧-快速入门](https://www.gcssloop.com/markdown/markdown-start){:target="_blank"} +[Markdown实用技巧-基础语法](https://www.gcssloop.com/markdown/markdown-grammar){:target="_blank"} +[Markdown实用技巧-链接和图片](https://www.gcssloop.com/markdown/markdown-links){:target="_blank"} + +## 结语 + +最后稍微夹带一点个人建议,个人觉得 Typora 除了界面简洁之外,最大的优点就是快捷键方便了,然而,快捷键那么多,要不要专一去记呢? + +个人的建议是不要专一去记忆这些快捷键,用到的时候打开菜单看一眼快捷键是什么,之后用快捷键按出来,这样用过几次之后自然就会记住常用的快捷键,而且会记得很牢固,不然每个应用都有快捷键,一个一个的记多麻烦。 + +本文中涉及到的两个软件下载地址: + +[**Typora**](http://www.typora.io/){:target="_blank"} +[**iPic**](https://itunes.apple.com/cn/app/id1101244278?ls=1&mt=12){:target="_blank"} + +**最后留一个课后作业,关注会长的 [新浪微博](http://weibo.com/GcsSloop){:target="_blank"} 。** + +## About Me + +### 作者微博: @GcsSloop + + + +[^1]: 会长,就是 GcsSloop 我啦,因为创建了一个名为魔法师协会的交流群,所以自称会长,想要加入魔法师协会的魔法师可以加我的微信 `GcsSloop`,备注加群或者私信我,我会邀请你加入魔法师的大家庭。 + + + From 5e58e99bdac8cf739cfd886de2269e870f101acc Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 7 Dec 2016 13:27:03 +0800 Subject: [PATCH 521/615] Update --- Course/Markdown/markdown-editor.md | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/Course/Markdown/markdown-editor.md b/Course/Markdown/markdown-editor.md index cba314c7..85eb6aae 100644 --- a/Course/Markdown/markdown-editor.md +++ b/Course/Markdown/markdown-editor.md @@ -1,6 +1,6 @@ # Markdown实用技巧-编辑器(Typora) -本次的安利对象是一个 Markdown 编辑器,是会长[^1]见过的最简单,最优雅的编辑器,先来看一下它的界面吧: +本次的安利对象是一个 Markdown 编辑器,是会长见过的最简单,最优雅的编辑器,先来看一下它的界面吧: ![QQ20161207-0](http://ww3.sinaimg.cn/large/006y8lVajw1fahmo8d9udj30ph0brgo0.jpg) @@ -28,7 +28,7 @@ 虽然上面的内容在其他编辑器上也可以见到,但做到这么完善的并不多,想要尝试的小伙伴赶紧来试试吧,相信你也会爱上它的。 -#### [点击这里进入 Typora 官网](http://www.typora.io/){:target="_blank"} +#### [点击这里进入 Typora 官网](http://www.typora.io/) 既然 Typora 这么好,为什么不在一开始就推荐呢,这是因为在 Markdown 系列文章第一篇发布的时候,Typora 还有一些小瑕疵(HTML语法兼容部分)让会长不满意,所以只是放在了推荐首位,在最近更新了新版本之后,这一部分已经修复完善了,基本算是完美了,所以会长我才特地写一篇文章来推荐。 @@ -66,7 +66,7 @@ Trpora 也用到了这一特性,点击 `File > Revert To > Browse All Versions 但是,当一篇文章需要插入很多图片的时候,一次次的上传,一次次的复制链接,一次次的粘贴,也是很麻烦的,虽然有一些脚本可以通过快捷键进行上传,但终归还是多了一些步骤,很不方便,而且对新手很不友好,更何况很多新手根本不知道图床所谓何物。 -这时候就要祭出 Mac 上另一个神器了: iPic [(点击此处进行下载)](https://itunes.apple.com/cn/app/ipic-tu-chuang-shen-qi-zhong/id1101244278?mt=12){:target="_blank"},它是一个专业图床管理工具,貌似出来还没多久,目前免费版只能上传到微博图床,专业版支持大部分图床,专业版一年 30RMB,如果经常使用的话,倒也不算贵。 +这时候就要祭出 Mac 上另一个神器了: iPic [(点击此处进行下载)](https://itunes.apple.com/cn/app/ipic-tu-chuang-shen-qi-zhong/id1101244278?mt=12),它是一个专业图床管理工具,貌似出来还没多久,目前免费版只能上传到微博图床,专业版支持大部分图床,专业版一年 30RMB,如果经常使用的话,倒也不算贵。 **话说不还是要用图床么?** @@ -93,11 +93,11 @@ Trpora 也用到了这一特性,点击 `File > Revert To > Browse All Versions * 如果图床上的图片丢失,可以从快速从本地备份中找到并恢复。 -关于 Typora 的推荐内容暂时就到这里结束啦,更多关于 Typora 的多详情请参阅 [Support](http://support.typora.io/){:target="_blank"}。关于 Markdown 的更多内容请参见之前的文章: +关于 Typora 的推荐内容暂时就到这里结束啦,更多关于 Typora 的多详情请参阅 [Support](http://support.typora.io/)。关于 Markdown 的更多内容请参见之前的文章: -[Markdown实用技巧-快速入门](https://www.gcssloop.com/markdown/markdown-start){:target="_blank"} -[Markdown实用技巧-基础语法](https://www.gcssloop.com/markdown/markdown-grammar){:target="_blank"} -[Markdown实用技巧-链接和图片](https://www.gcssloop.com/markdown/markdown-links){:target="_blank"} +[Markdown实用技巧-快速入门](https://www.gcssloop.com/markdown/markdown-start) +[Markdown实用技巧-基础语法](https://www.gcssloop.com/markdown/markdown-grammar) +[Markdown实用技巧-链接和图片](https://www.gcssloop.com/markdown/markdown-links) ## 结语 @@ -107,10 +107,10 @@ Trpora 也用到了这一特性,点击 `File > Revert To > Browse All Versions 本文中涉及到的两个软件下载地址: -[**Typora**](http://www.typora.io/){:target="_blank"} -[**iPic**](https://itunes.apple.com/cn/app/id1101244278?ls=1&mt=12){:target="_blank"} +[**Typora**](http://www.typora.io/) +[**iPic**](https://itunes.apple.com/cn/app/id1101244278?ls=1&mt=12) -**最后留一个课后作业,关注会长的 [新浪微博](http://weibo.com/GcsSloop){:target="_blank"} 。** +**最后留一个课后作业,关注会长的 [新浪微博](http://weibo.com/GcsSloop) 。** ## About Me @@ -118,7 +118,3 @@ Trpora 也用到了这一特性,点击 `File > Revert To > Browse All Versions -[^1]: 会长,就是 GcsSloop 我啦,因为创建了一个名为魔法师协会的交流群,所以自称会长,想要加入魔法师协会的魔法师可以加我的微信 `GcsSloop`,备注加群或者私信我,我会邀请你加入魔法师的大家庭。 - - - From b3c56ef2ca3857797f49a4ecbf078588d4199a36 Mon Sep 17 00:00:00 2001 From: sloop Date: Thu, 8 Dec 2016 23:09:23 +0800 Subject: [PATCH 522/615] Update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 93adc842..37284147 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ * [Markdown 快速入门](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-start.md) * [Markdown 基础语法](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-grammar.md) * [Markdown 链接图片](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-link.md) +* [Markdown 编辑器](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-editor.md) ****** From 03bcb466b7c5cacbe7a15ded5d675dd014880fd5 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 10 Dec 2016 23:27:20 +0800 Subject: [PATCH 523/615] Update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 37284147..6e1eef7f 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ 新开的博客,在博客中可以获得更好的阅读体验,同时在博客的评论区可以更及时的向我反馈文章中的问题。 - + ****** @@ -132,6 +132,6 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) - + [▲ 回到顶部](#top) From 087d1dcaa72b6452683d1b77eb7157a027ef9ce8 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 11 Dec 2016 23:55:15 +0800 Subject: [PATCH 524/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e1eef7f..739e3537 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -我的安卓学习笔记,记录学习过程中遇到的问题,以及我的一些经验总结。如果出现链接失效等情况可以提交Issues提醒我修改相关内容。 +我的安卓学习笔记,记录学习过程中遇到的问题,以及我的一些经验总结。如果出现链接失效等情况可以提交 Issues 提醒我修改相关内容。 > #### PS:点击分类标题可以查看该分类的详细信息。 From b0ce08cf98e34b1701fed48b2ed2132a3e61de4b Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 12 Dec 2016 18:05:49 +0800 Subject: [PATCH 525/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 739e3537..73d11e95 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ * 保持文章原文,不作修改。 * 明确署名,即至少注明 `作者:GcsSloop` 字样以及文章的原始链接,且不得使用 `rel="nofollow"` 标记。 * 商业用途请点击最下面图片联系本人。 -* 微信公众号转载一律不授权 原创 标志。 +* 微信公众号转载一律不授权 `原创` 标志。 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From e1adb04a03b5aec63bd268ecac1be4e95a382869 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 13 Dec 2016 23:12:58 +0800 Subject: [PATCH 526/615] Update --- CustomView/Advance/[18]multi-touch.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 CustomView/Advance/[18]multi-touch.md diff --git a/CustomView/Advance/[18]multi-touch.md b/CustomView/Advance/[18]multi-touch.md new file mode 100644 index 00000000..a72ff088 --- /dev/null +++ b/CustomView/Advance/[18]multi-touch.md @@ -0,0 +1,2 @@ +# 多点触控 + From 9a9be4f9cd3a5d0b7e0ffb621a5f10da836e1180 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 14 Dec 2016 23:35:54 +0800 Subject: [PATCH 527/615] Update --- Course/Markdown/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Course/Markdown/README.md diff --git a/Course/Markdown/README.md b/Course/Markdown/README.md new file mode 100644 index 00000000..dd66a5c7 --- /dev/null +++ b/Course/Markdown/README.md @@ -0,0 +1 @@ +# Markdown 实用技巧 From aef35551b2c0c0acfcc63c491caa41b7536c0141 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 16 Dec 2016 23:39:17 +0800 Subject: [PATCH 528/615] Update --- Course/Markdown/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Course/Markdown/README.md b/Course/Markdown/README.md index dd66a5c7..a35826e3 100644 --- a/Course/Markdown/README.md +++ b/Course/Markdown/README.md @@ -1 +1,6 @@ # Markdown 实用技巧 + +* [Markdown 快速入门](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-start.md) +* [Markdown 基础语法](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-grammar.md) +* [Markdown 链接图片](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-link.md) +* [Markdown 编辑器](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-editor.md) From 90db239a7f90812c9254588eaf0fba68ac099eaf Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 17 Dec 2016 23:14:14 +0800 Subject: [PATCH 529/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 73d11e95..501b0674 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ ****** -## Markdown +## [Markdown](https://github.com/GcsSloop/AndroidNote/tree/master/Course/Markdown) * [Markdown 快速入门](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-start.md) * [Markdown 基础语法](https://github.com/GcsSloop/AndroidNote/blob/master/Course/Markdown/markdown-grammar.md) From 014c84d84402586e517b8735e91cd96c70d09c45 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 20 Dec 2016 04:23:06 +0800 Subject: [PATCH 530/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 766 +++++++++++++++---------- 1 file changed, 459 insertions(+), 307 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index b4f4b346..96068632 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -1,51 +1,29 @@ -# Matrix原理 +# Matrix 原理 -### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) - - -## 目录 - -- [前言](#qianyan) -- [Matrix简介](#jianjie) -- [Matrix基本原理](#jiben) -- [Matrix复合原理](#fuhe) -- [Matrix方法表](#fangfa) -- [总结](#zongjie) -- [关于作者](#about) -- [参考资料](#ziliao) - -

-## 前言 - -本文内容偏向理论,和 [画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B03%5DCanvas_Convert.md) 有重叠的部分,本文会让你更加深入的了解其中的原理。 +本文内容偏向理论,和 [画布操作](http://www.gcssloop.com/customview/Canvas_Convert/) 有重叠的部分,本文会让你更加深入的了解其中的原理。 本篇的主角Matrix,是一个一直在后台默默工作的劳动模范,虽然我们所有看到View背后都有着Matrix的功劳,但我们却很少见到它,本篇我们就看看它是何方神圣吧。 -> ->由于Google已经对这一部分已经做了很好的封装,所以跳过本部分对实际开发影响并不会太大,不想深究的粗略浏览即可,下一篇中将会详细讲解Matrix的具体用法和技巧。 +> 由于Google已经对这一部分已经做了很好的封装,所以跳过本部分对实际开发影响并不会太大,不想深究的粗略浏览即可,下一篇中将会详细讲解Matrix的具体用法和技巧。 -****** +> ## ⚠️ 警告:测试本文章示例之前请关闭硬件加速。 -

## Matrix简介 -

**Matrix是一个矩阵,主要功能是坐标映射,数值转换。** 它看起来大概是下面这样: -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} -MSCALE\\_X & MSKEW\\_X & MTRANS\\_X \\\\ -\\\\ -MSKEW\\_Y & MSCALE\\_Y & MTRANS\\_Y \\\\ -\\\\ -MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 -\\end{1} -\\right ] +![](http://latex.codecogs.com/png.latex?$$ +\left [ +\begin{matrix} +MSCALE\_X & MSKEW\_X & MTRANS\_X \ +\ +MSKEW\_Y & MSCALE\_Y & MTRANS\_Y \ +\ +MPERSP\_0 & MPERSP\_1 & MPERSP\_2 +\end{1} +\right ] $$) **Matrix作用就是坐标映射,那么为什么需要Matrix呢? 举一个简单的例子:** @@ -55,7 +33,7 @@ $$) 以下图为例,我们的内容区和屏幕坐标系还相差一个通知栏加一个标题栏的距离,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的物理坐标系来绘制,Matrix在此处的作用就是转换这些数值。 > -假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点。 +>假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点。 ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f624vi3eb6j30rs0goab5.jpg) @@ -66,12 +44,14 @@ $$) ### Matrix特点 * 作用范围更广,Matrix在View,图片,动画效果等各个方面均有运用,相比与之前讲解等画布操作应用范围更广。 + * 更加灵活,画布操作是对Matrix的封装,Matrix作为更接近底层的东西,必然要比画布操作更加灵活。 + * 封装很好,Matrix本身对各个方法就做了很好的封装,让开发者可以很方便的操作Matrix。 -* + * 难以深入理解,很难理解中各个数值的意义,以及操作规律,如果不了解矩阵,也很难理解前乘,后乘。 -

+ ### 常见误解 **1.认为Matrix最下面的一行的三个参数(MPERSP_0、MPERSP_1、MPERSP_2)没有什么太大的作用,在这里只是为了凑数。** @@ -82,9 +62,7 @@ $$) 的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。 -****** -

## Matrix基本原理 Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就看看几种常见变换的原理: @@ -105,37 +83,36 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 ### 1.缩放(Scale) -![](http://latex.codecogs.com/png.latex?$$ x = k_1 x_0 $$) +![](http://latex.codecogs.com/png.latex?$$x = k_1 x_0 $$) -![](http://latex.codecogs.com/png.latex?$$ y = k_2 y_0 $$) +![](http://latex.codecogs.com/png.latex?$$y = k_2 y_0 $$) 用矩阵表示: -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} -x\\\\ -y\\\\ +![](http://latex.codecogs.com/png.latex?$$ +\left [ +\begin{matrix} +x\\ +y\\ 1 -\\end{1} -\\right ] +\end{1} +\right ] = -\\left [ -\\begin{matrix} -k_1 & 0 & 0 \\\\ - 0 & k_2 & 0 \\\\ +\left [ +\begin{matrix} +k_1 & 0 & 0 \\ + 0 & k_2 & 0 \\ 0 & 0 & 1 -\\end{1} -\\right ] -\\left [ -\\begin{matrix} -x_0 \\\\ -y_0 \\\\ +\end{1} +\right ] +\left [ +\begin{matrix} +x_0 \\ +y_0 \\ 1 -\\end{1} -\\right ] +\end{1} +\right ] $$) > @@ -150,6 +127,7 @@ $$) ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f6cnk02zy9j308c0dwwej.jpg) + ### 2.错切(Skew) 错切存在两种特殊错切,水平错切(平行X轴)和垂直错切(平行Y轴)。 @@ -162,30 +140,29 @@ $$) 用矩阵表示: -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} -x\\\\ -y\\\\ +![](http://latex.codecogs.com/png.latex?$$ +\left [ +\begin{matrix} +x\\ +y\\ 1 -\\end{1} -\\right ] +\end{1} +\right ] = -\\left [ -\\begin{matrix} - 1 & k & 0 \\\\ - 0 & 1 & 0 \\\\ +\left [ +\begin{matrix} + 1 & k & 0 \\ + 0 & 1 & 0 \\ 0 & 0 & 1 -\\end{1} -\\right ] -\\left [ -\\begin{matrix} -x_0\\\\ -y_0\\\\ +\end{1} +\right ] +\left [ +\begin{matrix} +x_0\\ +y_0\\ 1 -\\end{1} -\\right ] +\end{1} +\right ] $$) 图例: @@ -200,30 +177,29 @@ $$) 用矩阵表示: -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} -x\\\\ -y\\\\ +![](http://latex.codecogs.com/png.latex?$$ +\left [ +\begin{matrix} +x\\ +y\\ 1 -\\end{1} -\\right ] +\end{1} +\right ] = -\\left [ -\\begin{matrix} - 1 & 0 & 0 \\\\ - k & 1 & 0 \\\\ +\left [ +\begin{matrix} + 1 & 0 & 0 \\ + k & 1 & 0 \\ 0 & 0 & 1 -\\end{1} -\\right ] -\\left [ -\\begin{matrix} -x_0\\\\ -y_0\\\\ +\end{1} +\right ] +\left [ +\begin{matrix} +x_0\\ +y_0\\ 1 -\\end{1} -\\right ] +\end{1} +\right ] $$) 图例: @@ -240,30 +216,29 @@ $$) 用矩阵表示: -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} -x\\\\ -y\\\\ +![](http://latex.codecogs.com/png.latex?$$ +\left [ +\begin{matrix} +x\\ +y\\ 1 -\\end{1} -\\right ] +\end{1} +\right ] = -\\left [ -\\begin{matrix} - 1 & k_1 & 0 \\\\ - k_2 & 1 & 0 \\\\ +\left [ +\begin{matrix} + 1 & k_1 & 0 \\ + k_2 & 1 & 0 \\ 0 & 0 & 1 -\\end{1} -\\right ] -\\left [ -\\begin{matrix} -x_0\\\\ -y_0\\\\ +\end{1} +\right ] +\left [ +\begin{matrix} +x_0\\ +y_0\\ 1 -\\end{1} -\\right ] +\end{1} +\right ] $$) 图例: @@ -274,51 +249,48 @@ $$) 假定一个点 A(x0, y0) ,距离原点距离为 r, 与水平轴夹角为 α 度, 绕原点旋转 θ 度, 旋转后为点 B(x, y) 如下: -![](http://latex.codecogs.com/png.latex? $$ x_0 = r \\cdot cos \\alpha $$) +![](http://latex.codecogs.com/png.latex?$$ x_0 = r \cdot cos \alpha $$) -![](http://latex.codecogs.com/png.latex? $$ y_0 = r \\cdot sin \\alpha $$) +![](http://latex.codecogs.com/png.latex?$$ y_0 = r \cdot sin \alpha $$) -![](http://latex.codecogs.com/png.latex? -$$ -x = r \\cdot cos( \\alpha + \\theta) -= r \\cdot cos \\alpha \\cdot cos \\theta - r \\cdot sin \\alpha \\cdot sin \\theta -= x_0 \\cdot cos \\theta - y_0 \\cdot sin \\theta +![](http://latex.codecogs.com/png.latex?$$ +x = r \cdot cos( \alpha + \theta) += r \cdot cos \alpha \cdot cos \theta - r \cdot sin \alpha \cdot sin \theta += x_0 \cdot cos \theta - y_0 \cdot sin \theta $$) -![](http://latex.codecogs.com/png.latex? -$$ -y = r \\cdot sin( \\alpha + \\theta) -= r \\cdot sin \\alpha \\cdot cos \\theta + r \\cdot cos \\alpha \\cdot sin \\theta -= y_0 \\cdot cos \\theta + x_0 \\cdot sin \\theta +![](http://latex.codecogs.com/png.latex?$$ +y = r \cdot sin( \alpha + \theta) += r \cdot sin \alpha \cdot cos \theta + r \cdot cos \alpha \cdot sin \theta += y_0 \cdot cos \theta + x_0 \cdot sin \theta $$) 用矩阵表示: -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} -x\\\\ -y\\\\ +![](http://latex.codecogs.com/png.latex?$$ +\left [ +\begin{matrix} +x\\ +y\\ 1 -\\end{1} -\\right ] +\end{1} +\right ] = -\\left [ -\\begin{matrix} -cos(\\theta) & -sin(\\theta) & 0 \\\\ -sin(\\theta) & cos(\\theta) & 0 \\\\ +\left [ +\begin{matrix} +cos(\theta) & -sin(\theta) & 0 \\ +sin(\theta) & cos(\theta) & 0 \\ 0 & 0 & 1 -\\end{1} -\\right ] +\end{1} +\right ] . -\\left [ -\\begin{matrix} -x_0\\\\ -y_0\\\\ +\left [ +\begin{matrix} +x_0\\ +y_0\\ 1 -\\end{1} -\\right ] +\end{1} +\right ] $$) 图例: @@ -331,37 +303,36 @@ $$) > > 此处也是使用齐次坐标的优点体现之一,实际上前面的三个操作使用 2x2 的矩阵也能满足需求,但是使用 2x2 的矩阵,无法将平移操作加入其中,而将坐标扩展为齐次坐标后,将矩阵扩展为 3x3 就可以将算法统一,四种算法均可以使用矩阵乘法完成。 -![](http://latex.codecogs.com/png.latex?$$ x = x_0 + \\Delta x $$) +![](http://latex.codecogs.com/png.latex?$$ x = x_0 + \Delta x $$) -![](http://latex.codecogs.com/png.latex?$$ y = y_0 + \\Delta y $$) +![](http://latex.codecogs.com/png.latex?$$ y = y_0 + \Delta y $$) 用矩阵表示: -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} -x\\\\ -y\\\\ +![](http://latex.codecogs.com/png.latex?$$ +\left [ +\begin{matrix} +x\\ +y\\ 1 -\\end{1} -\\right ] +\end{1} +\right ] = -\\left [ -\\begin{matrix} -1 & 0 & \\Delta x \\\\ -0 & 1 & \\Delta y \\\\ +\left [ +\begin{matrix} +1 & 0 & \Delta x \\ +0 & 1 & \Delta y \\ 0 & 0 & 1 -\\end{1} -\\right ] +\end{1} +\right ] . -\\left [ -\\begin{matrix} -x_0\\\\ -y_0\\\\ +\left [ +\begin{matrix} +x_0\\ +y_0\\ 1 -\\end{1} -\\right ] +\end{1} +\right ] $$) 图例: @@ -369,7 +340,6 @@ $$) ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f6dqiw20xoj308c0dw0su.jpg) -

## Matrix复合原理 其实Matrix的多种复合操作都是使用矩阵乘法实现的,从原理上理解很简单,但是,使用矩阵乘法也有其弱点,后面的操作可能会影响到前面到操作,所以在构造Matrix时顺序很重要。 @@ -379,14 +349,16 @@ $$) ### 前乘(pre) 前乘相当于矩阵的右乘: -![](http://latex.codecogs.com/png.latex?$$ M' = M \\cdot S $$) + +![](http://latex.codecogs.com/png.latex?$$ M' = M \cdot S $$) > 这表示一个矩阵与一个特殊矩阵前乘后构造出结果矩阵。 ### 后乘(post) 前乘相当于矩阵的左乘: -![](http://latex.codecogs.com/png.latex?$$ M' = S \\cdot M $$) + +![](http://latex.codecogs.com/png.latex?$$ M' = S \cdot M $$) > 这表示一个矩阵与一个特殊矩阵后乘后构造出结果矩阵。 @@ -396,63 +368,245 @@ $$) ## 组合 -我们使用Matrix最终目的就是让视图显示为我们想要的状态,为此我们可能需要多种操作结合使用。 +**关于 Matrix 的文章终有一个问题,就是 pre 和 post 这一部分的理论非常别扭,国内大多数文章都是这样的,看起来貌似是对的但很难理解,部分内容违背直觉。** -我发现很多讲解Matrix的文章喜欢用绕某一个点缩放(旋转)的示例来讲解,如下: +**我由于也受到了这些文章的影响,自然而然的继承了这一理论,直到在评论区有一位小伙伴提出了一个问题,才让我重新审视了这一部分的内容,并进行了一定反思。** +我思考的主要有以下部分: +1. pre 和 post 的具体含义和作用。 +2. 矩阵构造过程中的正确影响顺序。 +3. 误解产生的具体源头。 + +经过良久的思考之后,我决定推翻之前的理论和结论,重新构建了这一部分的理论知识,也许仍有疏漏,如有发现请指正。 + +**首先澄清两个错误结论,记住,是错误结论,错误结论,错误结论。** + +### ~~错误结论一:pre 是顺序执行,post 是逆序执行。~~ + +这个结论很具有迷惑性,因为这个结论并非是完全错误的,你很容易就能证明这个结论,例如下面这样: + +```java +// 第一段 pre 顺序执行,先平移(T)后旋转(R) +Matrix matrix = new Matrix(); +matrix.preTranslate(pivotX,pivotY); +matrix.preRotate(angle); +Log.e("Matrix", matrix.toShortString()); + +// 第二段 post 逆序执行,先平移(T)后旋转(R) +Matrix matrix = new Matrix(); +matrix.postRotate(angle); +matrix.postTranslate(pivotX,pivotY) +Log.e("Matrix", matrix.toShortString()); +``` + +**这两段代码最终结果是等价的,于是轻松证得这个结论的正确性,但事实真是这样么?** + +首先,从数学角度分析,pre 和 post 就是右乘或者左乘的区别,其次,它们不可能实际影响运算顺序(程序执行顺序)。以上这两段代码等价也仅仅是因为最终化简公式一样而已。 + +> 设原始矩阵为 M,平移为 T ,旋转为 R ,单位矩阵为 I ,最终结果为 M' > - 那么我们如果想让它基于图片中心缩放,应该该怎么办?要用到组合变换, - 1)先将图片由中心平移到原点,这是应用变换 T - 2)对图应用缩放变换 S - 3)再将图片平移回到中心,应用变换 -T - -> - 对应代码: - matrix.postScale(0.5f, 0.5f); - matrix.preTranslate(-pivotX, -pivotY); - matrix.postTranslate(pivotX, pivotY); -> - PS: 此段文字引用自其它文章。 +> * 矩阵乘法不满足交换律,即 A\*B ≠ B\*A +> * 矩阵乘法满足结合律,即 (A\*B)\*C = A\*(B\*C) +> * 矩阵与单位矩阵相乘结果不变,即 A * I = A -首先,**这个思路是没有任何问题的,也是实现绕某一点操作的核心原理**,但这可能会对一部分小白造成误解,认为只能这样实现,然而查看一下Matrix的方法表就能知道四大操作都可以指定中心点,所以,上面的三行代码用一行就能完成: +``` +由于上面例子中原始矩阵(M)是一个单位矩阵(I),所以可得: + +// 第一段 pre +M' = (M*T)*R = I*T*R = T*R + +// 第二段 post +M' = T*(R*M) = T*R*I = T*R +``` + +由于两者最终的化简公式是相同的,所以两者是等价的,但是,这结论不具备普适性。 + +**即原始矩阵不为单位矩阵的时候,两者无法化简为相同的公式,结果自然也会不同。另外,执行顺序就是程序书写顺序,不存在所谓的正序逆序。** + +### ~~错误结论二:pre 是先执行,而 post 是后执行。~~ + +这一条结论比上一条更加扯淡,同样是错误的,而且错的更离谱。 + +之所以产生这个错误完全是因为写文章的人懂英语。 + +``` +pre :先,和 before 相似。 +post :后,和 after 相似。 +``` + +所以就得出了 pre 先执行,而 post 后执行这一说法,但从严谨的数学和程序角度来分析,完全是扯淡的,还是上面所说的,**pre 和 post 不能影响程序执行顺序,而程序每执行一条语句都会得出一个确定的结果,所以,它根本不能控制先后执行,属于完全扯淡型。** + +**如果非要用这套理论强行解释的话,反而看起来像是 post 先执行,例如:** ```java -matrix.postScale(0.5f, 0.5f, pivotX, pivotY); +matrix.preRotate(angle); +matrix.postTranslate(pivotX,pivotY); ``` -**组合操作构造Matrix时,个人建议尽量全部使用后乘或者全部使用前乘,这样操作顺序容易确定,出现问题也比较容易排查。
当然,由于矩阵乘法不满足交换律,前乘和后乘的结果是不同的,使用时应结合具体情景分析使用。** +同样化简公式: + +``` +// 矩阵乘法满足结合律 +M‘ = T*(M*R) = T*M*R = (T*M)*R +``` + +从实际上来说,由于矩阵乘法满足结合律,所以不论你说是靠右先执行还是靠左先执行,从结果上来说都没有错。 + +**之前基于这条错误的结论我进行了一次错误的证明:** -### Pre与Post的区别 +> **(这段内容注定要成为我写作历程中不可抹灭的耻辱,既然是公开文章,就应该对读者负责,虽然我在发表每一篇文章之前都竭力的求证其中的问题,各种细节,避免出现这种错误,但终究还是留下了这样一段内容,在此我诚挚的向我所有的读者道歉,并且我会尽力的修复在其他平台上遗留的错误副本。)** +> +> 关注我的读者请尽量看我在 [个人博客](http://www.gcssloop.com/#blog) 和 [GitHub](https://github.com/GcsSloop/AndroidNote/blob/master/README.md) 发布的版本,这两个平台都在博文修复计划之内,有任何错误或者纰漏,都会首先修复这两个平台的文章。另外,所有进行修复过的文章都会在我的微博 [@GcsSloop](http://weibo.com/GcsSloop) 重新发布说明,关注我的微博可以第一时间得到博文更新或者修复的消息。 +> +> ---- +> +> ## 以下是错误证明: +> +> 在实际操作中,我们每一步操作都会得出准确的计算结果,但是为什么还会用存在先后的说法? 难道真的能够用pre和post影响计算顺序? 实则不然,下面我们用一个例子说明: +> +> ```java +> Matrix matrix = new Matrix(); +> matrix.postScale(0.5f, 0.8f); +> matrix.preTranslate(1000, 1000); +> Log.e(TAG, "MatrixTest" + matrix.toShortString()); +> ``` +> +> 在上面的操作中,如果按照正常的思路,先缩放,后平移,缩放操作执行在前,不会影响到后续的平移操作,但是执行结果却发现平移距离变成了(500, 800)。 +> +> 在上面例子中,计算顺序是没有问题的,先计算的缩放,然后计算的平移,而缩放影响到平移则是因为前一步缩放后的结果矩阵右乘了平移矩阵,这是符合矩阵乘法的运算规律的,也就是说缩放操作虽然在前却影响到了平移操作,**相当于先执行了平移操作,然后执行的缩放操作,因此才有pre操作会先执行,而post操作会后执行这一说法**。 +> +> ---- -主要区别其实就是矩阵的乘法顺序不同,pre相当于矩阵的右乘,而post相当于矩阵的左乘。 +在上面例子中犯了一个非常隐蔽的错误,这个错误基于一条基本的理论,**到底是前面操作状态会影响后面操作状态,还是后面操作状态会影响前面操作状态?** -以下观点存在歧义,故做删除标注: +在上面的错误论证中使用的是,后续操作状态会影响前面操作状态,但经过我实际测试情况来说应该是,**前面操作状态会影响到后续操作状态。** 即: - -在图像处理中,越靠近右边的矩阵越先执行,所以pre操作会先执行,而post操作会后执行。 - +``` +操作A +操作B +``` -在实际操作中,我们每一步操作都会得出准确的计算结果,但是为什么还会用存在先后的说法? 难道真的能够用pre和post影响计算顺序? 实则不然,下面我们用一个例子说明: +那么 操作A 不应当受到 操作B 的影响,而 操作A 执行后的状态会影响到 操作B 的执行状态。 -> ```java Matrix matrix = new Matrix(); matrix.postScale(0.5f, 0.8f); matrix.preTranslate(1000, 1000); -Log.e(TAG, "MatrixTest:3" + matrix.toShortString()); +Log.e(TAG, "MatrixTest" + matrix.toShortString()); ``` -> -在上面的操作中,如果按照正常的思路,先缩放,后平移,缩放操作执行在前,不会影响到后续的平移操作,但是执行结果却发现平移距离变成了(500, 800)。 -> 在上面例子中,计算顺序是没有问题的,先计算的缩放,然后计算的平移,而缩放影响到平移则是因为前一步缩放后的结果矩阵右乘了平移矩阵,这是符合矩阵乘法的运算规律的,也就是说缩放操作虽然在前却影响到了平移操作,**相当于先执行了平移操作,然后执行的缩放操作,因此才有pre操作会先执行,而post操作会后执行这一说法**。 +在这个例子中,先执行的是缩放(Scale),而并非平移(Translate),即便将 postScale 换为 preScale,执行的结果也不会有变化,即下面的示例和上面是等价的: + +```java +Matrix matrix = new Matrix(); +matrix.preScale(0.5f, 0.8f); +matrix.preTranslate(1000, 1000); +Log.e(TAG, "MatrixTest" + matrix.toShortString()); +``` + +之所以平移距离是 MTRANS\_X = 500,MTRANS\_Y = 800,那是因为之前执行了缩放操作。 +Matrix 只是起到一种坐标转换的作用,并不能实际改变坐标系,所以说在缩放状态下执行平移操作,平移的距离也会被缩放,这样在绘制的时候才看起来像是缩放后的。 + +## 如何理解和使用 pre 和 post ? + +理解非常简单,不要去管什么先后论,顺序论,就按照最基本的矩阵乘法理解。 + +``` +pre : 右乘, M‘ = M*A +post : 左乘, M’ = A*M +``` + +**那么如何使用?** + +正确使用方式就是先构造正常的 Matrix 乘法顺序,之后根据情况使用 pre 和 post 来把这个顺序实现。 + +还是用一个最简单的例子理解,假设需要围绕某一点旋转。 + +可以用这个方法 `xxxRotate(angle, pivotX, pivotY)` ,由于我们这里需要组合构造一个 Matrix,所以不直接使用这个方法。 + +首先,有两条基本定理: + +* 所有的操作(旋转、平移、缩放、错切)默认都是以坐标原点为基准点的。 + +* 之前操作的坐标系状态会保留,并且影响到后续状态。 + + +基于这两条基本定理,我们可以推算出要基于某一个点进行旋转需要如下步骤: + +``` +1. 先将坐标系原点移动到指定位置,使用平移 T +2. 对坐标系进行旋转,使用旋转 S (围绕原点旋转) +3. 再将坐标系平移回原来位置,使用平移 -T +``` + +具体公式如下: + +> M 为原始矩阵,是一个单位矩阵, M‘ 为结果矩阵, T 为平移, R为旋转 + +``` +M' = M*T*R*-T = T*R*-T +``` + +按照公式写出来的伪代码如下: + +```java +Matrix matrix = new Matrix(); +matrix.preTranslate(pivotX,pivotY); +matrix.preRotate(angle); +matrix.preTranslate(-pivotX, -pivotY); +``` + + + + + +围绕某一点操作可以拓展为通用情况,即: + +```java +Matrix matrix = new Matrix(); +matrix.preTranslate(pivotX,pivotY); +// 各种操作,旋转,缩放,错切等,可以执行多次。 +matrix.preTranslate(-pivotX, -pivotY); +``` + +公式为: + +``` +M' = M*T* ... *-T = T* ... *-T +``` + +但是这种方式,两个调整中心的平移函数就拉的太开了,所以通常采用这种写法: + +```java +Matrix matrix = new Matrix(); +// 各种操作,旋转,缩放,错切等,可以执行多次。 +matrix.postTranslate(pivotX,pivotY); +matrix.preTranslate(-pivotX, -pivotY); +``` + +这样公式为: + +``` +M' = T*M* ... *-T = T* ... *-T +``` + +可以看到最终化简结果是相同的。 + +所以说,pre 和 post 就是用来调整乘法顺序的,正常情况下应当正向进行构建出乘法顺序公式,之后根据实际情况调整书写即可。 + +**在构造 Matrix 时,个人建议尽量使用一种乘法,前乘或者后乘,这样操作顺序容易确定,出现问题也比较容易排查。** +**当然,由于矩阵乘法不满足交换律,前乘和后乘的结果是不同的,使用时应结合具体情景分析使用。** + + ### 下面我们用不同对方式来构造一个矩阵: -**假设我们需要先缩放再平移。** +**假设我们需要先平移,再缩放,即平移不会受到缩放的影响。** 注意: + * 1.由于矩阵乘法不满足交换律,请保证使用初始矩阵(Initial Matrix),否则可能导致运算结果不同。 * 2.注意构造顺序,顺序是会影响结果的。 * 3.Initial Matrix是指new出来的新矩阵,或者reset后的矩阵,是一个单位矩阵。 @@ -461,98 +615,99 @@ Log.e(TAG, "MatrixTest:3" + matrix.toShortString()); #### 1.仅用pre: ``` java +// 使用pre, M' = M*T*S = T*S Matrix m = new Matrix(); m.reset(); -m.preTranslate(tx, ty); //使用pre,越靠后越先执行。 +m.preTranslate(tx, ty); m.preScale(sx, sy); ``` 用矩阵表示: -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} - & &\\\\ - & Result Matrix &\\\\ +![](http://latex.codecogs.com/png.latex?$$ +\left [ +\begin{matrix} + & &\\ + & Result Matrix &\\ & & -\\end{1} -\\right ] +\end{1} +\right ] = - \\left [ -\\begin{matrix} - & &\\\\ - & Initial Matrix &\\\\ + \left [ +\begin{matrix} + & &\\ + & Initial Matrix &\\ & & -\\end{1} -\\right ] -\\cdot -\\left [ -\\begin{matrix} -1 & 0 & \\Delta x \\\\ -0 & 1 & \\Delta y \\\\ +\end{1} +\right ] +\cdot +\left [ +\begin{matrix} +1 & 0 & \Delta x \\ +0 & 1 & \Delta y \\ 0 & 0 & 1 -\\end{1} -\\right ] -\\cdot -\\left [ -\\begin{matrix} -sx & 0 & 0\\\\ -0 & sy & 0\\\\ +\end{1} +\right ] +\cdot +\left [ +\begin{matrix} +sx & 0 & 0\\ +0 & sy & 0\\ 0 & 0 & 1 -\\end{1} -\\right ] +\end{1} +\right ] $$) #### 2.仅用post: ``` java +// 使用post, M‘ = T*S*M = T*S Matrix m = new Matrix(); m.reset(); -m.postScale(sx, sy); //使用post,越靠前越先执行。 +m.postScale(sx, sy); //,越靠前越先执行。 m.postTranslate(tx, ty); ``` 用矩阵表示: -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} - & &\\\\ - & Result Matrix &\\\\ +![](http://latex.codecogs.com/png.latex?$$ +\left [ +\begin{matrix} + & &\\ + & Result Matrix &\\ & & -\\end{1} -\\right ] +\end{1} +\right ] = -\\left [ -\\begin{matrix} -1 & 0 & \\Delta x \\\\ -0 & 1 & \\Delta y \\\\ +\left [ +\begin{matrix} +1 & 0 & \Delta x \\ +0 & 1 & \Delta y \\ 0 & 0 & 1 -\\end{1} -\\right ] -\\cdot -\\left [ -\\begin{matrix} -sx & 0 & 0\\\\ -0 & sy & 0\\\\ +\end{1} +\right ] +\cdot +\left [ +\begin{matrix} +sx & 0 & 0\\ +0 & sy & 0\\ 0 & 0 & 1 -\\end{1} -\\right ] -\\cdot - \\left [ -\\begin{matrix} - & &\\\\ - & Initial Matrix &\\\\ +\end{1} +\right ] +\cdot + \left [ +\begin{matrix} + & &\\ + & Initial Matrix &\\ & & -\\end{1} -\\right ] +\end{1} +\right ] $$) #### 3.混合: ``` java +// 混合 M‘ = T*M*S = T*S Matrix m = new Matrix(); m.reset(); m.preScale(sx, sy); @@ -562,6 +717,7 @@ m.postTranslate(tx, ty); 或: ``` java +// 混合 M‘ = T*M*S = T*S Matrix m = new Matrix(); m.reset(); m.postTranslate(tx, ty); @@ -572,46 +728,45 @@ m.preScale(sx, sy); 用矩阵表示: -![](http://latex.codecogs.com/png.latex? -$$ -\\left [ -\\begin{matrix} - & &\\\\ - & Result Matrix &\\\\ +![](http://latex.codecogs.com/png.latex?$$ +\left [ +\begin{matrix} + & &\\ + & Result Matrix &\\ & & -\\end{1} -\\right ] +\end{1} +\right ] = -\\left [ -\\begin{matrix} -1 & 0 & \\Delta x \\\\ -0 & 1 & \\Delta y \\\\ +\left [ +\begin{matrix} +1 & 0 & \Delta x \\ +0 & 1 & \Delta y \\ 0 & 0 & 1 -\\end{1} -\\right ] -\\cdot - \\left [ -\\begin{matrix} - & &\\\\ - & Initial Matrix &\\\\ +\end{1} +\right ] +\cdot + \left [ +\begin{matrix} + & &\\ + & Initial Matrix &\\ & & -\\end{1} -\\right ] -\\cdot -\\left [ -\\begin{matrix} -sx & 0 & 0\\\\ -0 & sy & 0\\\\ +\end{1} +\right ] +\cdot +\left [ +\begin{matrix} +sx & 0 & 0\\ +0 & sy & 0\\ 0 & 0 & 1 -\\end{1} -\\right ] +\end{1} +\right ] $$) +**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为单位矩阵,如果初始矩阵不为单位矩阵,则导致运算结果不同。** -**注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为空,如果初始矩阵不为空,则导致运算结果不同。** +上面虽然用了很多不同的写法,但最终的化简公式是一样的,这些不同的写法,都是根据同一个公式反向推算出来的。 -

## Matrix方法表 这个方法表,暂时放到这里让大家看看,方法的使用讲解放在下一篇文章中。 @@ -627,22 +782,20 @@ $$) | 特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 | | 矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ... | -

## 总结 对于Matrix重在理解,理解了其中的原理之后用起来将会更加得心应手。 -**学完了本篇之后,推荐配合鸿洋大大的视频课程 [ -打造个性的图片预览与多点触控](http://www.imooc.com/learn/239) 食用,定然能够让你对Matrix对理解更上一层楼。** +学完了本篇之后,推荐配合鸿洋大大的视频课程 [ +打造个性的图片预览与多点触控](http://www.imooc.com/learn/239) 食用,定然能够让你对Matrix对理解更上一层楼。 + +## About -

-## About Me +[本系列相关文章](http://www.gcssloop.com/customview/CustomViewIndex/) -### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) +作者微博: [GcsSloop](http://weibo.com/GcsSloop) - -

## 参考资料 [Matrix](https://developer.android.com/reference/android/graphics/Matrix.html)
@@ -653,4 +806,3 @@ $$) [维基百科-线性映射](https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E6%98%A0%E5%B0%84)
[齐次坐标系入门级思考](https://oncemore2020.github.io/blog/homogeneous/)
[仿射变换与齐次坐标](https://guangchun.wordpress.com/2011/10/12/affineandhomogeneous/)
-[]()
From 5dc140f3f9d27032eb56c9dea8dd153f1f19872c Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 20 Dec 2016 06:04:12 +0800 Subject: [PATCH 531/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 610 +++++++++++++------------ 1 file changed, 306 insertions(+), 304 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 96068632..b8a2d453 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -1,11 +1,9 @@ -# Matrix 原理 - 本文内容偏向理论,和 [画布操作](http://www.gcssloop.com/customview/Canvas_Convert/) 有重叠的部分,本文会让你更加深入的了解其中的原理。 本篇的主角Matrix,是一个一直在后台默默工作的劳动模范,虽然我们所有看到View背后都有着Matrix的功劳,但我们却很少见到它,本篇我们就看看它是何方神圣吧。 > 由于Google已经对这一部分已经做了很好的封装,所以跳过本部分对实际开发影响并不会太大,不想深究的粗略浏览即可,下一篇中将会详细讲解Matrix的具体用法和技巧。 - +> > ## ⚠️ 警告:测试本文章示例之前请关闭硬件加速。 ## Matrix简介 @@ -15,15 +13,15 @@ 它看起来大概是下面这样: ![](http://latex.codecogs.com/png.latex?$$ -\left [ -\begin{matrix} -MSCALE\_X & MSKEW\_X & MTRANS\_X \ -\ -MSKEW\_Y & MSCALE\_Y & MTRANS\_Y \ -\ -MPERSP\_0 & MPERSP\_1 & MPERSP\_2 -\end{1} -\right ] +\\left [ +\\begin{matrix} +MSCALE\\_X & MSKEW\\_X & MTRANS\\_X \\ +\\ +MSKEW\\_Y & MSCALE\\_Y & MTRANS\\_Y \\ +\\ +MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 +\\end{1} +\\right ] $$) **Matrix作用就是坐标映射,那么为什么需要Matrix呢? 举一个简单的例子:** @@ -32,8 +30,7 @@ $$) 以下图为例,我们的内容区和屏幕坐标系还相差一个通知栏加一个标题栏的距离,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的物理坐标系来绘制,Matrix在此处的作用就是转换这些数值。 -> ->假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点。 +> 假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点。 ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f624vi3eb6j30rs0goab5.jpg) @@ -43,14 +40,10 @@ $$) ### Matrix特点 -* 作用范围更广,Matrix在View,图片,动画效果等各个方面均有运用,相比与之前讲解等画布操作应用范围更广。 - -* 更加灵活,画布操作是对Matrix的封装,Matrix作为更接近底层的东西,必然要比画布操作更加灵活。 - -* 封装很好,Matrix本身对各个方法就做了很好的封装,让开发者可以很方便的操作Matrix。 - -* 难以深入理解,很难理解中各个数值的意义,以及操作规律,如果不了解矩阵,也很难理解前乘,后乘。 - +- 作用范围更广,Matrix在View,图片,动画效果等各个方面均有运用,相比与之前讲解等画布操作应用范围更广。 +- 更加灵活,画布操作是对Matrix的封装,Matrix作为更接近底层的东西,必然要比画布操作更加灵活。 +- 封装很好,Matrix本身对各个方法就做了很好的封装,让开发者可以很方便的操作Matrix。 +- 难以深入理解,很难理解中各个数值的意义,以及操作规律,如果不了解矩阵,也很难理解前乘,后乘。 ### 常见误解 @@ -62,7 +55,6 @@ $$) 的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。 - ## Matrix基本原理 Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就看看几种常见变换的原理: @@ -87,47 +79,44 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 ![](http://latex.codecogs.com/png.latex?$$y = k_2 y_0 $$) - 用矩阵表示: ![](http://latex.codecogs.com/png.latex?$$ -\left [ -\begin{matrix} -x\\ -y\\ +\\left [ +\\begin{matrix} +x\\\\ +y\\\\ 1 -\end{1} -\right ] +\\end{1} +\\right ] = -\left [ -\begin{matrix} -k_1 & 0 & 0 \\ - 0 & k_2 & 0 \\ +\\left [ +\\begin{matrix} +k_1 & 0 & 0 \\\\ + 0 & k_2 & 0 \\\\ 0 & 0 & 1 -\end{1} -\right ] -\left [ -\begin{matrix} -x_0 \\ -y_0 \\ +\\end{1} +\\right ] +\\left [ +\\begin{matrix} +x_0 \\\\ +y_0 \\\\ 1 -\end{1} -\right ] +\\end{1} +\\right ] $$) +> 你可能注意到了,我们坐标多了一个1,这是使用了齐次坐标系的缘故,在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,计算机无法区分,为此让计算机也可以区分它们,增加了一个标志位,增加之后看起来是这样:
> -> 你可能注意到了,我们坐标多了一个1,这是使用了齐次坐标系的缘故,在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,计算机无法区分,为此让计算机也可以区分它们,增加了一个标志位,增加之后看起来是这样:
+> (x, y, 1) - 点
+> (x, y, 0) - 向量
> -> (x, y, 1) - 点
-> (x, y, 0) - 向量
-> -> 另外,齐次坐标具有等比的性质,(2,3,1)、(4,6,2)...(2N,3N,N)表示的均是(2,3)这一个点。(**将MPERSP_2解释为scale这一误解就源于此**)。 +> 另外,齐次坐标具有等比的性质,(2,3,1)、(4,6,2)...(2N,3N,N)表示的均是(2,3)这一个点。(**将MPERSP_2解释为scale这一误解就源于此**)。 图例: ![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f6cnk02zy9j308c0dwwej.jpg) - ### 2.错切(Skew) 错切存在两种特殊错切,水平错切(平行X轴)和垂直错切(平行Y轴)。 @@ -141,28 +130,28 @@ $$) 用矩阵表示: ![](http://latex.codecogs.com/png.latex?$$ -\left [ -\begin{matrix} -x\\ -y\\ +\\left [ +\\begin{matrix} +x\\\\ +y\\\\ 1 -\end{1} -\right ] +\\end{1} +\\right ] = -\left [ -\begin{matrix} - 1 & k & 0 \\ - 0 & 1 & 0 \\ +\\left [ +\\begin{matrix} + 1 & k & 0 \\\\ + 0 & 1 & 0 \\\\ 0 & 0 & 1 -\end{1} -\right ] -\left [ -\begin{matrix} -x_0\\ -y_0\\ +\\end{1} +\\right ] +\\left [ +\\begin{matrix} +x_0\\\\ +y_0\\\\ 1 -\end{1} -\right ] +\\end{1} +\\right ] $$) 图例: @@ -178,28 +167,28 @@ $$) 用矩阵表示: ![](http://latex.codecogs.com/png.latex?$$ -\left [ -\begin{matrix} -x\\ -y\\ +\\left [ +\\begin{matrix} +x\\\\ +y\\\\ 1 -\end{1} -\right ] +\\end{1} +\\right ] = -\left [ -\begin{matrix} - 1 & 0 & 0 \\ - k & 1 & 0 \\ +\\left [ +\\begin{matrix} + 1 & 0 & 0 \\\\ + k & 1 & 0 \\\\ 0 & 0 & 1 -\end{1} -\right ] -\left [ -\begin{matrix} -x_0\\ -y_0\\ +\\end{1} +\\right ] +\\left [ +\\begin{matrix} +x_0\\\\ +y_0\\\\ 1 -\end{1} -\right ] +\\end{1} +\\right ] $$) 图例: @@ -217,28 +206,28 @@ $$) 用矩阵表示: ![](http://latex.codecogs.com/png.latex?$$ -\left [ -\begin{matrix} -x\\ -y\\ +\\left [ +\\begin{matrix} +x\\\\ +y\\\\ 1 -\end{1} -\right ] +\\end{1} +\\right ] = -\left [ -\begin{matrix} - 1 & k_1 & 0 \\ - k_2 & 1 & 0 \\ +\\left [ +\\begin{matrix} + 1 & k_1 & 0 \\\\ + k_2 & 1 & 0 \\\\ 0 & 0 & 1 -\end{1} -\right ] -\left [ -\begin{matrix} -x_0\\ -y_0\\ +\\end{1} +\\right ] +\\left [ +\\begin{matrix} +x_0\\\\ +y_0\\\\ 1 -\end{1} -\right ] +\\end{1} +\\right ] $$) 图例: @@ -249,97 +238,98 @@ $$) 假定一个点 A(x0, y0) ,距离原点距离为 r, 与水平轴夹角为 α 度, 绕原点旋转 θ 度, 旋转后为点 B(x, y) 如下: -![](http://latex.codecogs.com/png.latex?$$ x_0 = r \cdot cos \alpha $$) +![](http://latex.codecogs.com/png.latex?$$ x_0 = r \\cdot cos \\alpha $$) -![](http://latex.codecogs.com/png.latex?$$ y_0 = r \cdot sin \alpha $$) +![](http://latex.codecogs.com/png.latex?$$ y_0 = r \\cdot sin \\alpha $$) ![](http://latex.codecogs.com/png.latex?$$ -x = r \cdot cos( \alpha + \theta) -= r \cdot cos \alpha \cdot cos \theta - r \cdot sin \alpha \cdot sin \theta -= x_0 \cdot cos \theta - y_0 \cdot sin \theta +x = r \\cdot cos( \\alpha + \\theta) += r \\cdot cos \\alpha \\cdot cos \\theta - r \\cdot sin \\alpha \\cdot sin \\theta += x_0 \\cdot cos \\theta - y_0 \\cdot sin \\theta $$) ![](http://latex.codecogs.com/png.latex?$$ -y = r \cdot sin( \alpha + \theta) -= r \cdot sin \alpha \cdot cos \theta + r \cdot cos \alpha \cdot sin \theta -= y_0 \cdot cos \theta + x_0 \cdot sin \theta +y = r \\cdot sin( \\alpha + \\theta) += r \\cdot sin \\alpha \\cdot cos \\theta + r \\cdot cos \\alpha \\cdot sin \\theta += y_0 \\cdot cos \\theta + x_0 \\cdot sin \\theta $$) 用矩阵表示: ![](http://latex.codecogs.com/png.latex?$$ -\left [ -\begin{matrix} -x\\ -y\\ +\\left [ +\\begin{matrix} +x\\\\ +y\\\\ 1 -\end{1} -\right ] +\\end{1} +\\right ] = -\left [ -\begin{matrix} -cos(\theta) & -sin(\theta) & 0 \\ -sin(\theta) & cos(\theta) & 0 \\ - 0 & 0 & 1 -\end{1} -\right ] +\\left [ +\\begin{matrix} +cos(\\theta) & -sin(\\theta) & 0 \\\\ +sin(\\theta) & cos(\\theta) & 0 \\\\ + +``` + 0 & 0 & 1 +``` + +\\end{1} +\\right ] . -\left [ -\begin{matrix} -x_0\\ -y_0\\ +\\left [ +\\begin{matrix} +x_0\\\\ +y_0\\\\ 1 -\end{1} -\right ] +\\end{1} +\\right ] $$) 图例: ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f6cpp174twj308c0dwt8s.jpg) - ### 4.平移(Translate) -> -> 此处也是使用齐次坐标的优点体现之一,实际上前面的三个操作使用 2x2 的矩阵也能满足需求,但是使用 2x2 的矩阵,无法将平移操作加入其中,而将坐标扩展为齐次坐标后,将矩阵扩展为 3x3 就可以将算法统一,四种算法均可以使用矩阵乘法完成。 +> 此处也是使用齐次坐标的优点体现之一,实际上前面的三个操作使用 2x2 的矩阵也能满足需求,但是使用 2x2 的矩阵,无法将平移操作加入其中,而将坐标扩展为齐次坐标后,将矩阵扩展为 3x3 就可以将算法统一,四种算法均可以使用矩阵乘法完成。 -![](http://latex.codecogs.com/png.latex?$$ x = x_0 + \Delta x $$) +![](http://latex.codecogs.com/png.latex?$$ x = x_0 + \\Delta x $$) -![](http://latex.codecogs.com/png.latex?$$ y = y_0 + \Delta y $$) +![](http://latex.codecogs.com/png.latex?$$ y = y_0 + \\Delta y $$) 用矩阵表示: ![](http://latex.codecogs.com/png.latex?$$ -\left [ -\begin{matrix} -x\\ -y\\ +\\left [ +\\begin{matrix} +x\\\\ +y\\\\ 1 -\end{1} -\right ] +\\end{1} +\\right ] = -\left [ -\begin{matrix} -1 & 0 & \Delta x \\ -0 & 1 & \Delta y \\ +\\left [ +\\begin{matrix} +1 & 0 & \\Delta x \\\\ +0 & 1 & \\Delta y \\\\ 0 & 0 & 1 -\end{1} -\right ] +\\end{1} +\\right ] . -\left [ -\begin{matrix} -x_0\\ -y_0\\ +\\left [ +\\begin{matrix} +x_0\\\\ +y_0\\\\ 1 -\end{1} -\right ] +\\end{1} +\\right ] $$) 图例: ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f6dqiw20xoj308c0dw0su.jpg) - ## Matrix复合原理 其实Matrix的多种复合操作都是使用矩阵乘法实现的,从原理上理解很简单,但是,使用矩阵乘法也有其弱点,后面的操作可能会影响到前面到操作,所以在构造Matrix时顺序很重要。 @@ -350,7 +340,7 @@ $$) 前乘相当于矩阵的右乘: -![](http://latex.codecogs.com/png.latex?$$ M' = M \cdot S $$) +![](http://latex.codecogs.com/png.latex?$$ M' = M \\cdot S $$) > 这表示一个矩阵与一个特殊矩阵前乘后构造出结果矩阵。 @@ -358,7 +348,7 @@ $$) 前乘相当于矩阵的左乘: -![](http://latex.codecogs.com/png.latex?$$ M' = S \cdot M $$) +![](http://latex.codecogs.com/png.latex?$$ M' = S \\cdot M $$) > 这表示一个矩阵与一个特殊矩阵后乘后构造出结果矩阵。 @@ -372,13 +362,7 @@ $$) **我由于也受到了这些文章的影响,自然而然的继承了这一理论,直到在评论区有一位小伙伴提出了一个问题,才让我重新审视了这一部分的内容,并进行了一定反思。** -我思考的主要有以下部分: - -1. pre 和 post 的具体含义和作用。 -2. 矩阵构造过程中的正确影响顺序。 -3. 误解产生的具体源头。 - -经过良久的思考之后,我决定推翻之前的理论和结论,重新构建了这一部分的理论知识,也许仍有疏漏,如有发现请指正。 +经过良久的思考之后,我决定抛弃国内大部分文章的那套理论和结论,只用严谨的数学逻辑和程序逻辑来阐述这一部分的理论,也许仍有疏漏,如有发现请指正。 **首先澄清两个错误结论,记住,是错误结论,错误结论,错误结论。** @@ -406,9 +390,9 @@ Log.e("Matrix", matrix.toShortString()); > 设原始矩阵为 M,平移为 T ,旋转为 R ,单位矩阵为 I ,最终结果为 M' > -> * 矩阵乘法不满足交换律,即 A\*B ≠ B\*A -> * 矩阵乘法满足结合律,即 (A\*B)\*C = A\*(B\*C) -> * 矩阵与单位矩阵相乘结果不变,即 A * I = A +> - 矩阵乘法不满足交换律,即 A\\*B ≠ B\\*A +> - 矩阵乘法满足结合律,即 (A\\*B)\\*C = A\\*(B\\*C) +> - 矩阵与单位矩阵相乘结果不变,即 A * I = A ``` 由于上面例子中原始矩阵(M)是一个单位矩阵(I),所以可得: @@ -426,7 +410,7 @@ M' = T*(R*M) = T*R*I = T*R ### ~~错误结论二:pre 是先执行,而 post 是后执行。~~ -这一条结论比上一条更加扯淡,同样是错误的,而且错的更离谱。 +这一条结论比上一条更离谱。 之所以产生这个错误完全是因为写文章的人懂英语。 @@ -435,7 +419,7 @@ pre :先,和 before 相似。 post :后,和 after 相似。 ``` -所以就得出了 pre 先执行,而 post 后执行这一说法,但从严谨的数学和程序角度来分析,完全是扯淡的,还是上面所说的,**pre 和 post 不能影响程序执行顺序,而程序每执行一条语句都会得出一个确定的结果,所以,它根本不能控制先后执行,属于完全扯淡型。** +所以就得出了 pre 先执行,而 post 后执行这一说法,但从严谨的数学和程序角度来分析,完全是不可能的,还是上面所说的,**pre 和 post 不能影响程序执行顺序,而程序每执行一条语句都会得出一个确定的结果,所以,它根本不能控制先后执行,属于完全扯淡型。** **如果非要用这套理论强行解释的话,反而看起来像是 post 先执行,例如:** @@ -451,19 +435,19 @@ matrix.postTranslate(pivotX,pivotY); M‘ = T*(M*R) = T*M*R = (T*M)*R ``` -从实际上来说,由于矩阵乘法满足结合律,所以不论你说是靠右先执行还是靠左先执行,从结果上来说都没有错。 +**从实际上来说,由于矩阵乘法满足结合律,所以不论你说是靠右先执行还是靠左先执行,从结果上来说都没有错。** **之前基于这条错误的结论我进行了一次错误的证明:** -> **(这段内容注定要成为我写作历程中不可抹灭的耻辱,既然是公开文章,就应该对读者负责,虽然我在发表每一篇文章之前都竭力的求证其中的问题,各种细节,避免出现这种错误,但终究还是留下了这样一段内容,在此我诚挚的向我所有的读者道歉,并且我会尽力的修复在其他平台上遗留的错误副本。)** +> **(这段内容注定要成为我写作历程中不可抹灭的耻辱,既然是公开文章,就应该对读者负责,虽然我在发表每一篇文章之前都竭力的求证其中的问题,各种细节,避免出现这种错误,但终究还是留下了这样一段内容,在此我诚挚的向我所有的读者道歉。)** > > 关注我的读者请尽量看我在 [个人博客](http://www.gcssloop.com/#blog) 和 [GitHub](https://github.com/GcsSloop/AndroidNote/blob/master/README.md) 发布的版本,这两个平台都在博文修复计划之内,有任何错误或者纰漏,都会首先修复这两个平台的文章。另外,所有进行修复过的文章都会在我的微博 [@GcsSloop](http://weibo.com/GcsSloop) 重新发布说明,关注我的微博可以第一时间得到博文更新或者修复的消息。 > -> ---- +> ------ > > ## 以下是错误证明: > -> 在实际操作中,我们每一步操作都会得出准确的计算结果,但是为什么还会用存在先后的说法? 难道真的能够用pre和post影响计算顺序? 实则不然,下面我们用一个例子说明: +> ~~在实际操作中,我们每一步操作都会得出准确的计算结果,但是为什么还会用存在先后的说法? 难道真的能够用pre和post影响计算顺序? 实则不然,下面我们用一个例子说明:~~ > > ```java > Matrix matrix = new Matrix(); @@ -472,45 +456,70 @@ M‘ = T*(M*R) = T*M*R = (T*M)*R > Log.e(TAG, "MatrixTest" + matrix.toShortString()); > ``` > -> 在上面的操作中,如果按照正常的思路,先缩放,后平移,缩放操作执行在前,不会影响到后续的平移操作,但是执行结果却发现平移距离变成了(500, 800)。 +> ~~在上面的操作中,如果按照正常的思路,先缩放,后平移,缩放操作执行在前,不会影响到后续的平移操作,但是执行结果却发现平移距离变成了(500, 800)。~~ > -> 在上面例子中,计算顺序是没有问题的,先计算的缩放,然后计算的平移,而缩放影响到平移则是因为前一步缩放后的结果矩阵右乘了平移矩阵,这是符合矩阵乘法的运算规律的,也就是说缩放操作虽然在前却影响到了平移操作,**相当于先执行了平移操作,然后执行的缩放操作,因此才有pre操作会先执行,而post操作会后执行这一说法**。 +> ~~在上面例子中,计算顺序是没有问题的,先计算的缩放,然后计算的平移,而缩放影响到平移则是因为前一步缩放后的结果矩阵右乘了平移矩阵,这是符合矩阵乘法的运算规律的,也就是说缩放操作虽然在前却影响到了平移操作,**相当于先执行了平移操作,然后执行的缩放操作,因此才有pre操作会先执行,而post操作会后执行这一说法**。~~ > -> ---- - -在上面例子中犯了一个非常隐蔽的错误,这个错误基于一条基本的理论,**到底是前面操作状态会影响后面操作状态,还是后面操作状态会影响前面操作状态?** - -在上面的错误论证中使用的是,后续操作状态会影响前面操作状态,但经过我实际测试情况来说应该是,**前面操作状态会影响到后续操作状态。** 即: - -``` -操作A -操作B -``` - -那么 操作A 不应当受到 操作B 的影响,而 操作A 执行后的状态会影响到 操作B 的执行状态。 - -```java -Matrix matrix = new Matrix(); -matrix.postScale(0.5f, 0.8f); -matrix.preTranslate(1000, 1000); -Log.e(TAG, "MatrixTest" + matrix.toShortString()); -``` - -在这个例子中,先执行的是缩放(Scale),而并非平移(Translate),即便将 postScale 换为 preScale,执行的结果也不会有变化,即下面的示例和上面是等价的: - -```java -Matrix matrix = new Matrix(); -matrix.preScale(0.5f, 0.8f); -matrix.preTranslate(1000, 1000); -Log.e(TAG, "MatrixTest" + matrix.toShortString()); -``` - -之所以平移距离是 MTRANS\_X = 500,MTRANS\_Y = 800,那是因为之前执行了缩放操作。 -Matrix 只是起到一种坐标转换的作用,并不能实际改变坐标系,所以说在缩放状态下执行平移操作,平移的距离也会被缩放,这样在绘制的时候才看起来像是缩放后的。 +> ------ +> +> 上面的论证是完全错误的,因为可以轻松举出反例: +> +> ```java +> Matrix matrix = new Matrix(); +> matrix.preScale(0.5f, 0.8f); +> matrix.preTranslate(1000, 1000); +> Log.e(TAG, "MatrixTest" + matrix.toShortString()); +> ``` +> +> 反例中,虽然将 `postScale` 改为了 `preScale` ,但两者结果是完全相同的,所以先后论根本就是错误的。 +> +> 他们结果相同是因为最终化简公式是相同的,都是 S*T +> +> 之所以平移距离是 MTRANS\\_X = 500,MTRANS\\_Y = 800,那是因为执行 Translate 之前 Matrix 已经具有了一个缩放比例。在右乘的时候影响到了具体的数值计算,可以用矩阵乘法计算一下。 +> +> ![](http://latex.codecogs.com/png.latex?$$ +> \\left [ +> \\begin{matrix} +> 0.5 & 0 & 0 \\\\ +> 0 & 0.8 & 0 \\\\ +> 0 & 0 & 1 +> \\end{1} +> \\right ] +> \\cdot +> \\left [ +> \\begin{matrix} +> 1 & 0 & 1000 \\\\ +> 0 & 1 & 1000 \\\\ +> 0 & 0 & 1 +> \\end{1} +> \\right ] +> = +> \\left [ +> \\begin{matrix} +> 0.5*1+0*0+0*0 & 0.5*0+0*1+0*0 & 0.5*1000+0*1000+0*1\\\\ +> 0*1+0.8*0+0*0 & 0*0+0.8*1+0*1 & 0*1000+0.8*1000+0*1\\\\ +> 0*1+0*0+1*0 & 0*0+0*1+1*0 & 0*1000+0*1000+1*1 +> \\end{1} +> \\right ] +> $$) +> +> 最终结果为: +> +> ![](http://latex.codecogs.com/png.latex?$$ +> \\left [ +> \\begin{matrix} +> 0.5 & 0 & 500\\\\ +> 0 & 0.8 & 800\\\\ +> 0 & 0 & 1 +> \\end{1} +> \\right ] +> $$) +> +> 当 T*S 的时候,缩放比例则不会影响到 MTRANS\\_X 和 MTRANS\\_Y ,具体可以使用矩阵乘法自己计算一遍。 ## 如何理解和使用 pre 和 post ? -理解非常简单,不要去管什么先后论,顺序论,就按照最基本的矩阵乘法理解。 +不要去管什么先后论,顺序论,就按照最基本的矩阵乘法理解。 ``` pre : 右乘, M‘ = M*A @@ -527,10 +536,8 @@ post : 左乘, M’ = A*M 首先,有两条基本定理: -* 所有的操作(旋转、平移、缩放、错切)默认都是以坐标原点为基准点的。 - -* 之前操作的坐标系状态会保留,并且影响到后续状态。 - +- 所有的操作(旋转、平移、缩放、错切)默认都是以坐标原点为基准点的。 +- 之前操作的坐标系状态会保留,并且影响到后续状态。 基于这两条基本定理,我们可以推算出要基于某一个点进行旋转需要如下步骤: @@ -595,26 +602,21 @@ M' = T*M* ... *-T = T* ... *-T 所以说,pre 和 post 就是用来调整乘法顺序的,正常情况下应当正向进行构建出乘法顺序公式,之后根据实际情况调整书写即可。 -**在构造 Matrix 时,个人建议尽量使用一种乘法,前乘或者后乘,这样操作顺序容易确定,出现问题也比较容易排查。** -**当然,由于矩阵乘法不满足交换律,前乘和后乘的结果是不同的,使用时应结合具体情景分析使用。** - +**在构造 Matrix 时,个人建议尽量使用一种乘法,前乘或者后乘,这样操作顺序容易确定,出现问题也比较容易排查。当然,由于矩阵乘法不满足交换律,前乘和后乘的结果是不同的,使用时应结合具体情景分析使用。** -### 下面我们用不同对方式来构造一个矩阵: - -**假设我们需要先平移,再缩放,即平移不会受到缩放的影响。** +### 下面我们用不同对方式来构造一个相同的矩阵: 注意: -* 1.由于矩阵乘法不满足交换律,请保证使用初始矩阵(Initial Matrix),否则可能导致运算结果不同。 -* 2.注意构造顺序,顺序是会影响结果的。 -* 3.Initial Matrix是指new出来的新矩阵,或者reset后的矩阵,是一个单位矩阵。 - +- 1.由于矩阵乘法不满足交换律,请保证使用初始矩阵(Initial Matrix),否则可能导致运算结果不同。 +- 2.注意构造顺序,顺序是会影响结果的。 +- 3.Initial Matrix是指new出来的新矩阵,或者reset后的矩阵,是一个单位矩阵。 #### 1.仅用pre: -``` java +```java // 使用pre, M' = M*T*S = T*S Matrix m = new Matrix(); m.reset(); @@ -625,42 +627,42 @@ m.preScale(sx, sy); 用矩阵表示: ![](http://latex.codecogs.com/png.latex?$$ -\left [ -\begin{matrix} - & &\\ - & Result Matrix &\\ +\\left [ +\\begin{matrix} + & &\\\\ + & Result Matrix &\\\\ & & -\end{1} -\right ] +\\end{1} +\\right ] = - \left [ -\begin{matrix} - & &\\ - & Initial Matrix &\\ + \\left [ +\\begin{matrix} + & &\\\\ + & Initial Matrix &\\\\ & & -\end{1} -\right ] -\cdot -\left [ -\begin{matrix} -1 & 0 & \Delta x \\ -0 & 1 & \Delta y \\ +\\end{1} +\\right ] +\\cdot +\\left [ +\\begin{matrix} +1 & 0 & \\Delta x \\\\ +0 & 1 & \\Delta y \\\\ 0 & 0 & 1 -\end{1} -\right ] -\cdot -\left [ -\begin{matrix} -sx & 0 & 0\\ -0 & sy & 0\\ +\\end{1} +\\right ] +\\cdot +\\left [ +\\begin{matrix} +sx & 0 & 0\\\\ +0 & sy & 0\\\\ 0 & 0 & 1 -\end{1} -\right ] +\\end{1} +\\right ] $$) #### 2.仅用post: -``` java +```java // 使用post, M‘ = T*S*M = T*S Matrix m = new Matrix(); m.reset(); @@ -671,42 +673,42 @@ m.postTranslate(tx, ty); 用矩阵表示: ![](http://latex.codecogs.com/png.latex?$$ -\left [ -\begin{matrix} - & &\\ - & Result Matrix &\\ +\\left [ +\\begin{matrix} + & &\\\\ + & Result Matrix &\\\\ & & -\end{1} -\right ] +\\end{1} +\\right ] = -\left [ -\begin{matrix} -1 & 0 & \Delta x \\ -0 & 1 & \Delta y \\ +\\left [ +\\begin{matrix} +1 & 0 & \\Delta x \\\\ +0 & 1 & \\Delta y \\\\ 0 & 0 & 1 -\end{1} -\right ] -\cdot -\left [ -\begin{matrix} -sx & 0 & 0\\ -0 & sy & 0\\ +\\end{1} +\\right ] +\\cdot +\\left [ +\\begin{matrix} +sx & 0 & 0\\\\ +0 & sy & 0\\\\ 0 & 0 & 1 -\end{1} -\right ] -\cdot - \left [ -\begin{matrix} - & &\\ - & Initial Matrix &\\ +\\end{1} +\\right ] +\\cdot + \\left [ +\\begin{matrix} + & &\\\\ + & Initial Matrix &\\\\ & & -\end{1} -\right ] +\\end{1} +\\right ] $$) #### 3.混合: -``` java +```java // 混合 M‘ = T*M*S = T*S Matrix m = new Matrix(); m.reset(); @@ -716,7 +718,7 @@ m.postTranslate(tx, ty); 或: -``` java +```java // 混合 M‘ = T*M*S = T*S Matrix m = new Matrix(); m.reset(); @@ -729,44 +731,43 @@ m.preScale(sx, sy); 用矩阵表示: ![](http://latex.codecogs.com/png.latex?$$ -\left [ -\begin{matrix} - & &\\ - & Result Matrix &\\ +\\left [ +\\begin{matrix} + & &\\\\ + & Result Matrix &\\\\ & & -\end{1} -\right ] +\\end{1} +\\right ] = -\left [ -\begin{matrix} -1 & 0 & \Delta x \\ -0 & 1 & \Delta y \\ +\\left [ +\\begin{matrix} +1 & 0 & \\Delta x \\\\ +0 & 1 & \\Delta y \\\\ 0 & 0 & 1 -\end{1} -\right ] -\cdot - \left [ -\begin{matrix} - & &\\ - & Initial Matrix &\\ +\\end{1} +\\right ] +\\cdot + \\left [ +\\begin{matrix} + & &\\\\ + & Initial Matrix &\\\\ & & -\end{1} -\right ] -\cdot -\left [ -\begin{matrix} -sx & 0 & 0\\ -0 & sy & 0\\ +\\end{1} +\\right ] +\\cdot +\\left [ +\\begin{matrix} +sx & 0 & 0\\\\ +0 & sy & 0\\\\ 0 & 0 & 1 -\end{1} -\right ] +\\end{1} +\\right ] $$) **注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为单位矩阵,如果初始矩阵不为单位矩阵,则导致运算结果不同。** 上面虽然用了很多不同的写法,但最终的化简公式是一样的,这些不同的写法,都是根据同一个公式反向推算出来的。 - ## Matrix方法表 这个方法表,暂时放到这里让大家看看,方法的使用讲解放在下一篇文章中。 @@ -789,13 +790,14 @@ $$) 学完了本篇之后,推荐配合鸿洋大大的视频课程 [ 打造个性的图片预览与多点触控](http://www.imooc.com/learn/239) 食用,定然能够让你对Matrix对理解更上一层楼。 +由于个人水平有限,文章中可能会出现错误,如果你觉得哪一部分有错误,或者发现了错别字等内容,欢迎在评论区告诉我,另外,据说关注 [作者微博](http://weibo.com/GcsSloop) 不仅能第一时间收到新文章消息,还能变帅哦。 + ## About [本系列相关文章](http://www.gcssloop.com/customview/CustomViewIndex/) 作者微博: [GcsSloop](http://weibo.com/GcsSloop) - ## 参考资料 [Matrix](https://developer.android.com/reference/android/graphics/Matrix.html)
@@ -805,4 +807,4 @@ $$) [维基百科-齐次坐标](https://zh.wikipedia.org/wiki/%E9%BD%90%E6%AC%A1%E5%9D%90%E6%A0%87)
[维基百科-线性映射](https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E6%98%A0%E5%B0%84)
[齐次坐标系入门级思考](https://oncemore2020.github.io/blog/homogeneous/)
-[仿射变换与齐次坐标](https://guangchun.wordpress.com/2011/10/12/affineandhomogeneous/)
+[仿射变换与齐次坐标](https://guangchun.wordpress.com/2011/10/12/affineandhomogeneous/)
\ No newline at end of file From 95db7f113884a291f24f8fe507cd8fc02a230ada Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 20 Dec 2016 06:05:04 +0800 Subject: [PATCH 532/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index b8a2d453..3e714fe7 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -15,7 +15,7 @@ ![](http://latex.codecogs.com/png.latex?$$ \\left [ \\begin{matrix} -MSCALE\\_X & MSKEW\\_X & MTRANS\\_X \\ +MSCALE\\_X & MSKEW\\_X & MTRANS\\_X \\\\ \\ MSKEW\\_Y & MSCALE\\_Y & MTRANS\\_Y \\ \\ From 4ae2d481ed88f83f6036e73662e4b2d2f9d4cfcd Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 20 Dec 2016 06:07:10 +0800 Subject: [PATCH 533/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 3e714fe7..862995af 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -17,7 +17,7 @@ \\begin{matrix} MSCALE\\_X & MSKEW\\_X & MTRANS\\_X \\\\ \\ -MSKEW\\_Y & MSCALE\\_Y & MTRANS\\_Y \\ +MSKEW\\_Y & MSCALE\\_Y & MTRANS\\_Y \\\\ \\ MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 \\end{1} From ee8c16b875761fcdb76154ffeeb708279d23e149 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 20 Dec 2016 06:14:40 +0800 Subject: [PATCH 534/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 116 ++++++++++++------------- 1 file changed, 56 insertions(+), 60 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 862995af..6e874fb8 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -269,11 +269,7 @@ y\\\\ \\begin{matrix} cos(\\theta) & -sin(\\theta) & 0 \\\\ sin(\\theta) & cos(\\theta) & 0 \\\\ - -``` 0 & 0 & 1 -``` - \\end{1} \\right ] . @@ -461,61 +457,61 @@ M‘ = T*(M*R) = T*M*R = (T*M)*R > ~~在上面例子中,计算顺序是没有问题的,先计算的缩放,然后计算的平移,而缩放影响到平移则是因为前一步缩放后的结果矩阵右乘了平移矩阵,这是符合矩阵乘法的运算规律的,也就是说缩放操作虽然在前却影响到了平移操作,**相当于先执行了平移操作,然后执行的缩放操作,因此才有pre操作会先执行,而post操作会后执行这一说法**。~~ > > ------ -> -> 上面的论证是完全错误的,因为可以轻松举出反例: -> -> ```java -> Matrix matrix = new Matrix(); -> matrix.preScale(0.5f, 0.8f); -> matrix.preTranslate(1000, 1000); -> Log.e(TAG, "MatrixTest" + matrix.toShortString()); -> ``` -> -> 反例中,虽然将 `postScale` 改为了 `preScale` ,但两者结果是完全相同的,所以先后论根本就是错误的。 -> -> 他们结果相同是因为最终化简公式是相同的,都是 S*T -> -> 之所以平移距离是 MTRANS\\_X = 500,MTRANS\\_Y = 800,那是因为执行 Translate 之前 Matrix 已经具有了一个缩放比例。在右乘的时候影响到了具体的数值计算,可以用矩阵乘法计算一下。 -> -> ![](http://latex.codecogs.com/png.latex?$$ -> \\left [ -> \\begin{matrix} -> 0.5 & 0 & 0 \\\\ -> 0 & 0.8 & 0 \\\\ -> 0 & 0 & 1 -> \\end{1} -> \\right ] -> \\cdot -> \\left [ -> \\begin{matrix} -> 1 & 0 & 1000 \\\\ -> 0 & 1 & 1000 \\\\ -> 0 & 0 & 1 -> \\end{1} -> \\right ] -> = -> \\left [ -> \\begin{matrix} -> 0.5*1+0*0+0*0 & 0.5*0+0*1+0*0 & 0.5*1000+0*1000+0*1\\\\ -> 0*1+0.8*0+0*0 & 0*0+0.8*1+0*1 & 0*1000+0.8*1000+0*1\\\\ -> 0*1+0*0+1*0 & 0*0+0*1+1*0 & 0*1000+0*1000+1*1 -> \\end{1} -> \\right ] -> $$) -> -> 最终结果为: -> -> ![](http://latex.codecogs.com/png.latex?$$ -> \\left [ -> \\begin{matrix} -> 0.5 & 0 & 500\\\\ -> 0 & 0.8 & 800\\\\ -> 0 & 0 & 1 -> \\end{1} -> \\right ] -> $$) -> -> 当 T*S 的时候,缩放比例则不会影响到 MTRANS\\_X 和 MTRANS\\_Y ,具体可以使用矩阵乘法自己计算一遍。 + +上面的论证是完全错误的,因为可以轻松举出反例: + +```java +Matrix matrix = new Matrix(); +matrix.preScale(0.5f, 0.8f); +matrix.preTranslate(1000, 1000); +Log.e(TAG, "MatrixTest" + matrix.toShortString()); +``` + +反例中,虽然将 `postScale` 改为了 `preScale` ,但两者结果是完全相同的,所以先后论根本就是错误的。 + +他们结果相同是因为最终化简公式是相同的,都是 S*T + +之所以平移距离是 MTRANS\\_X = 500,MTRANS\\_Y = 800,那是因为执行 Translate 之前 Matrix 已经具有了一个缩放比例。在右乘的时候影响到了具体的数值计算,可以用矩阵乘法计算一下。 + +![](http://latex.codecogs.com/png.latex?$$ +\\left [ +\\begin{matrix} +0.5 & 0 & 0 \\\\ +0 & 0.8 & 0 \\\\ +0 & 0 & 1 +\\end{1} +\\right ] +\\cdot +\\left [ +\\begin{matrix} +1 & 0 & 1000 \\\\ +0 & 1 & 1000 \\\\ +0 & 0 & 1 +\\end{1} +\\right ] += +\\left [ +\\begin{matrix} +0.5*1+0*0+0*0 & 0.5*0+0*1+0*0 & 0.5*1000+0*1000+0*1\\\\ +0*1+0.8*0+0*0 & 0*0+0.8*1+0*1 & 0*1000+0.8*1000+0*1\\\\ +0*1+0*0+1*0 & 0*0+0*1+1*0 & 0*1000+0*1000+1*1 +\\end{1} +\\right ] +$$) + +最终结果为: + +![](http://latex.codecogs.com/png.latex?$$ +\\left [ +\\begin{matrix} +0.5 & 0 & 500\\\\ +0 & 0.8 & 800\\\\ +0 & 0 & 1 +\\end{1} +\\right ] +$$) + +当 T*S 的时候,缩放比例则不会影响到 MTRANS\\_X 和 MTRANS\\_Y ,具体可以使用矩阵乘法自己计算一遍。 ## 如何理解和使用 pre 和 post ? @@ -807,4 +803,4 @@ $$) [维基百科-齐次坐标](https://zh.wikipedia.org/wiki/%E9%BD%90%E6%AC%A1%E5%9D%90%E6%A0%87)
[维基百科-线性映射](https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E6%98%A0%E5%B0%84)
[齐次坐标系入门级思考](https://oncemore2020.github.io/blog/homogeneous/)
-[仿射变换与齐次坐标](https://guangchun.wordpress.com/2011/10/12/affineandhomogeneous/)
\ No newline at end of file +[仿射变换与齐次坐标](https://guangchun.wordpress.com/2011/10/12/affineandhomogeneous/)
From 2ba1ef8c8bf0dfe6731c3b6e4258b0a1e8754ce7 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 20 Dec 2016 06:17:33 +0800 Subject: [PATCH 535/615] Update --- CustomView/Advance/[09]Matrix_Basic.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 6e874fb8..852ee6d9 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -471,7 +471,7 @@ Log.e(TAG, "MatrixTest" + matrix.toShortString()); 他们结果相同是因为最终化简公式是相同的,都是 S*T -之所以平移距离是 MTRANS\\_X = 500,MTRANS\\_Y = 800,那是因为执行 Translate 之前 Matrix 已经具有了一个缩放比例。在右乘的时候影响到了具体的数值计算,可以用矩阵乘法计算一下。 +之所以平移距离是 MTRANS\_X = 500,MTRANS\_Y = 800,那是因为执行 Translate 之前 Matrix 已经具有了一个缩放比例。在右乘的时候影响到了具体的数值计算,可以用矩阵乘法计算一下。 ![](http://latex.codecogs.com/png.latex?$$ \\left [ @@ -488,8 +488,7 @@ Log.e(TAG, "MatrixTest" + matrix.toShortString()); 0 & 1 & 1000 \\\\ 0 & 0 & 1 \\end{1} -\\right ] -= +\\right ] = \\left [ \\begin{matrix} 0.5*1+0*0+0*0 & 0.5*0+0*1+0*0 & 0.5*1000+0*1000+0*1\\\\ From 5e5fac3b9080c997b62358e95c2fafe14c80f0a3 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 21 Dec 2016 01:58:33 +0800 Subject: [PATCH 536/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 501b0674..d9935e07 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ## [博客](http://www.gcssloop.com/#blog "GcsSloop的博客") -新开的博客,在博客中可以获得更好的阅读体验,同时在博客的评论区可以更及时的向我反馈文章中的问题。 +我的个人博客,在博客中可以获得更好的阅读体验,同时在博客的评论区可以更及时的向我反馈文章中的问题。 From debec143199b3a635f3ee7391b29ef1543ea79cc Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 22 Dec 2016 02:01:10 +0800 Subject: [PATCH 537/615] Update --- CustomView/CustomViewRule.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 CustomView/CustomViewRule.md diff --git a/CustomView/CustomViewRule.md b/CustomView/CustomViewRule.md new file mode 100644 index 00000000..e69de29b From c38ce87426f0c17719c18cb342c5abae5c143249 Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 23 Dec 2016 23:23:08 +0800 Subject: [PATCH 538/615] Update --- Tools/MarkdownEditor.md | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 Tools/MarkdownEditor.md diff --git a/Tools/MarkdownEditor.md b/Tools/MarkdownEditor.md deleted file mode 100644 index 96108ea1..00000000 --- a/Tools/MarkdownEditor.md +++ /dev/null @@ -1,4 +0,0 @@ -# Markdown编辑器推荐 - -markdown是一个轻量级标记型书写语言,由于其学习门槛低和简洁性而被很多人喜爱。 - From 06cb762648f31d51446225a0bc913241caa7b10e Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 24 Dec 2016 23:20:31 +0800 Subject: [PATCH 539/615] Update --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d9935e07..039775f2 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ * [安卓自定义View进阶 - 特殊形状控件事件处理方案](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B17%5Dtouch-matrix-region.md) +* [ViewSupport - 自定义View工具包](https://github.com/GcsSloop/ViewSupport) + ****** ## [教程类](https://github.com/GcsSloop/AndroidNote/tree/master/Course/README.md) @@ -90,7 +92,6 @@ ## 开源库 * [FontsManager - 快速替换字体](https://github.com/GcsSloop/FontsManager) -* [ViewSupport - 自定义View工具包](https://github.com/GcsSloop/ViewSupport) * [Rocker - 自定义摇杆](https://github.com/GcsSloop/Rocker) * [LeafLoading - 进度条](https://github.com/GcsSloop/LeafLoading) * [Rotate3dAnimation - 3D旋转动画(修正版)](https://github.com/GcsSloop/Rotate3dAnimation) From 4a705285ca935e5cb04832686a2113472513f1bb Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 25 Dec 2016 00:13:46 +0800 Subject: [PATCH 540/615] Update --- Course/Markdown/markdown-html.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Course/Markdown/markdown-html.md diff --git a/Course/Markdown/markdown-html.md b/Course/Markdown/markdown-html.md new file mode 100644 index 00000000..e69de29b From d56f57bffb32ce5debc08255d810e9982a442b54 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 27 Dec 2016 01:16:37 +0800 Subject: [PATCH 541/615] Update --- Course/Markdown/markdown-html.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Course/Markdown/markdown-html.md b/Course/Markdown/markdown-html.md index e69de29b..e62c3b86 100644 --- a/Course/Markdown/markdown-html.md +++ b/Course/Markdown/markdown-html.md @@ -0,0 +1,2 @@ +Markdown 网页格式兼容 + From 9a93508bd8568ec74fed077687cba8b2e9e56856 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 28 Dec 2016 23:58:13 +0800 Subject: [PATCH 542/615] Update --- Lecture/gdg-developer-growth-guide.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Lecture/gdg-developer-growth-guide.md b/Lecture/gdg-developer-growth-guide.md index d98b68c2..0a383423 100755 --- a/Lecture/gdg-developer-growth-guide.md +++ b/Lecture/gdg-developer-growth-guide.md @@ -156,6 +156,7 @@ Hello,大家好,我是 GcsSloop,今天是我第一次在这么多陌生人 [^1]: GDG 全称 Google Developer Group,中文意思是 **谷歌开发者社区** 。 + [^2]: DevFest 开发者节,今年(2016)的举办时间是 9月1日 到 11月30日 之间,全球大部分谷歌开发者社区都会举办该活动,一年一次。 From 008a7a5b6dd55a1b48ed89a634d01f8a336f0f8b Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 29 Dec 2016 01:23:30 +0800 Subject: [PATCH 543/615] Update --- OpenGL/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 OpenGL/README.md diff --git a/OpenGL/README.md b/OpenGL/README.md new file mode 100644 index 00000000..8f38aed2 --- /dev/null +++ b/OpenGL/README.md @@ -0,0 +1,3 @@ +# OpenGL + +OpenGL 全称 Open Graphics Library。 \ No newline at end of file From 1a2ce5933027b34cb8709da64d933842d9fef7d3 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 31 Dec 2016 23:46:08 +0800 Subject: [PATCH 544/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AE=80=E4=BB=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OpenGL/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenGL/README.md b/OpenGL/README.md index 8f38aed2..3f834828 100644 --- a/OpenGL/README.md +++ b/OpenGL/README.md @@ -1,3 +1,3 @@ # OpenGL -OpenGL 全称 Open Graphics Library。 \ No newline at end of file +OpenGL 全称 Open Graphics Library,是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。OpenGL 常用于CAD、虚拟实境、科学可视化程序和电子游戏开发。 From d87e54ba4cc3d8a2ff7bdbfdb14a94fecfc9ee71 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 2 Jan 2017 22:01:25 +0800 Subject: [PATCH 545/615] Update --- Lecture/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Lecture/README.md diff --git a/Lecture/README.md b/Lecture/README.md new file mode 100644 index 00000000..adeb5d56 --- /dev/null +++ b/Lecture/README.md @@ -0,0 +1 @@ +# 演讲稿 From df488f2ccdfc32aa7cc71581f3ae89a1fd02250f Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 11 Jan 2017 23:53:14 +0800 Subject: [PATCH 546/615] Update --- CustomView/Advance/[18]multi-touch.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CustomView/Advance/[18]multi-touch.md b/CustomView/Advance/[18]multi-touch.md index a72ff088..a37c0d7f 100644 --- a/CustomView/Advance/[18]multi-touch.md +++ b/CustomView/Advance/[18]multi-touch.md @@ -1,2 +1,5 @@ # 多点触控 +在前面的几篇文章中我们大致了解了 Android 中的事件处理流程和一些简单的处理方案,本次带大家了解 Android 多点触控相关的一些知识。 + +**多点触控** ( **Multitouch**,也称 **Multi-touch** ),即同时接受屏幕上多个点的人机交互操作,多点触控是从 Android 2.0 开始引入的功能,在 Android 2.2 时对这一部分进行了重新设计。 From d72e78ae7315c31f05462f6461e3fe08d00517c9 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 16 Jan 2017 06:22:58 +0800 Subject: [PATCH 547/615] Update --- CustomView/Advance/[18]multi-touch.md | 613 +++++++++++++++++++++++++- 1 file changed, 612 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[18]multi-touch.md b/CustomView/Advance/[18]multi-touch.md index a72ff088..d0034d9b 100644 --- a/CustomView/Advance/[18]multi-touch.md +++ b/CustomView/Advance/[18]multi-touch.md @@ -1,2 +1,613 @@ -# 多点触控 +# 多点触控详解 +Android 多点触控详解,在前面的几篇文章中我们大致了解了 Android 中的事件处理流程和一些简单的处理方案,本次带大家了解 Android 多点触控相关的一些知识。 + +**多点触控** ( **Multitouch**,也称 **Multi-touch** ),即同时接受屏幕上多个点的人机交互操作,多点触控是从 Android 2.0 开始引入的功能,在 Android 2.2 时对这一部分进行了重新设计。 + +在本文开始之前,先回顾一下 [MotionEvent详解][motionevent] 中提到过的内容: + +- Android 将所有的事件都封装进了 `Motionvent` 中。 +- 我们可以通过复写 `onTouchEvent` 或者设置 `OnTouchListener` 来获取 View 的事件。 +- 多点触控获取事件类型请使用 `getActionMasked()` 。 +- 追踪事件流请使用 `PointId`。 + +**多点触控相关的事件:** + +| 事件 | 简介 | +| --------------------------- | ------------------------------ | +| ACTION_DOWN | **第一个** 手指 **初次接触到屏幕** 时触发。 | +| ACTION_MOVE | 手指 **在屏幕上滑动** 时触发,会多次触发。 | +| ACTION_UP | **最后一个** 手指 **离开屏幕** 时触发。 | +| **ACTION_POINTER_DOWN** | 有非主要的手指按下(**即按下之前已经有手指在屏幕上**)。 | +| **ACTION_POINTER_UP** | 有非主要的手指抬起(**即抬起之后仍然有手指在屏幕上**)。 | +| 以下事件类型不推荐使用 | ---以下事件在 2.2 版本以上被标记为废弃--- | +| ~~ACTION_POINTER\_1\_DOWN~~ | 第 2 个手指按下,已废弃,不推荐使用。 | +| ~~ACTION_POINTER\_2\_DOWN~~ | 第 3 个手指按下,已废弃,不推荐使用。 | +| ~~ACTION_POINTER\_3\_DOWN~~ | 第 4 个手指按下,已废弃,不推荐使用。 | +| ~~ACTION_POINTER\_1\_UP~~ | 第 2 个手指抬起,已废弃,不推荐使用。 | +| ~~ACTION_POINTER\_2\_UP~~ | 第 3 个手指抬起,已废弃,不推荐使用。 | +| ~~ACTION_POINTER\_3\_UP~~ | 第 4 个手指抬起,已废弃,不推荐使用。 | + +**多点触控相关的方法:** + +| 方法 | 简介 | +| ------------------------------- | ---------------------------------------- | +| getActionMasked() | 与 `getAction()` 类似,**多点触控需要使用这个方法获取事件类型**。 | +| getActionIndex() | 获取该事件是哪个指针(手指)产生的。 | +| getPointerCount() | 获取在屏幕上手指的个数。 | +| getPointerId(int pointerIndex) | 获取一个指针(手指)的唯一标识符ID,在手指按下和抬起之间ID始终不变。 | +| findPointerIndex(int pointerId) | 通过PointerId获取到当前状态下PointIndex,之后通过PointIndex获取其他内容。 | +| getX(int pointerIndex) | 获取某一个指针(手指)的X坐标 | +| getY(int pointerIndex) | 获取某一个指针(手指)的Y坐标 | + +回顾完毕,开始正文。 + + + +## 一、多点触控相关问题 + +在引入多点触控之前,事件的类型很少,基本事件类型只有按下(down)、移动(move) 和 抬起(up),即便加上那些特殊的事件类型也只有几种而已,所以我们可以用几个常量来标记这些事件,在使用的时候使用 `getAction()` 方法来获取具体的事件,之后和这些常量进行对比就行了。 + +在 Android 2.0 版本的时候,开始引入多点触控技术,由于技术上并不成熟,硬件和驱动也跟不上,很数设备只能支持追踪两三个点而已,因此在设计 API 上采取了一种简单粗暴的方案,添加了几个常量作为多点触控的事件类型。 + +| 事件 | 简介 | +| ----------------------- | -------------------- | +| ACTION_POINTER\_1\_DOWN | 第 2 个手指按下,已废弃,不推荐使用。 | +| ACTION_POINTER\_2\_DOWN | 第 3 个手指按下,已废弃,不推荐使用。 | +| ACTION_POINTER\_3\_DOWN | 第 4 个手指按下,已废弃,不推荐使用。 | +| ACTION_POINTER\_1\_UP | 第 2 个手指抬起,已废弃,不推荐使用。 | +| ACTION_POINTER\_2\_UP | 第 3 个手指抬起,已废弃,不推荐使用。 | +| ACTION_POINTER\_3\_UP | 第 4 个手指抬起,已废弃,不推荐使用。 | + +这些事件类型是用来判断非主要手指(第一个按下的称为主要手指)的按下和抬起事件。使用起来大概是这样子: + +```java +switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: break; + case MotionEvent.ACTION_UP: break; + case MotionEvent.ACTION_MOVE: break; + case MotionEvent.ACTION_POINTER_1_DOWN: break; + case MotionEvent.ACTION_POINTER_2_DOWN: break; + case MotionEvent.ACTION_POINTER_3_DOWN: break; + case MotionEvent.ACTION_POINTER_1_UP: break; + case MotionEvent.ACTION_POINTER_2_UP: break; + case MotionEvent.ACTION_POINTER_3_UP: break; +} +``` + +看到这里可能会产生以下的一些疑问? + +### 1.为什么没有 ACTION_POINTER_X_MOVE ? + +在多指触控中所有的移动事件都是使用 `ACTION_MOVE`, 并没有追踪某一个手指的 move 事件类型,个人猜测主要是因为:**很难无歧义的实现单独追踪每一个手指。** + +要理解这个,首先要明白设备是如何识别多点触控的,设备没有眼睛,不能像我们人一样看到有几个手指(或者触控笔)在屏幕上。 +目前大多数 Android 设备都是电容屏,它们感知触摸是利用手指(触控笔)与屏幕接触产生的微小电流变化,之后通过计算这些电流变化来得出具体的触摸位置,在多点触控中,当两个触摸点足够靠近时,设备实际上是无法分清这两个点的。因此当两个触摸点靠近(重合)后再分开,设备很可能就无法正确的追踪两个点了,所以也很难实现无歧义的追踪每一个点。 + +并且从软件上来说,事件的编号产生和复用也是一个大问题,例如下面的场景: + +| 事件 | 手指数量 | 编号变化 | +| ------------ | :--: | ------------------------- | +| 一个手指按下(命名为A) | 1 | A手指的编号为0,id为0 | +| 一个手指按下(命名为B) | 2 | B手指的编号为1,id为1 | +| A手指抬起 | 1 | B手指编号变更为0,id不变为1 | +| 一个手指按下(命名为C) | 2 | C手指编号为0,id为0,B手指编号为1,id为1 | + +注意观察上面编号和id的变化,有两个问题,**1、B手指的编号变化了。2、A手指和C手指id是相同的(A手指抬起后,C手指按下替代了A手指)。**所以这就引出了一个问题:如果存在 ACTION_POINTER_X_MOVE,那么X应该用什么标志呢?编号会变化,id虽然不会变化,但id会被复用,例如A手指抬起后C手指按下,C手指复用了A手指的id。所以不论使用哪一个都不能保证唯一性。 + +当然了,解决问题最好的方式就是把问题抛出去,既然从硬件和软件上都不能保证唯一性和不变性,就不做区分了,因此所有的 move 事件都是 `ACTION_MOVE`, 具体是哪个手指产生的 move 用户可以根据其他事件(按下和抬起)来综合判断。 + +### 2.超过4个手指怎么办? + +**2.0 兼容版**,在2.2 之前的设计中,其提供的常量最多能判断四个手指的抬起和落下,当超过四个手指时怎么办呢? + +由于在 2.2 版本之前,由于没有 `getActionMasked` 方法,我们可以自己自己手动进行计算,例如下面这样 : + +```java +String TAG = "Gcs"; + +int action = event.getAction() & MotionEvent.ACTION_MASK; +int index = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) + >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; + +switch (action) { + case MotionEvent.ACTION_DOWN: + Log.e(TAG,"第1个手指按下"); + break; + case MotionEvent.ACTION_UP: + Log.e(TAG,"最后1个手指抬起"); + break; + case MotionEvent.ACTION_POINTER_1_DOWN: // 此时相当于 ACTION_POINTER_DOWN + Log.e(TAG,"第"+(index+1)+"个手指按下"); + break; + case MotionEvent.ACTION_POINTER_1_UP: // 此时相当于 ACTION_POINTER_UP + Log.e(TAG,"第"+(index+1)+"个手指抬起"); + break; +} +``` + +在上面的例子中有几点比较关键: + +#### 2.1、action 与 Index 的获得 + +我们在 [MotionEvent详解][motionevent] 中了解过,Android中的事件一般用最后8位来表示事件类型,再往前8位来表示Index。 + +例如多指触控的按下事件,其事件类型是 0x000000**05**, 其Index标志位是 0x0000**00**05,随着更多的手指按下,其中变化的部分是 Index 标志位,最后两位是始终不变的,所以我们只要能将这两个分离开就行了。 + +**取得事件类型(action)** + +```java +// 获取事件类型 +int action = event.getAction() & MotionEvent.ACTION_MASK; +``` + +这个非常简单,ACTION_MASK=0x000000ff, 与 getAction() 进行按位与操作后保留最后8位内容(十六进制每一个字符转化为二进制是4位)。 + +例如: +0x000001**05** & 0x000000ff = 0x000000**01** + +**取得事件索引(index)** + +```java +// 获取index编号 +int index = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) + >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; +``` + +ACTION_POINTER_INDEX_MASK = 0x0000ff00 +ACTION_POINTER_INDEX_SHIFT = 8 +首先让 getAction() 与 ACTION_POINTER_INDEX_MASK 按位与之后,只保留 Index 那8位,之后再右移8位,最终就拿到了 Index 的真实数值。 + +例如: +0x0000**01**05 & 0x0000ff00 = 0x0000**01**00 +0x0000**01**00 >> 8 = 0x000000**01** + +#### 2.2、用 ACTION\_POINTER\_1\_DOWN 代替 ACTION\_POINTER\_DOWN + +这是因为在 2.0 版本的时候还没有 ACTION\_POINTER\_DOWN 的这个常量,但是它们两个点数值是相同的,都是 0x00000005,这个你可以查看官方文档或者源码,甚至你直接写 `case 0x00000005` 也行,抬起也是同理。 + +#### 2.3、只考虑兼容 2.2 以上的版本 + +当然了,如果你不需要兼容 2.0 版本,只需要兼容到 2.2 以上的话就很简单了,像下面这样: + +```java +String TAG = "Gcs"; + +int index = event.getActionIndex(); + +switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + Log.e(TAG,"第1个手指按下"); + break; + case MotionEvent.ACTION_UP: + Log.e(TAG,"最后1个手指抬起"); + break; + case MotionEvent.ACTION_POINTER_DOWN: + Log.e(TAG,"第"+(index+1)+"个手指按下"); + break; + case MotionEvent.ACTION_POINTER_UP: + Log.e(TAG,"第"+(index+1)+"个手指抬起"); + break; +} +``` + +### 3. index 和 pointId 的变化规则 + +在 2.2 版本以上,我们可以通过 getActionIndex() 轻松获取到事件的索引(Index),但是这个事件索引的变化还是有点意思的,Index 变化有以下几个特点: + +1、从 0 开始,自动增长。 +2、如果之前落下的手指抬起,后面手指的 Index 会随之减小。 +3、Index 变化趋向于第一次落下的数值(落下手指时,前面有空缺会优先填补空缺)。 +4、对 move 事件无效。 + +下面我们逐条解释一下具体含义。 + +#### 3.1、从 0 开始,自动增长。 + +这一条非常简单,也很容易理解,而且在 [MotionEvent详解][motionevent] 中讲解 getAction() 与 getActionMasked() 也简单说过。 + +| 手指按下 | 触发事件(数值) | +| :-----: | :--------------------------------------- | +| 第1个手指按下 | ACTION_DOWN (0x0000**00**00) | +| 第2个手指按下 | ACTION_POINTER_DOWN (0x0000**01**05) | +| 第3个手指按下 | ACTION_POINTER_DOWN (0x0000**02**05) | +| 第4个手指按下 | ACTION_POINTER_DOWN (0x0000**03**05) | + +注意加粗的位置,数值随着手指按下而不断变大。 + +#### 3.2、如果之前落下的手指抬起,后面手指的 Index 会随之减小。 + +这个也比较容易理解,像下面这样: + +| 手指按下 | 触发事件(数值) | +| :-----: | :--------------------------------------- | +| 第1个手指按下 | ACTION_DOWN (0x0000**00**00) | +| 第2个手指按下 | ACTION_POINTER_DOWN (0x0000**01**05) | +| 第3个手指按下 | ACTION_POINTER_DOWN (0x0000**02**05) | +| 第2个手指抬起 | ACTION_POINTER_UP (0x0000**01**06) | +| 第3个手指抬起 | ACTION_POINTER_UP (0x0000**01**06) | + +注意最后两次触发的事件,它的 Index 都是 1,这样也比较容易解释,当原本的第 2 个手指抬起后,屏幕上就只剩下两个手指了,之前的第 3 个手指就变成了第 2 个,于是抬起时触发事件的 Index 为 1,即之前落下的手指抬起,后面手指的 Index 会随之减小。 + +#### 3.3、Index 变化趋向于第一次落下的数值(落下手指时,前面有空缺会优先填补空缺)。 + +这个就有点神奇了,通过上一条规则,我们知道,某一个手指的 Index 可能会随着其他手指的抬起而变小,这次我们用 4 个手指测试一下 Index 的变化趋势。 + +| 手指按下 | 触发事件(数值) | +| :---------: | :--------------------------------------- | +| 第1个手指按下 | ACTION_DOWN (0x0000**00**00) | +| 第2个手指按下 | ACTION_POINTER_DOWN (0x0000**01**05) | +| **第3个手指按下** | ACTION_POINTER_DOWN (0x0000**02**05) | +| 第2个手指抬起 | ACTION_POINTER_UP (0x0000**01**06) | +| ~~第3个手指抬起~~ | ~~ACTION_POINTER_UP~~ ~~(0x0000**01**06)~~ | +| 第4个手指按下 | ACTION_POINTER_DOWN (0x0000**01**05) | +| **第3个手指抬起** | ACTION_POINTER_UP (0x0000**02**06) | + +这个要和上一个对比这看,**重点观察第 3 个手指所触发事件区别**,在上一个示例中,随着第 2 个手指的抬起,第 3 个手指变化为第 2 个,所以抬起时触发的是第 2 根手指的抬起事件(删除线部分)。 + +但是,如果第 2 个手指抬起后,落在屏幕上另外一个手指会怎样?经过测试,发现另外**落下的手指会替代之前第 2 个手指的位置,系统判定为 2,而不是顺延下去变成 3**,但是如果继续落下其他的手指,数值则会顺延。 + +**即手指抬起时的 Index 会趋向于和按下时相同,虽然在手指数量不足时,Index 会变小,但是当手指变多时,Index 会保持和按下时一样。** + +> PS:由于程序是从0开始计数的,所以 0 就是 1, 1 就是 2 ... + +#### 3.4、对 move 事件无效。 + +这个也比较容易理解,我们所取得的 Index 属性实际上是从事件上分离下来的,但是 move 事件始终为 0x0000**00**02,也就是说,在 move 时不论你移动哪个手指,使用 ` getActionIndex()` 获取到的始终是数值 0。 + +既然 move 事件无法用事件索引(Index)区别,那么该如何区分 move 是那个手指发出的呢?这就要用到 pointId 了,**pointId 和 index 最大的区别就是 pointId 是不变的,始终为第一次落下时生成的数值,不会受到其他手指抬起和落下的影响。** + +#### 3.5、pointId 与 index 的异同。 + +相同点: + +* 从 0 开始,自动增长。 +* 落下手指时优先填补空缺(填补之前抬起手指的编号)。 + +不同点: + +* Index 会变化,pointId 始终不变。 + +### 4. Move 相关事件 + +#### 4.1 actionIndex 与 pointerIndex + +在 move 中无法取得 actionIndex 的,我们需要使用 pointerIndex 来获取更多的信息,例如某个手指的坐标: + +```java +getX(int pointerIndex) +getY(int pointerIndex) +``` + +**但是这个 pointerIndex 又是什么呢?和 actionIndex 有区别么?** + +实际上这个 pointerIndex 和 actionIndex 区别并不大,两者的数值是相同的,你可以认为 pointerIndex 是特地为 move 事件准备的 actionIndex。 + +#### 4.2 pointerIndex 与 pointerId + +| 类型 | 简介 | +| ------------ | ----------------------------- | +| pointerIndex | 用于获取具体事件,可能会随着其他手指的抬起和落下而变化 | +| pointerId | 用于识别手指,手指按下时产生,手指抬起时回收,期间始终不变 | + +这两个数值使用以下两个方法相互转换。 + +| 方法 | 简介 | +| ------------------------------- | ---------------------------------------- | +| getPointerId(int pointerIndex) | 获取一个指针(手指)的唯一标识符ID,在手指按下和抬起之间ID始终不变。 | +| findPointerIndex(int pointerId) | 通过 pointerId 获取到当前状态下 pointIndex,之后通过 pointIndex 获取其他内容。 | + +> 通常情况下,pointerIndex 和 pointerId 是相同的,但也可能会因为某些手指的抬起而变得不同。 + +#### 4.3 遍历多点触控 + +先来一个简单的,遍历出多个手指的 move 事件: + +```java +String TAG = "Gcs"; +switch (event.getActionMasked()) { + case MotionEvent.ACTION_MOVE: + for (int i = 0; i < event.getPointerCount(); i++) { + Log.i("TAG", "pointerIndex="+i+", pointerId="+event.getPointerId(i)); + // TODO + } +} +``` + +通过遍历 pointerCount 获取到所有的 pointerIndex,同时通过 pointerIndex 来获取 pointerId,可以通过不同手指抬起和按下后移动来观察 pointerIndex 和 pointerId 的变化。 + +#### 4.4 在多点触控中追踪单个手指 + +要实现追踪单个手指还是有些麻烦的,需要同时使用上 actionIndex, pointerId 和 pointerIndex,例如,我们只追踪第2个手指,并画出其位置: + +```java +/** + * 绘制出第二个手指第位置 + */ +public class MultiTouchTest extends CustomView { + String TAG = "Gcs"; + + // 用于判断第2个手指是否存在 + boolean haveSecondPoint = false; + + // 记录第2个手指第位置 + PointF point = new PointF(0, 0); + + public MultiTouchTest(Context context) { + this(context, null); + } + + public MultiTouchTest(Context context, AttributeSet attrs) { + super(context, attrs); + + mDeafultPaint.setAntiAlias(true); + mDeafultPaint.setTextAlign(Paint.Align.CENTER); + mDeafultPaint.setTextSize(30); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + int index = event.getActionIndex(); + + switch (event.getActionMasked()) { + case MotionEvent.ACTION_POINTER_DOWN: + // 判断是否是第2个手指按下 + if (event.getPointerId(index) == 1){ + haveSecondPoint = true; + point.set(event.getY(), event.getX()); + } + break; + case MotionEvent.ACTION_POINTER_UP: + // 判断抬起的手指是否是第2个 + if (event.getPointerId(index) == 1){ + haveSecondPoint = false; + point.set(0, 0); + } + break; + case MotionEvent.ACTION_MOVE: + if (haveSecondPoint) { + // 通过 pointerId 来获取 pointerIndex + int pointerIndex = event.findPointerIndex(1); + // 通过 pointerIndex 来取出对应的坐标 + point.set(event.getX(pointerIndex), event.getY(pointerIndex)); + } + break; + } + + invalidate(); // 刷新 + + return true; + } + + @Override + protected void onDraw(Canvas canvas) { + canvas.save(); + canvas.translate(mViewWidth/2, mViewHeight/2); + canvas.drawText("追踪第2个按下手指的位置", 0, 0, mDeafultPaint); + canvas.restore(); + + // 如果屏幕上有第2个手指则绘制出来其位置 + if (haveSecondPoint) { + canvas.drawCircle(point.x, point.y, 50, mDeafultPaint); + } + } +} +``` + +这段代码也非常短,其核心就是通过判断数值为 1 的 pointerId 是否存在,如果存在就在 move 的时候取出其坐标,并绘制出来。 + +![SecondPoint](http://ww3.sinaimg.cn/large/006y8lVagw1fbs1vkt1mwj30bo0jq3z3.jpg) + +> 虽然逻辑简单,但个人感觉写起来还是有些麻烦,如果有更简单的方案欢迎告诉我。 + + + +## 二、如何使用多点触控 + +多点触控应用还是比较广泛的,至少目前大部分的图片查看都需要用到多点触控技术(用于拖动和缩放图片)。 + +但是在某些看似不需要多触控的地方也需要对多点触控进行判断,只要是多点触控可能引起错误的地方都应该加上多点触控的判断。例如使用到 move 事件的时候,由于 move 事件可能由多个手指同时触发,所以可能会出现同时被多个手指控制的情况,如果不适当的处理,这个 move 就可能由任何一个手指触发。 + +举一个简单的例子: + +如果我们需要一个**可以用单指拖动的图片**。加入我们不进行多指触控的判断,像下面这样: + +**没有针对多指触控处理版本:** + +```java +/** + * 一个可以拖图片动的 View + */ +public class DragView1 extends CustomView { + String TAG = "Gcs"; + + Bitmap mBitmap; // 图片 + RectF mBitmapRectF; // 图片所在区域 + Matrix mBitmapMatrix; // 控制图片的 matrix + + boolean canDrag = false; + PointF lastPoint = new PointF(0, 0); + + public DragView1(Context context) { + this(context, null); + } + + public DragView1(Context context, AttributeSet attrs) { + super(context, attrs); + + // 调整图片大小 + BitmapFactory.Options options = new BitmapFactory.Options(); + options.outWidth = 960/2; + options.outHeight = 800/2; + + mBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.drag_test, options); + mBitmapRectF = new RectF(0,0,mBitmap.getWidth(), mBitmap.getHeight()); + mBitmapMatrix = new Matrix(); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + // 判断按下位置是否包含在图片区域内 + if (mBitmapRectF.contains((int)event.getX(), (int)event.getY())){ + canDrag = true; + lastPoint.set(event.getX(), event.getY()); + } + break; + case MotionEvent.ACTION_UP: + canDrag = false; + case MotionEvent.ACTION_MOVE: + if (canDrag) { + // 移动图片 + mBitmapMatrix.postTranslate(event.getX() - lastPoint.x, event.getY() - lastPoint.y); + // 更新上一次点位置 + lastPoint.set(event.getX(), event.getY()); + + // 更新图片区域 + mBitmapRectF = new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight()); + mBitmapMatrix.mapRect(mBitmapRectF); + + invalidate(); + } + break; + } + + return true; + } + + @Override + protected void onDraw(Canvas canvas) { + canvas.drawBitmap(mBitmap, mBitmapMatrix, mDeafultPaint); + } +} +``` + +这个版本非常简单,当然了,如果正常使用(只使用一个手指)的话也不会出问题,但是当使用多个手指,且有抬起和按下的时候就可能出问题,下面用一个典型的场景演示一下: + +![dragview1](http://ww2.sinaimg.cn/large/006y8lVagw1fbs1vm2rppg308c0d4kfm.gif) + +注意在第二个手指按下,第一个手指抬起时,此时原本的第二个手指会被识别为第一个,所以图片会直接跳动到第二个手指位置。 + +为了不出现这种情况,我们可以判断一下 pointId 并且只获取第一个手指的数据,这样就能避免这种情况发生了,如下。 + +**针对多指触控处理后版本:** + +```java +/** + * 一个可以拖图片动的 View + */ +public class DragView extends CustomView { + String TAG = "Gcs"; + + Bitmap mBitmap; // 图片 + RectF mBitmapRectF; // 图片所在区域 + Matrix mBitmapMatrix; // 控制图片的 matrix + + boolean canDrag = false; + PointF lastPoint = new PointF(0, 0); + + public DragView(Context context) { + this(context, null); + } + + public DragView(Context context, AttributeSet attrs) { + super(context, attrs); + + BitmapFactory.Options options = new BitmapFactory.Options(); + options.outWidth = 960/2; + options.outHeight = 800/2; + + mBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.drag_test, options); + mBitmapRectF = new RectF(0,0,mBitmap.getWidth(), mBitmap.getHeight()); + mBitmapMatrix = new Matrix(); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + // ▼ 判断是否是第一个手指 && 是否包含在图片区域内 + if (event.getPointerId(event.getActionIndex()) == 0 && mBitmapRectF.contains((int)event.getX(), (int)event.getY())){ + canDrag = true; + lastPoint.set(event.getX(), event.getY()); + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + // ▼ 判断是否是第一个手指 + if (event.getPointerId(event.getActionIndex()) == 0){ + canDrag = false; + } + break; + case MotionEvent.ACTION_MOVE: + // 如果存在第一个手指,且这个手指的落点在图片区域内 + if (canDrag) { + // ▼ 注意 getX 和 getY + int index = event.findPointerIndex(0); + // Log.i(TAG, "index="+index); + mBitmapMatrix.postTranslate(event.getX(index)-lastPoint.x, event.getY(index)-lastPoint.y); + lastPoint.set(event.getX(index), event.getY(index)); + + mBitmapRectF = new RectF(0,0,mBitmap.getWidth(), mBitmap.getHeight()); + mBitmapMatrix.mapRect(mBitmapRectF); + + invalidate(); + } + break; + } + + return true; + } + + @Override + protected void onDraw(Canvas canvas) { + canvas.drawBitmap(mBitmap, mBitmapMatrix, mDeafultPaint); + } +} +``` + +可以看到,比起上一个版本并么有多多少代码,但是更加“智能”了,可以准确识别某一个手指,不会因为手指抬起而认错手指。 + +![dragview2](http://ww2.sinaimg.cn/large/006y8lVagw1fbs1vmwpu4g308c0d4nf9.gif) + +**重点注意最后,第一个手指抬起之后,图片并没有跳跃到第二个手指的位置。** + +上面的两个对比示例都精简到了极致,其核心依旧是正确的追踪某一个手指,建议大家自己写一遍体会一下。 + +---- + +我感觉很多人看到这里依旧是不明所以的,一些简单的东西还好弄,但是复杂一些,如同时处理多个手指的数值就有些困难了,**假如说你之前没有接触过多点触控的处理,此时让你实现用两个手指来缩放图片还是有些困难的。** + +因为这不仅要追踪两个手指的位置,还要根据位置变化来计算缩放比例和缩放中心,单单这两个非常简单的数学问题就能难倒一大批人。 + +![-510a02a1a3f8d16d](http://ww2.sinaimg.cn/large/006y8lVagw1fbs1vnfni1g307b07ct8m.gif) + +当然了,很多麻烦问题都有简单的解决方案,假如说我们真的要实现一个可以用两个或者多个手指缩放的控件,何必要自己算呢,可以尝试一下 Android 自带的解决方案:**手势检测(GestureDetector)**,不仅能自动帮你计算好缩放比例和缩放中心,而且还可以检测出 单击、长按、滑屏 等不同的手势,不过这就不是本篇的事情了,以后有时间会写一下有关手势检测的用法(继续挖坑)。 + +## 三、总结 + +前段时间因为各种事情比较忙,这篇文章也没时间去写,所以就一直拖到了现在,期间收到不少读者催更,实在是抱歉了。今后在会尽量保证稳定更新的,争取尽快把自定义View系列这一个大坑填完。 ˊ_>ˋ + +关于多点触控,个人认为还算一个比较重要的知识点。尤其是随着 Android 的发展,很多炫酷的交互操作可能会需要用户进行拖拽操作。在进行这类操作的时候进行一下手指的判断还是相当重要的。 + +本文中需要注意的几个知识点: + +* 如何兼容 2.0 版本的多点触控(目前大部分都不需要兼容 2.0 了吧)。 +* actionIndex、pointIndex 与 pointId 的区别和用法。 +* 如何在多点触控中正确的追踪一个手指。 + +## About Me + +### 作者微博: @GcsSloop + + + +## 参考资料 + +[MotionEvent ](https://developer.android.com/reference/android/view/MotionEvent.html) + + + +[motionevent]: http://www.gcssloop.com/customview/motionevent \ No newline at end of file From 2fdd7695e1ff08742b2a2c57628ffd2fd21968e4 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 16 Jan 2017 06:56:10 +0800 Subject: [PATCH 548/615] Update --- CustomView/Advance/[18]multi-touch.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[18]multi-touch.md b/CustomView/Advance/[18]multi-touch.md index 044b59fe..3f534ec9 100644 --- a/CustomView/Advance/[18]multi-touch.md +++ b/CustomView/Advance/[18]multi-touch.md @@ -1,4 +1,4 @@ -# 多点触控详解 +# 多点触控详解 Android 多点触控详解,在前面的几篇文章中我们大致了解了 Android 中的事件处理流程和一些简单的处理方案,本次带大家了解 Android 多点触控相关的一些知识。 @@ -48,7 +48,7 @@ Android 多点触控详解,在前面的几篇文章中我们大致了解了 An 在引入多点触控之前,事件的类型很少,基本事件类型只有按下(down)、移动(move) 和 抬起(up),即便加上那些特殊的事件类型也只有几种而已,所以我们可以用几个常量来标记这些事件,在使用的时候使用 `getAction()` 方法来获取具体的事件,之后和这些常量进行对比就行了。 -在 Android 2.0 版本的时候,开始引入多点触控技术,由于技术上并不成熟,硬件和驱动也跟不上,很数设备只能支持追踪两三个点而已,因此在设计 API 上采取了一种简单粗暴的方案,添加了几个常量作为多点触控的事件类型。 +在 Android 2.0 版本的时候,开始引入多点触控技术,由于技术上并不成熟,硬件和驱动也跟不上,很数设备只能支持追踪两三个点而已,因此在设计 API 上采取了一种简单粗暴的方案,添加了几个常量用语多点触控的事件类型的判断。 | 事件 | 简介 | | ----------------------- | -------------------- | @@ -59,7 +59,7 @@ Android 多点触控详解,在前面的几篇文章中我们大致了解了 An | ACTION_POINTER\_2\_UP | 第 3 个手指抬起,已废弃,不推荐使用。 | | ACTION_POINTER\_3\_UP | 第 4 个手指抬起,已废弃,不推荐使用。 | -这些事件类型是用来判断非主要手指(第一个按下的称为主要手指)的按下和抬起事件。使用起来大概是这样子: +这些事件类型是用来判断非主要手指(第一个按下的称为主要手指)的按下和抬起,使用起来大概是这样子: ```java switch (event.getAction()) { From 95245d55889872341c8f72de14f780009efcfadc Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 16 Jan 2017 14:19:23 +0800 Subject: [PATCH 549/615] Update --- CustomView/Advance/[18]multi-touch.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[18]multi-touch.md b/CustomView/Advance/[18]multi-touch.md index 3f534ec9..ff59eacc 100644 --- a/CustomView/Advance/[18]multi-touch.md +++ b/CustomView/Advance/[18]multi-touch.md @@ -144,7 +144,7 @@ int action = event.getAction() & MotionEvent.ACTION_MASK; 这个非常简单,ACTION_MASK=0x000000ff, 与 getAction() 进行按位与操作后保留最后8位内容(十六进制每一个字符转化为二进制是4位)。 例如: -0x000001**05** & 0x000000ff = 0x000000**01** +0x000001**05** & 0x000000ff = 0x000000**05** **取得事件索引(index)** @@ -610,4 +610,4 @@ public class DragView extends CustomView { -[motionevent]: http://www.gcssloop.com/customview/motionevent \ No newline at end of file +[motionevent]: http://www.gcssloop.com/customview/motionevent From 26850480a04c09698cad444f08bfc901e5c3616e Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 17 Jan 2017 13:16:28 +0800 Subject: [PATCH 550/615] Update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 039775f2..6228a394 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ * [安卓自定义View进阶 - 事件分发机制详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B15%5DDispatch-TouchEvent-Source.md) * [安卓自定义View进阶 - MotionEvent详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B16%5DMotionEvent.md) * [安卓自定义View进阶 - 特殊形状控件事件处理方案](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B17%5Dtouch-matrix-region.md) +    * [安卓自定义View进阶 - 多点触控详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B18%5Dmulti-touch.md) * [ViewSupport - 自定义View工具包](https://github.com/GcsSloop/ViewSupport) From d1d658167e5f71246edc4f3171fd50f8ffa08e81 Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 17 Jan 2017 13:17:09 +0800 Subject: [PATCH 551/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6228a394..bc434206 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ * [安卓自定义View进阶 - 事件分发机制原理](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B12%5DDispatch-TouchEvent-Theory.md) * [安卓自定义View进阶 - 事件分发机制详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B15%5DDispatch-TouchEvent-Source.md) * [安卓自定义View进阶 - MotionEvent详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B16%5DMotionEvent.md) - * [安卓自定义View进阶 - 特殊形状控件事件处理方案](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B17%5Dtouch-matrix-region.md) + * [安卓自定义View进阶 - 特殊形状控件事件处理方案](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B17%5Dtouch-matrix-region.md)    * [安卓自定义View进阶 - 多点触控详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B18%5Dmulti-touch.md) From 56aafd8238fe33bed895eea6a30a6ff10322a88f Mon Sep 17 00:00:00 2001 From: sloop Date: Tue, 17 Jan 2017 13:17:56 +0800 Subject: [PATCH 552/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bc434206..3b7c74ac 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ * [安卓自定义View进阶 - 事件分发机制详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B15%5DDispatch-TouchEvent-Source.md) * [安卓自定义View进阶 - MotionEvent详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B16%5DMotionEvent.md) * [安卓自定义View进阶 - 特殊形状控件事件处理方案](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B17%5Dtouch-matrix-region.md) -    * [安卓自定义View进阶 - 多点触控详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B18%5Dmulti-touch.md) + * [安卓自定义View进阶 - 多点触控详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B18%5Dmulti-touch.md) * [ViewSupport - 自定义View工具包](https://github.com/GcsSloop/ViewSupport) From 8d382604f04176a3f72692da01090d1e61b60385 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 18 Jan 2017 02:51:13 +0800 Subject: [PATCH 553/615] Update --- CustomView/Advance/[08]Path_Play.md | 388 +++++++++++++++------------- 1 file changed, 212 insertions(+), 176 deletions(-) diff --git a/CustomView/Advance/[08]Path_Play.md b/CustomView/Advance/[08]Path_Play.md index 3c6e342c..7b4285a8 100644 --- a/CustomView/Advance/[08]Path_Play.md +++ b/CustomView/Advance/[08]Path_Play.md @@ -1,13 +1,9 @@ # Path之玩出花样(PathMeasure) -### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) -### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) - - 可以看到,在经过 -[Path之基本操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B05%5DPath_Basic.md) -[Path之贝塞尔曲线](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B06%5DPath_Bezier.md) 和 -[Path之完结篇(伪)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B07%5DPath_Over.md) 后, Path中各类方法基本上都讲完了,表格中还没有讲解到到方法就是矩阵变换了,难道本篇终于要讲矩阵了? +[Path之基本操作](http://www.gcssloop.com/customview/Path_Basic/) +[Path之贝塞尔曲线](http://www.gcssloop.com/customview/Path_Bezier/) 和 +[Path之完结篇](http://www.gcssloop.com/customview/Path_Over/) 后, Path中各类方法基本上都讲完了,表格中还没有讲解到到方法就是矩阵变换了,难道本篇终于要讲矩阵了? 非也,矩阵这一部分仍在后面单独讲解,本篇主要讲解 PathMeasure 这个类与 Path 的一些使用技巧。 > PS:不要问我为什么不讲 PathEffect,因为这个方法在后面的Paint系列中。 @@ -16,9 +12,9 @@ ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f4fp2myqo4g308c05k75k.gif) -****** +------ -## Path & PathMeasure +## Path & PathMeasure 顾名思义,PathMeasure是一个用来测量Path的类,主要有以下方法: @@ -43,8 +39,7 @@ PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 -****** - +------ ### 1.构造函数 @@ -52,7 +47,7 @@ PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 **无参构造函数:** -``` java +```java PathMeasure () ``` @@ -60,7 +55,7 @@ PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 **有参构造函数:** -``` java +```java PathMeasure (Path path, boolean forceClosed) ``` @@ -71,33 +66,35 @@ PathMeasure的方法也不多,接下来我们就逐一的讲解一下。 **在这里有两点需要明确:** > -* 1. 不论 forceClosed 设置为何种状态(true 或者 false), 都不会影响原有Path的状态,**即 Path 与 PathMeasure 关联之后,之前的的 Path 不会有任何改变。** -* 2. forceClosed 的设置状态可能会影响测量结果,**如果 Path 未闭合但在与 PathMeasure 关联的时候设置 forceClosed 为 true 时,测量结果可能会比 Path 实际长度稍长一点,获取到到是该 Path 闭合时的状态。** + +- 1. 不论 forceClosed 设置为何种状态(true 或者 false), 都不会影响原有Path的状态,**即 Path 与 PathMeasure 关联之后,之前的的 Path 不会有任何改变。** +- 1. forceClosed 的设置状态可能会影响测量结果,**如果 Path 未闭合但在与 PathMeasure 关联的时候设置 forceClosed 为 true 时,测量结果可能会比 Path 实际长度稍长一点,获取到到是该 Path 闭合时的状态。** 下面我们用一个例子来验证一下: -``` - canvas.translate(mViewWidth/2,mViewHeight/2); +```java +canvas.translate(mViewWidth/2,mViewHeight/2); - Path path = new Path(); +Path path = new Path(); - path.lineTo(0,200); - path.lineTo(200,200); - path.lineTo(200,0); +path.lineTo(0,200); +path.lineTo(200,200); +path.lineTo(200,0); - PathMeasure measure1 = new PathMeasure(path,false); - PathMeasure measure2 = new PathMeasure(path,true); +PathMeasure measure1 = new PathMeasure(path,false); +PathMeasure measure2 = new PathMeasure(path,true); - Log.e("TAG", "forceClosed=false---->"+measure1.getLength()); - Log.e("TAG", "forceClosed=true----->"+measure2.getLength()); +Log.e("TAG", "forceClosed=false---->"+measure1.getLength()); +Log.e("TAG", "forceClosed=true----->"+measure2.getLength()); - canvas.drawPath(path,mDeafultPaint); +canvas.drawPath(path,mDeafultPaint); ``` log如下: -``` - 25521-25521/com.gcssloop.canvas E/TAG: forceClosed=false---->600.0 - 25521-25521/com.gcssloop.canvas E/TAG: forceClosed=true----->800.0 + +```shell +com.gcssloop.canvas E/TAG: forceClosed=false---->600.0 +com.gcssloop.canvas E/TAG: forceClosed=true----->800.0 ``` 绘制在界面上的效果如下: @@ -107,10 +104,9 @@ log如下: 我们所创建的 Path 实际上是一个边长为 200 的正方形的三条边,通过上面的示例就能验证以上两个问题。 > -* 1.我们将 Path 与两个的 PathMeasure 进行关联,并给 forceClosed 设置了不同的状态,之后绘制再绘制出来的 Path 没有任何变化,所以与 Path 与 PathMeasure进行关联并不会影响 Path 状态。 -* 2.我们可以看到,设置 forceClosed 为 true 的方法比设置为 false 的方法测量出来的长度要长一点,这是由于 Path 没有闭合的缘故,多出来的距离正是 Path 最后一个点与最开始一个点之间点距离。**forceClosed 为 false 测量的是当前 Path 状态的长度, forceClosed 为 true,则不论Path是否闭合测量的都是 Path 的闭合长度。** - +- 1.我们将 Path 与两个的 PathMeasure 进行关联,并给 forceClosed 设置了不同的状态,之后绘制再绘制出来的 Path 没有任何变化,所以与 Path 与 PathMeasure进行关联并不会影响 Path 状态。 +- 2.我们可以看到,设置 forceClosed 为 true 的方法比设置为 false 的方法测量出来的长度要长一点,这是由于 Path 没有闭合的缘故,多出来的距离正是 Path 最后一个点与最开始一个点之间点距离。**forceClosed 为 false 测量的是当前 Path 状态的长度, forceClosed 为 true,则不论Path是否闭合测量的都是 Path 的闭合长度。** @@ -126,14 +122,12 @@ getLength 用于获取 Path 的总长度,在之前的测试中已经用过了 - - ### 3.getSegment getSegment 用于获取Path的一个片段,方法如下: -``` java - boolean getSegment (float startD, float stopD, Path dst, boolean startWithMoveTo) +```java +boolean getSegment (float startD, float stopD, Path dst, boolean startWithMoveTo) ``` 方法各个参数释义: @@ -147,8 +141,9 @@ getSegment 用于获取Path的一个片段,方法如下: | startWithMoveTo | 起始点是否使用 moveTo | 用于保证截取的 Path 第一个点位置不变 | > -* 如果 startD、stopD 的数值不在取值范围 [0, getLength] 内,或者 startD == stopD 则返回值为 false,不会改变 dst 内容。 -* 如果在安卓4.4或者之前的版本,在默认开启硬件加速的情况下,更改 dst 的内容后可能绘制会出现问题,请关闭硬件加速或者给 dst 添加一个单个操作,例如: dst.rLineTo(0, 0) + +- 如果 startD、stopD 的数值不在取值范围 [0, getLength] 内,或者 startD == stopD 则返回值为 false,不会改变 dst 内容。 +- 如果在安卓4.4或者之前的版本,在默认开启硬件加速的情况下,更改 dst 的内容后可能绘制会出现问题,请关闭硬件加速或者给 dst 添加一个单个操作,例如: dst.rLineTo(0, 0) 我们先看看这个方法如何使用: @@ -160,20 +155,20 @@ getSegment 用于获取Path的一个片段,方法如下: 代码: -``` java - canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 +```java +canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 - Path path = new Path(); // 创建Path并添加了一个矩形 - path.addRect(-200, -200, 200, 200, Path.Direction.CW); +Path path = new Path(); // 创建Path并添加了一个矩形 +path.addRect(-200, -200, 200, 200, Path.Direction.CW); - Path dst = new Path(); // 创建用于存储截取后内容的 Path +Path dst = new Path(); // 创建用于存储截取后内容的 Path - PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 +PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 - // 截取一部分存入dst中,并使用 moveTo 保持截取得到的 Path 第一个点的位置不变 - measure.getSegment(200, 600, dst, true); +// 截取一部分存入dst中,并使用 moveTo 保持截取得到的 Path 第一个点的位置不变 +measure.getSegment(200, 600, dst, true); - canvas.drawPath(dst, mDeafultPaint); // 绘制 dst +canvas.drawPath(dst, mDeafultPaint); // 绘制 dst ``` 结果如下: @@ -182,20 +177,20 @@ getSegment 用于获取Path的一个片段,方法如下: 从上图可以看到我们成功到将需要到片段截取了出来,然而当 dst 中有内容时会怎样呢? -``` java - canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 +```java +canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 - Path path = new Path(); // 创建Path并添加了一个矩形 - path.addRect(-200, -200, 200, 200, Path.Direction.CW); +Path path = new Path(); // 创建Path并添加了一个矩形 +path.addRect(-200, -200, 200, 200, Path.Direction.CW); - Path dst = new Path(); // 创建用于存储截取后内容的 Path - dst.lineTo(-300, -300); // <--- 在 dst 中添加一条线段 +Path dst = new Path(); // 创建用于存储截取后内容的 Path +dst.lineTo(-300, -300); // <--- 在 dst 中添加一条线段 - PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 +PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 - measure.getSegment(200, 600, dst, true); // 截取一部分 并使用 moveTo 保持截取得到的 Path 第一个点的位置不变 +measure.getSegment(200, 600, dst, true); // 截取一部分 并使用 moveTo 保持截取得到的 Path 第一个点的位置不变 - canvas.drawPath(dst, mDeafultPaint); // 绘制 Path +canvas.drawPath(dst, mDeafultPaint); // 绘制 Path ``` 结果如下: @@ -206,20 +201,20 @@ getSegment 用于获取Path的一个片段,方法如下: 前面两个例子中 startWithMoveTo 均为 true, 如果设置为false会怎样呢? -``` java - canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 +```java +canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 - Path path = new Path(); // 创建Path并添加了一个矩形 - path.addRect(-200, -200, 200, 200, Path.Direction.CW); +Path path = new Path(); // 创建Path并添加了一个矩形 +path.addRect(-200, -200, 200, 200, Path.Direction.CW); - Path dst = new Path(); // 创建用于存储截取后内容的 Path - dst.lineTo(-300, -300); // 在 dst 中添加一条线段 +Path dst = new Path(); // 创建用于存储截取后内容的 Path +dst.lineTo(-300, -300); // 在 dst 中添加一条线段 - PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 +PathMeasure measure = new PathMeasure(path, false); // 将 Path 与 PathMeasure 关联 - measure.getSegment(200, 600, dst, false); // <--- 截取一部分 不使用 startMoveTo, 保持 dst 的连续性 +measure.getSegment(200, 600, dst, false); // <--- 截取一部分 不使用 startMoveTo, 保持 dst 的连续性 - canvas.drawPath(dst, mDeafultPaint); // 绘制 Path +canvas.drawPath(dst, mDeafultPaint); // 绘制 Path ``` 结果如下: @@ -237,8 +232,6 @@ getSegment 用于获取Path的一个片段,方法如下: - - ### 4.nextContour 我们知道 Path 可以由多条曲线构成,但不论是 getLength , getgetSegment 或者是其它方法,都只会在其中第一条线段上运行,而这个 `nextContour` 就是用于跳转到下一条曲线到方法,_如果跳转成功,则返回 true, 如果跳转失败,则返回 false。_ @@ -249,49 +242,47 @@ getSegment 用于获取Path的一个片段,方法如下: 代码: -``` java - canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 +```java +canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 + +Path path = new Path(); - Path path = new Path(); +path.addRect(-100, -100, 100, 100, Path.Direction.CW); // 添加小矩形 +path.addRect(-200, -200, 200, 200, Path.Direction.CW); // 添加大矩形 - path.addRect(-100, -100, 100, 100, Path.Direction.CW); // 添加小矩形 - path.addRect(-200, -200, 200, 200, Path.Direction.CW); // 添加大矩形 +canvas.drawPath(path,mDeafultPaint); // 绘制 Path - canvas.drawPath(path,mDeafultPaint); // 绘制 Path - - PathMeasure measure = new PathMeasure(path, false); // 将Path与PathMeasure关联 +PathMeasure measure = new PathMeasure(path, false); // 将Path与PathMeasure关联 - float len1 = measure.getLength(); // 获得第一条路径的长度 +float len1 = measure.getLength(); // 获得第一条路径的长度 - measure.nextContour(); // 跳转到下一条路径 +measure.nextContour(); // 跳转到下一条路径 - float len2 = measure.getLength(); // 获得第二条路径的长度 +float len2 = measure.getLength(); // 获得第二条路径的长度 - Log.i("LEN","len1="+len1); // 输出两条路径的长度 - Log.i("LEN","len2="+len2); +Log.i("LEN","len1="+len1); // 输出两条路径的长度 +Log.i("LEN","len2="+len2); ``` log输出结果: -``` -05-30 02:00:33.899 19879-19879/com.gcssloop.canvas I/LEN: len1=800.0 -05-30 02:00:33.899 19879-19879/com.gcssloop.canvas I/LEN: len2=1600.0 + +```shell +com.gcssloop.canvas I/LEN: len1=800.0 +com.gcssloop.canvas I/LEN: len2=1600.0 ``` 通过测试,我们可以得到以下内容: -* 1.曲线的顺序与 Path 中添加的顺序有关。 -* 2.getLength 获取到到是当前一条曲线分长度,而不是整个 Path 的长度。 -* 3.getLength 等方法是针对当前的曲线(其它方法请自行验证)。 - - - - +- 1.曲线的顺序与 Path 中添加的顺序有关。 +- 2.getLength 获取到到是当前一条曲线分长度,而不是整个 Path 的长度。 +- 3.getLength 等方法是针对当前的曲线(其它方法请自行验证)。 #### 5.getPosTan 这个方法是用于得到路径上某一长度的位置以及该位置的正切值: -``` java - boolean getPosTan (float distance, float[] pos, float[] tan) + +```java +boolean getPosTan (float distance, float[] pos, float[] tan) ``` 方法各个参数释义: @@ -300,88 +291,140 @@ log输出结果: | ------------ | ------------- | ---------------------------------------- | | 返回值(boolean) | 判断获取是否成功 | true表示成功,数据会存入 pos 和 tan 中,
false 表示失败,pos 和 tan 不会改变 | | distance | 距离 Path 起点的长度 | 取值范围: 0 <= distance <= getLength | -| pos | 该点的坐标值 | 坐标值: (x==[0], y==[1]) | -| tan | 该点的正切值 | 正切值: (x==[0], y==[1]) | +| pos | 该点的坐标值 | 当前点在画布上的位置,有两个数值,分别为x,y坐标。 | +| tan | 该点的正切值 | 当前点在曲线上的方向,使用 Math.atan2(tan[1], tan[0]) 获取到正切角的弧度值。 | 这个方法也不难理解,除了其中 `tan` 这个东东,这个东西是干什么的呢? -`tan` 是用来判断 Path 的趋势的,即在这个位置上曲线的走向,请看下图示例,注意箭头的方向: +`tan` 是用来判断 Path 上趋势的,即在这个位置上曲线的走向,请看下图示例,注意箭头的方向: ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f4dtufydm4g308c0etmyl.gif) **[点击这里下载箭头图片](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4gam21ktoj3069069jre.jpg)** -可以看到 上图中箭头在沿着 Path 运动时,方向始终与 Path 走向保持一致,下面我们来看看代码是如何实现的: +可以看到 上图中箭头在沿着 Path 运动时,方向始终与 Path 走向保持一致,保持方向主要就是依靠 `tan` 。 -首先我们需要定义几个必要的变量: +下面我们来看看代码是如何实现的,首先我们需要定义几个必要的变量: -``` java - private float currentValue = 0; // 用于纪录当前的位置,取值范围[0,1]映射Path的整个长度 +```java +private float currentValue = 0; // 用于纪录当前的位置,取值范围[0,1]映射Path的整个长度 - private float[] pos; // 当前点的实际位置 - private float[] tan; // 当前点的tangent值,用于计算图片所需旋转的角度 - private Bitmap mBitmap; // 箭头图片 - private Matrix mMatrix; // 矩阵,用于对图片进行一些操作 +private float[] pos; // 当前点的实际位置 +private float[] tan; // 当前点的tangent值,用于计算图片所需旋转的角度 +private Bitmap mBitmap; // 箭头图片 +private Matrix mMatrix; // 矩阵,用于对图片进行一些操作 ``` 初始化这些变量(在构造函数中调用这个方法): -``` java - private void init(Context context) { - pos = new float[2]; - tan = new float[2]; - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inSampleSize = 2; // 缩放图片 - mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.arrow, options); - mMatrix = new Matrix(); - } +```java +private void init(Context context) { + pos = new float[2]; + tan = new float[2]; + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inSampleSize = 2; // 缩放图片 + mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.arrow, options); + mMatrix = new Matrix(); +} ``` 具体绘制: -``` java +```java +canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 - canvas.translate(mViewWidth / 2, mViewHeight / 2); // 平移坐标系 +Path path = new Path(); // 创建 Path - Path path = new Path(); // 创建 Path +path.addCircle(0, 0, 200, Path.Direction.CW); // 添加一个圆形 - path.addCircle(0, 0, 200, Path.Direction.CW); // 添加一个圆形 +PathMeasure measure = new PathMeasure(path, false); // 创建 PathMeasure - PathMeasure measure = new PathMeasure(path, false); // 创建 PathMeasure +currentValue += 0.005; // 计算当前的位置在总长度上的比例[0,1] +if (currentValue >= 1) { + currentValue = 0; +} - currentValue += 0.005; // 计算当前的位置在总长度上的比例[0,1] - if (currentValue >= 1) { - currentValue = 0; - } +measure.getPosTan(measure.getLength() * currentValue, pos, tan); // 获取当前位置的坐标以及趋势 - measure.getPosTan(measure.getLength() * currentValue, pos, tan); // 获取当前位置的坐标以及趋势 +mMatrix.reset(); // 重置Matrix +float degrees = (float) (Math.atan2(tan[1], tan[0]) * 180.0 / Math.PI); // 计算图片旋转角度 - mMatrix.reset(); // 重置Matrix - float degrees = (float) (Math.atan2(tan[1], tan[0]) * 180.0 / Math.PI); // 计算图片旋转角度 +mMatrix.postRotate(degrees, mBitmap.getWidth() / 2, mBitmap.getHeight() / 2); // 旋转图片 +mMatrix.postTranslate(pos[0] - mBitmap.getWidth() / 2, pos[1] - mBitmap.getHeight() / 2); // 将图片绘制中心调整到与当前点重合 - mMatrix.postRotate(degrees, mBitmap.getWidth() / 2, mBitmap.getHeight() / 2); // 旋转图片 - mMatrix.postTranslate(pos[0] - mBitmap.getWidth() / 2, pos[1] - mBitmap.getHeight() / 2); // 将图片绘制中心调整到与当前点重合 +canvas.drawPath(path, mDeafultPaint); // 绘制 Path +canvas.drawBitmap(mBitmap, mMatrix, mDeafultPaint); // 绘制箭头 - canvas.drawPath(path, mDeafultPaint); // 绘制 Path - canvas.drawBitmap(mBitmap, mMatrix, mDeafultPaint); // 绘制箭头 - - invalidate(); // 重绘页面 +invalidate(); // 重绘页面 ``` **核心要点:** > -* 1.**通过 `tan` 得值计算出图片旋转的角度**,tan 是 tangent 的缩写,即中学中常见的正切, 其中tan[0](x)是邻边边长,tan[1](y)是对边边长,而Math中 `atan2` 方法是根据正切是数值计算出该角度的大小,得到的单位是弧度,所以上面又将弧度转为了角度。 -* 2.**通过 `Matrix` 来设置图片对旋转角度和位移**,这里使用的方法与前面讲解过对 canvas操作 有些类似,对于 `Matrix` 会在后面专一进行讲解,敬请期待。 -* 3.**页面刷新**,页面刷新此处是在 onDraw 里面调用了 invalidate 方法来保持界面不断刷新,但并不提倡这么做,正确对做法应该是使用 线程 或者 ValueAnimator 来控制界面的刷新,关于控制页面刷新这一部分会在后续的 动画部分 详细讲解,同样敬请期待。 +- 1.**通过 `tan` 得值计算出图片旋转的角度**,tan 是 tangent 的缩写,即中学中常见的正切, 其中tan[0]是邻边边长,tan[1]是对边边长,而Math中 `atan2` 方法是根据正切是数值计算出该角度的大小,得到的单位是弧度(取值范围是 -pi 到 pi),所以上面又将弧度转为了角度。 +- 2.**通过 `Matrix` 来设置图片对旋转角度和位移**,这里使用的方法与前面讲解过对 canvas操作 有些类似,对于 `Matrix` 会在后面专一进行讲解,敬请期待。 +- 3.**页面刷新**,页面刷新此处是在 onDraw 里面调用了 invalidate 方法来保持界面不断刷新,但并不提倡这么做,正确对做法应该是使用 线程 或者 ValueAnimator 来控制界面的刷新,关于控制页面刷新这一部分会在后续的 动画部分 详细讲解,同样敬请期待。 + +关于`tan`这个参数有很多魔法师不理解,特此拉出来详述一下,`tan` 在数学中被称为正切,在直角三角形中,一个锐角的**正切**定义为它的对边(Opposite side)与邻边(Adjacent side)的比值(来自维基百科): + +![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f8wyvmjf9gj307y01kdfr.jpg) + +我们此处用 `tan` 来描述 Path 上某一点的切线方向,**主要用了两个数值 tan[0] 和 tan[1] 来描述这个切线的方向(切线方向与x轴夹角)** ,看上面公式可知 `tan` 既可以用 `对边/邻边` 来表述,也可以用 `sin/cos` 来表述,此处用两种理解方式均可以(**注意下面等价关系**): + +> **tan[0] = cos = 邻边(单位圆x坐标)** +> **tan[1] = sin = 对边(单位圆y坐标)** + + + +**以 `sin/cos`理解:** + +![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f8wzrmz33tj308c0etq3c.jpg) + + + +在圆上最右侧点的切线方向向下(动图中小飞机朝向和切线朝向一致),切线角度为90度. +sin90 = 1,cos90 = 0 +tan[0] = cos = 0 +tan[1] = sin = 1 + + + +**以 `对边/邻边` 理解(单位圆上坐标):** + +按照这种理解方式需要借助一个单位圆,单位圆上任意一点到圆心到距离均为 1,以下图30度为例: + + + +tan30 = 对边/邻边 = AB/OA = B点y坐标/B点x坐标 + +> **另外根据单位圆性质同样可以证得:** +> sin30 = 对边/斜边 = AB/OB = AB = B点y坐标 (单位圆边上任意一点距离圆心距离均为1,故OB = 1) +> cos30 = 邻边/斜边 = OA/OB = OA = B点x坐标 +> +> **化为通用公式即为:** +> sin = 该角度在单位圆上对应点的y坐标 +> cos = 该角度在单位圆上对应点的x坐标 +> +> 即 tan = sin/cos = y/x +> tan[0] = x +> tan[1] = y +> +> 另外注意,这个单位圆与小飞机路径没有半毛钱关系,例如上一个例子中的90度切线,不要在单位圆上找对应位置,**要找对应角度的位置,90度对应的位置是(0,1)**,所以: +> tan[0] = x = 0 +> tan[1] = y = 1 +> +> 其实绕来绕去全是等价的 (╯°Д°)╯︵ ┻━┻ + +**PS: 使用 Math.atan2(tan[1], tan[0]) 将 `tan` 转化为角(单位为弧度)的时候要注意参数顺序。** ### 6.getMatrix 这个方法是用于得到路径上某一长度的位置以及该位置的正切值的矩阵: -``` java + +```java boolean getMatrix (float distance, Matrix matrix, int flags) ``` @@ -399,6 +442,7 @@ boolean getMatrix (float distance, Matrix matrix, int flags) 但是我们看到最后到 `flags` 选项可以选择 `位置` 或者 `正切` ,如果我们两个选项都想选择怎么办? 如果两个选项都想选择,可以将两个选项之间用 `|` 连接起来,如下: + ``` measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasure.POSITION_MATRIX_FLAG); ``` @@ -407,40 +451,40 @@ measure.getMatrix(distance, matrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasur 具体绘制: -``` java - Path path = new Path(); // 创建 Path +```java +Path path = new Path(); // 创建 Path - path.addCircle(0, 0, 200, Path.Direction.CW); // 添加一个圆形 +path.addCircle(0, 0, 200, Path.Direction.CW); // 添加一个圆形 - PathMeasure measure = new PathMeasure(path, false); // 创建 PathMeasure +PathMeasure measure = new PathMeasure(path, false); // 创建 PathMeasure - currentValue += 0.005; // 计算当前的位置在总长度上的比例[0,1] - if (currentValue >= 1) { - currentValue = 0; - } +currentValue += 0.005; // 计算当前的位置在总长度上的比例[0,1] +if (currentValue >= 1) { + currentValue = 0; +} - // 获取当前位置的坐标以及趋势的矩阵 - measure.getMatrix(measure.getLength() * currentValue, mMatrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasure.POSITION_MATRIX_FLAG); - - mMatrix.preTranslate(-mBitmap.getWidth() / 2, -mBitmap.getHeight() / 2); // <-- 将图片绘制中心调整到与当前点重合(注意:此处是前乘pre) +// 获取当前位置的坐标以及趋势的矩阵 +measure.getMatrix(measure.getLength() * currentValue, mMatrix, PathMeasure.TANGENT_MATRIX_FLAG | PathMeasure.POSITION_MATRIX_FLAG); - canvas.drawPath(path, mDeafultPaint); // 绘制 Path - canvas.drawBitmap(mBitmap, mMatrix, mDeafultPaint); // 绘制箭头 +mMatrix.preTranslate(-mBitmap.getWidth() / 2, -mBitmap.getHeight() / 2); // <-- 将图片绘制中心调整到与当前点重合(注意:此处是前乘pre) - invalidate(); // 重绘页面 +canvas.drawPath(path, mDeafultPaint); // 绘制 Path +canvas.drawBitmap(mBitmap, mMatrix, mDeafultPaint); // 绘制箭头 + +invalidate(); // 重绘页面 ``` > 由于此处代码运行结果与上面一样,便不再贴图片了,请参照上面一个示例的效果图。 可以看到使用 getMatrix 方法的确可以节省一些代码,不过这里依旧需要注意一些内容: -> -* 1.对 `matrix` 的操作必须要在 `getMatrix` 之后进行,否则会被 `getMatrix` 重置而导致无效。 -* 2.矩阵对旋转角度默认为图片的左上角,我们此处需要使用 `preTranslate` 调整为图片中心。 -* 3.pre(矩阵前乘) 与 post(矩阵后乘) 的区别,此处请等待后续的文章或者自行搜索。 +> -***** +- 1.对 `matrix` 的操作必须要在 `getMatrix` 之后进行,否则会被 `getMatrix` 重置而导致无效。 +- 2.矩阵对旋转角度默认为图片的左上角,我们此处需要使用 `preTranslate` 调整为图片中心。 +- 3.pre(矩阵前乘) 与 post(矩阵后乘) 的区别,此处请等待后续的文章或者自行搜索。 +------ ## Path & SVG @@ -455,20 +499,18 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f4g87vfjbeg30690b4go8.gif) ![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f4g89vqhqwg30690b4mzu.gif) -> ->**该图片来自这个开源库 ->[PathView](https://github.com/geftimov/android-pathview)**
->**SVG 转 Path 的解析可以用这个库 -> [AndroidSVG](https://bigbadaboom.github.io/androidsvg/)** +> **该图片来自这个开源库 ->[PathView](https://github.com/geftimov/android-pathview)**
+> **SVG 转 Path 的解析可以用这个库 -> [AndroidSVG](https://bigbadaboom.github.io/androidsvg/)** 限于篇幅以及本人精力,这一部分就暂不详解了,感兴趣的可以直接看源码,或者搜索一些相关的解析文章。 -***** +------ ## Path使用技巧 **话说本篇文章的名字不是叫 玩出花样么?怎么只见前面啰啰嗦嗦的扯了一大堆不明所以的东西,花样在哪里?** -> ->**前面的内容虽然啰嗦繁杂,但却是重中之重的基础,如果在修仙界,这叫根基,而下面讲述的内容的是招式,有了根基才能演化出千变万化的招式,而没有根基只学招式则是徒有其表,只能学一样会一样,很难适应千变万化的需求。** +> **前面的内容虽然啰嗦繁杂,但却是重中之重的基础,如果在修仙界,这叫根基,而下面讲述的内容的是招式,有了根基才能演化出千变万化的招式,而没有根基只学招式则是徒有其表,只能学一样会一样,很难适应千变万化的需求。** 先放一个效果图,然后分析一下实现过程: @@ -476,12 +518,12 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: 这是一个搜索的动效图,通过分析可以得到它应该有四种状态,分别如下: -| 状态 | 概述 | -| ---- | --------------------------- | -| 初始状态 | 初始状态,没有任何动效,只显示一个搜索标志 :mag: | -| 准备搜索 | 放大镜图标逐渐变化为一个点 | -| 正在搜索 | 围绕这一个圆环运动,并且线段长度会周期性变化 | -| 准备结束 | 从一个点逐渐变化成为放大镜图标 | +| 状态 | 概述 | +| ---- | ------------------------ | +| 初始状态 | 初始状态,没有任何动效,只显示一个搜索标志 🔍 | +| 准备搜索 | 放大镜图标逐渐变化为一个点 | +| 正在搜索 | 围绕这一个圆环运动,并且线段长度会周期性变化 | +| 准备结束 | 从一个点逐渐变化成为放大镜图标 | 这些状态是有序转换的,转换流程以及转换条件如下: @@ -525,28 +567,22 @@ Path 和 SVG 结合通常能诞生出一些奇妙的东西,如下: > PS: 本代码仅作为示例使用,还有诸多不足,如 自定义属性,视图大小, 点击事件, 监听回调 等,并不适合直接使用,有需要的可以自行补足相关内容。 - ## 总结 **本文中虽然后面的内容看起来比较高大上一点,但前面"啰嗦"的废话才是真正的干货,把前面的东西学会了,后面的各种效果都能信手拈来,如果只研究后面的东西,则是取其形,而难以会其意。** #### PS: 由于本人水平有限,某些地方可能存在误解或不准确,如果你对此有疑问可以提交Issues进行反馈。 -## About Me +## About -### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) +[本系列相关文章](http://www.gcssloop.com/customview/CustomViewIndex/) - +作者微博: [GcsSloop](http://weibo.com/GcsSloop) ## 参考资料 + [PathMeasure](https://developer.android.com/reference/android/graphics/PathMeasure.html)
[AndroidSVG](https://bigbadaboom.github.io/androidsvg/)
[android-pathview](https://github.com/geftimov/android-pathview)
[android Path 和 PathMeasure 进阶](http://blog.csdn.net/cquwentao/article/details/51436852)
-[]()
- - - - - From c6d292abb776c2a4cd68dea37eaa7ced699f3469 Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 18 Jan 2017 20:02:49 +0800 Subject: [PATCH 554/615] Update --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 3b7c74ac..0f783914 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,11 @@ * 商业用途请点击最下面图片联系本人。 * 微信公众号转载一律不授权 `原创` 标志。 +## 交流群 + +QQ群:612310796 +微信群:加我个人微信 GcsSloop,备注加群。 + ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From 6d7d1fd557912fd667bba0bbdef2fa443d1edf4d Mon Sep 17 00:00:00 2001 From: sloop Date: Wed, 18 Jan 2017 20:03:14 +0800 Subject: [PATCH 555/615] Update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0f783914..1209fb05 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ ## 交流群 -QQ群:612310796 +QQ群:612310796 微信群:加我个人微信 GcsSloop,备注加群。 ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From 5e3feb1716ce61de35d05a8fc2f711a278194cb9 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 19 Jan 2017 23:49:35 +0800 Subject: [PATCH 556/615] Update --- CustomView/Advance/[18]multi-touch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[18]multi-touch.md b/CustomView/Advance/[18]multi-touch.md index ff59eacc..651fce26 100644 --- a/CustomView/Advance/[18]multi-touch.md +++ b/CustomView/Advance/[18]multi-touch.md @@ -568,7 +568,7 @@ public class DragView extends CustomView { } ``` -可以看到,比起上一个版本并么有多多少代码,但是更加“智能”了,可以准确识别某一个手指,不会因为手指抬起而认错手指。 +可以看到,比起上一个版本,只添加了少量代码,就变得更加“智能”了,可以准确识别某一个手指,不会因为手指抬起而认错手指。 ![dragview2](http://ww2.sinaimg.cn/large/006y8lVagw1fbs1vmwpu4g308c0d4nf9.gif) From db51d37e10378f4a1be27f8a1242491bd3585288 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 20 Jan 2017 00:10:39 +0800 Subject: [PATCH 557/615] Update --- CustomView/Advance/[18]multi-touch.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CustomView/Advance/[18]multi-touch.md b/CustomView/Advance/[18]multi-touch.md index 651fce26..9e6a7f28 100644 --- a/CustomView/Advance/[18]multi-touch.md +++ b/CustomView/Advance/[18]multi-touch.md @@ -1,4 +1,4 @@ -# 多点触控详解 +# Android 多点触控详解 Android 多点触控详解,在前面的几篇文章中我们大致了解了 Android 中的事件处理流程和一些简单的处理方案,本次带大家了解 Android 多点触控相关的一些知识。 @@ -48,7 +48,7 @@ Android 多点触控详解,在前面的几篇文章中我们大致了解了 An 在引入多点触控之前,事件的类型很少,基本事件类型只有按下(down)、移动(move) 和 抬起(up),即便加上那些特殊的事件类型也只有几种而已,所以我们可以用几个常量来标记这些事件,在使用的时候使用 `getAction()` 方法来获取具体的事件,之后和这些常量进行对比就行了。 -在 Android 2.0 版本的时候,开始引入多点触控技术,由于技术上并不成熟,硬件和驱动也跟不上,很数设备只能支持追踪两三个点而已,因此在设计 API 上采取了一种简单粗暴的方案,添加了几个常量用语多点触控的事件类型的判断。 +在 Android 2.0 版本的时候,开始引入多点触控技术,由于技术上并不成熟,硬件和驱动也跟不上,多数设备只能支持追踪两三个点而已,因此在设计 API 上采取了一种简单粗暴的方案,添加了几个常量用语多点触控的事件类型的判断。 | 事件 | 简介 | | ----------------------- | -------------------- | @@ -243,17 +243,17 @@ switch (event.getActionMasked()) { | 第4个手指按下 | ACTION_POINTER_DOWN (0x0000**01**05) | | **第3个手指抬起** | ACTION_POINTER_UP (0x0000**02**06) | -这个要和上一个对比这看,**重点观察第 3 个手指所触发事件区别**,在上一个示例中,随着第 2 个手指的抬起,第 3 个手指变化为第 2 个,所以抬起时触发的是第 2 根手指的抬起事件(删除线部分)。 +这个要和上一个对比这看,**重点观察第 3 个手指所触发事件区别**,在上一个示例中,随着第 2 个手指的抬起,第 3 个手指变化为第 2(01) 个,所以抬起时触发的是第 2 根手指的抬起事件(删除线部分)。 -但是,如果第 2 个手指抬起后,落在屏幕上另外一个手指会怎样?经过测试,发现另外**落下的手指会替代之前第 2 个手指的位置,系统判定为 2,而不是顺延下去变成 3**,但是如果继续落下其他的手指,数值则会顺延。 +但是,如果第 2 个手指抬起后,落在屏幕上另外一个手指会怎样?经过测试,发现另外**落下的手指会替代之前第 2 个手指的位置,系统判定为 2(01),而不是顺延下去变成 3(02),并且原本第3个手指的index变为原来数值(02)**,但是如果继续落下其他的手指,数值则会顺延。 -**即手指抬起时的 Index 会趋向于和按下时相同,虽然在手指数量不足时,Index 会变小,但是当手指变多时,Index 会保持和按下时一样。** +**即手指抬起时的 Index 会趋向于和按下时相同,虽然在手指数量不足时,Index 会变小,但是当手指变多时,Index 会趋向于保持和按下时一样。** > PS:由于程序是从0开始计数的,所以 0 就是 1, 1 就是 2 ... #### 3.4、对 move 事件无效。 -这个也比较容易理解,我们所取得的 Index 属性实际上是从事件上分离下来的,但是 move 事件始终为 0x0000**00**02,也就是说,在 move 时不论你移动哪个手指,使用 ` getActionIndex()` 获取到的始终是数值 0。 +这个也比较容易理解,我们所取得的 Index 属性实际上是从事件上分离下来的,但是 move 事件始终为 0x0000**00**02,也就是说,在 move 时不论你移动哪个手指,使用 `getActionIndex()` 获取到的始终是数值 0。 既然 move 事件无法用事件索引(Index)区别,那么该如何区分 move 是那个手指发出的呢?这就要用到 pointId 了,**pointId 和 index 最大的区别就是 pointId 是不变的,始终为第一次落下时生成的数值,不会受到其他手指抬起和落下的影响。** @@ -410,7 +410,7 @@ public class MultiTouchTest extends CustomView { 举一个简单的例子: -如果我们需要一个**可以用单指拖动的图片**。加入我们不进行多指触控的判断,像下面这样: +如果我们需要一个**可以用单指拖动的图片**。假如我们不进行多指触控的判断,像下面这样: **没有针对多指触控处理版本:** @@ -610,4 +610,4 @@ public class DragView extends CustomView { -[motionevent]: http://www.gcssloop.com/customview/motionevent +[motionevent]: http://www.gcssloop.com/customview/motionevent \ No newline at end of file From e22012820ffc2dc5f35edb0c91a508bf5b51df6b Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 22 Jan 2017 22:56:01 +0800 Subject: [PATCH 558/615] Update --- SourceAnalysis/CircularArray.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 SourceAnalysis/CircularArray.md diff --git a/SourceAnalysis/CircularArray.md b/SourceAnalysis/CircularArray.md new file mode 100644 index 00000000..e69de29b From 44b36f050c73a988bdfd915a34e87feed7f6bb5e Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 23 Jan 2017 03:06:30 +0800 Subject: [PATCH 559/615] Update --- CustomView/Advance/[18]multi-touch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[18]multi-touch.md b/CustomView/Advance/[18]multi-touch.md index 9e6a7f28..2f7c00f9 100644 --- a/CustomView/Advance/[18]multi-touch.md +++ b/CustomView/Advance/[18]multi-touch.md @@ -48,7 +48,7 @@ Android 多点触控详解,在前面的几篇文章中我们大致了解了 An 在引入多点触控之前,事件的类型很少,基本事件类型只有按下(down)、移动(move) 和 抬起(up),即便加上那些特殊的事件类型也只有几种而已,所以我们可以用几个常量来标记这些事件,在使用的时候使用 `getAction()` 方法来获取具体的事件,之后和这些常量进行对比就行了。 -在 Android 2.0 版本的时候,开始引入多点触控技术,由于技术上并不成熟,硬件和驱动也跟不上,多数设备只能支持追踪两三个点而已,因此在设计 API 上采取了一种简单粗暴的方案,添加了几个常量用语多点触控的事件类型的判断。 +在 Android 2.0 版本的时候,开始引入多点触控技术,由于技术上并不成熟,硬件和驱动也跟不上,多数设备只能支持追踪两三个点而已,因此在设计 API 上采取了一种简单粗暴的方案,添加了几个常量用于多点触控的事件类型的判断。 | 事件 | 简介 | | ----------------------- | -------------------- | From 7fc821bd87e2bc51ec98e4af556473ba773a7744 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 24 Jan 2017 03:08:50 +0800 Subject: [PATCH 560/615] Update --- CustomView/Advance/[18]multi-touch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[18]multi-touch.md b/CustomView/Advance/[18]multi-touch.md index 2f7c00f9..98efa326 100644 --- a/CustomView/Advance/[18]multi-touch.md +++ b/CustomView/Advance/[18]multi-touch.md @@ -95,7 +95,7 @@ switch (event.getAction()) { 注意观察上面编号和id的变化,有两个问题,**1、B手指的编号变化了。2、A手指和C手指id是相同的(A手指抬起后,C手指按下替代了A手指)。**所以这就引出了一个问题:如果存在 ACTION_POINTER_X_MOVE,那么X应该用什么标志呢?编号会变化,id虽然不会变化,但id会被复用,例如A手指抬起后C手指按下,C手指复用了A手指的id。所以不论使用哪一个都不能保证唯一性。 -当然了,解决问题最好的方式就是把问题抛出去,既然从硬件和软件上都不能保证唯一性和不变性,就不做区分了,因此所有的 move 事件都是 `ACTION_MOVE`, 具体是哪个手指产生的 move 用户可以根据其他事件(按下和抬起)来综合判断。 +当然了,解决问题最好的方式就是把问题抛出去,既然从硬件和软件上都不能保证唯一性和不变性,就不做区分了,因此所有的 move 事件都是 `ACTION_MOVE`, 具体是哪个手指产生的 move 用户可以结合其他事件(按下和抬起)来综合判断。 ### 2.超过4个手指怎么办? From 7393790c08773400e51db7ac4d84200e32705187 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 25 Jan 2017 16:52:36 +0800 Subject: [PATCH 561/615] Update --- Lecture/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Lecture/README.md b/Lecture/README.md index adeb5d56..959ec327 100644 --- a/Lecture/README.md +++ b/Lecture/README.md @@ -1 +1,4 @@ # 演讲稿 + +* [程序员练级指北(郑州GDG-2016DevFest)](https://github.com/GcsSloop/AndroidNote/blob/master/Lecture/gdg-developer-growth-guide.md) + From d4d8dfb817bb481f9237c5f378844dadbf6e55e7 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 26 Jan 2017 16:53:47 +0800 Subject: [PATCH 562/615] Update --- CustomView/CustomViewRule.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CustomView/CustomViewRule.md b/CustomView/CustomViewRule.md index e69de29b..4706e9d9 100644 --- a/CustomView/CustomViewRule.md +++ b/CustomView/CustomViewRule.md @@ -0,0 +1,2 @@ +# 自定义View基本法 + From 466efa349b6344ecf3b1b7ee48c905c03a11a944 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 26 Jan 2017 16:55:23 +0800 Subject: [PATCH 563/615] Update --- CustomView/README.md | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/CustomView/README.md b/CustomView/README.md index 6fefef4f..cf5a50ac 100644 --- a/CustomView/README.md +++ b/CustomView/README.md @@ -5,52 +5,52 @@ ## 基础篇

- - - + + +

******* ## 进阶篇

- - - + + +

*******

- - - + + +

*******

- - - + + +

*******

- - - + + +

*******

- - - + + +

### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) - + From 9cbf2eaf6d35c2a68dc2d809998d8d90b9d28fdb Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 27 Jan 2017 16:57:41 +0800 Subject: [PATCH 564/615] Update --- Course/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Course/README.md b/Course/README.md index b9fd97f3..d2e3d8c9 100644 --- a/Course/README.md +++ b/Course/README.md @@ -2,7 +2,7 @@

- - - + + +

From 63a64d4c345b4d7596bc5eb34b1a2b8c1953cd79 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 28 Jan 2017 17:00:22 +0800 Subject: [PATCH 565/615] Update --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 1209fb05..a338c9e8 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,12 @@ * [LeafLoading - 进度条](https://github.com/GcsSloop/LeafLoading) * [Rotate3dAnimation - 3D旋转动画(修正版)](https://github.com/GcsSloop/Rotate3dAnimation) +------ + +## 源码解析 + +- [AtomicFile 源码解析](https://github.com/GcsSloop/AndroidNote/blob/master/SourceAnalysis/AtomicFile.md) + ## 传送门 通往异世界的传送门,请谨慎使用。 From fd9c12257968eae90a8fe76b776a137e2d85f397 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 30 Jan 2017 06:47:56 +0800 Subject: [PATCH 566/615] Update --- CustomView/CustomViewRule.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CustomView/CustomViewRule.md b/CustomView/CustomViewRule.md index 4706e9d9..d6ff9419 100644 --- a/CustomView/CustomViewRule.md +++ b/CustomView/CustomViewRule.md @@ -1,2 +1,17 @@ # 自定义View基本法 +我们使用手机,是想要获取某些信息,而 View 是这些信息的直接展示界面,因为信息种类繁多,为了更好的展示这些信息, View 也必须有多种多样,Android 系统本身就给我们提供了不少类型的 View,但有时仍不能满足我们的需要,所以有时可能需要自定义 View 来完成任务。 + +自定义 View 有许多需要注意的地方,关于这些需要注意的内容,我都会整理在这里,其名为《自定义 View 基本法》。 + +#### 第一条:尽量避免自定义 View。 + +由于 View 直接承载了与用户交互的重任,所以必须要考虑到各种情况,例如: + +* 当没有设置宽高属性时,View 默认应该多大。 +* 横竖屏转换时 View 可能重新设定大小,此时应如何处理。 +* View 因为特殊情况被销毁后重建,应如何保存和恢复数据。 + +由于某些情况很特殊,触发条件也特殊,我们简单的实现了一个自定义了一个 View,可能在 99% 的情况下都是正常的,但在某些特殊情况下就会出问题。 + +但系统提供给我们的 View 都是经过千锤百炼的,基本上考虑到了各种特殊情况的处理,所以通常情况下,系统提供给我们的组件稳定性要好一些。所以我的建议是,能使用系统提供的组件的尽量使用系统的。 \ No newline at end of file From fa3f292901ab2c4556bdb34737a8de8f492c7715 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 31 Jan 2017 06:52:22 +0800 Subject: [PATCH 567/615] Update --- CustomView/CustomViewRule.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CustomView/CustomViewRule.md b/CustomView/CustomViewRule.md index d6ff9419..ddc55c14 100644 --- a/CustomView/CustomViewRule.md +++ b/CustomView/CustomViewRule.md @@ -14,4 +14,9 @@ 由于某些情况很特殊,触发条件也特殊,我们简单的实现了一个自定义了一个 View,可能在 99% 的情况下都是正常的,但在某些特殊情况下就会出问题。 -但系统提供给我们的 View 都是经过千锤百炼的,基本上考虑到了各种特殊情况的处理,所以通常情况下,系统提供给我们的组件稳定性要好一些。所以我的建议是,能使用系统提供的组件的尽量使用系统的。 \ No newline at end of file +但系统提供给我们的 View 都是经过千锤百炼的,基本上考虑到了各种特殊情况的处理,所以通常情况下,系统提供给我们的组件稳定性要好一些。所以我的建议是,能使用系统提供的组件的尽量使用系统的。 + +#### 第二条:尽量避免从头开始。 + +如果一定要使用自定义 View,那么尽量去继承系统已有的组件,并重写其中的部分方法,不要自己从头开始写。例如:图像相关的 View 可以考虑继承 ImageView,容器类 View 可以考虑继承 LinerLayout,RelativeLayout 等,原因同上。 + From 1e4fb2cb504caf05edac0f8bcb15e63a99910e50 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 1 Feb 2017 06:55:21 +0800 Subject: [PATCH 568/615] Update --- CustomView/CustomViewRule.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CustomView/CustomViewRule.md b/CustomView/CustomViewRule.md index ddc55c14..8b0a2873 100644 --- a/CustomView/CustomViewRule.md +++ b/CustomView/CustomViewRule.md @@ -14,9 +14,12 @@ 由于某些情况很特殊,触发条件也特殊,我们简单的实现了一个自定义了一个 View,可能在 99% 的情况下都是正常的,但在某些特殊情况下就会出问题。 -但系统提供给我们的 View 都是经过千锤百炼的,基本上考虑到了各种特殊情况的处理,所以通常情况下,系统提供给我们的组件稳定性要好一些。所以我的建议是,能使用系统提供的组件的尽量使用系统的。 +系统提供给我们的组件都是经过千锤百炼的,基本上考虑到了各种特殊情况的处理,所以通常情况下,系统提供给我们的组件稳定性要好一些。所以我的建议是,能使用系统提供的组件的尽量使用系统的。 #### 第二条:尽量避免从头开始。 如果一定要使用自定义 View,那么尽量去继承系统已有的组件,并重写其中的部分方法,不要自己从头开始写。例如:图像相关的 View 可以考虑继承 ImageView,容器类 View 可以考虑继承 LinerLayout,RelativeLayout 等,原因同上。 +#### 第三条:处理特殊情况。 + +针对能想到的一些特殊情况进行处理并且测试,尽量保证自定义 View 能适应各种特殊场景。 \ No newline at end of file From 6a7afdb70b745f18c07768400ce5bbcbae1b7d7d Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 2 Feb 2017 07:02:13 +0800 Subject: [PATCH 569/615] Update --- Course/Markdown/markdown-html.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Course/Markdown/markdown-html.md b/Course/Markdown/markdown-html.md index e62c3b86..ec82fc0f 100644 --- a/Course/Markdown/markdown-html.md +++ b/Course/Markdown/markdown-html.md @@ -1,2 +1,3 @@ -Markdown 网页格式兼容 - +# Markdown 网页格式兼容 + +Markdown 作为一种标记型语言,在大多数情况下都是需要转换为 HTML 格式的,所以 Markdown 理论上是兼容 HTML 语法的,在 Markdown 所提供的标记无法满足我们需要的时候,可以尝试使用 HTML 相关语法来实现。 \ No newline at end of file From b93f533802d3a5b1588bcbec015b7f3672a5818c Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 4 Feb 2017 09:45:16 +0800 Subject: [PATCH 570/615] Update --- CustomView/CustomViewRule.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/CustomView/CustomViewRule.md b/CustomView/CustomViewRule.md index 8b0a2873..8ab629e8 100644 --- a/CustomView/CustomViewRule.md +++ b/CustomView/CustomViewRule.md @@ -14,7 +14,9 @@ 由于某些情况很特殊,触发条件也特殊,我们简单的实现了一个自定义了一个 View,可能在 99% 的情况下都是正常的,但在某些特殊情况下就会出问题。 -系统提供给我们的组件都是经过千锤百炼的,基本上考虑到了各种特殊情况的处理,所以通常情况下,系统提供给我们的组件稳定性要好一些。所以我的建议是,能使用系统提供的组件的尽量使用系统的。 +而系统提供给我们的组件都是经过千锤百炼的,基本上考虑到了各种特殊情况的处理,所以通常情况下,系统提供给我们的组件稳定性要好一些。所以我的建议是,能使用系统提供的组件的尽量使用系统的。 + +除此之外,使用系统提供的组件也方便于其他人快速读懂项目,便于交流。 #### 第二条:尽量避免从头开始。 @@ -22,4 +24,16 @@ #### 第三条:处理特殊情况。 -针对能想到的一些特殊情况进行处理并且测试,尽量保证自定义 View 能适应各种特殊场景。 \ No newline at end of file +针对能想到的一些特殊情况进行处理并且测试,尽量保证自定义 View 能适应各种特殊场景。 + +#### 第四条:留下文档。 + +**程序员有两大痛苦,1、别人写的项目居然没有文档。2、自己写的项目居然要写文档。** + +虽然有时候文档写起来确实挺麻烦,但是个人建议必须要留下文档,至少要为自己写的程序添加**有效的注释**。 +​ 于自定义View而言,首先要标明这个自定义View是解决什么问题,有怎样的效果,使用的场景如何。 +​ 其次要在关键部位标注实现原理。(例如:显示圆形的ImageView,要标明圆形是如何实现的,使用的是遮罩还是剪裁。) +​ 避免无效注释 (例如:在onDraw上面标注绘图),大家都知道这个是绘图,但绘制逻辑才是重点,要去标注绘制逻辑。 + + + From e6f77b0fa5f2a00d672c2847b938861e98e8422d Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 5 Feb 2017 10:02:19 +0800 Subject: [PATCH 571/615] Update --- CustomView/CustomViewRule.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/CustomView/CustomViewRule.md b/CustomView/CustomViewRule.md index 8ab629e8..766fcaa0 100644 --- a/CustomView/CustomViewRule.md +++ b/CustomView/CustomViewRule.md @@ -30,10 +30,19 @@ **程序员有两大痛苦,1、别人写的项目居然没有文档。2、自己写的项目居然要写文档。** -虽然有时候文档写起来确实挺麻烦,但是个人建议必须要留下文档,至少要为自己写的程序添加**有效的注释**。 -​ 于自定义View而言,首先要标明这个自定义View是解决什么问题,有怎样的效果,使用的场景如何。 -​ 其次要在关键部位标注实现原理。(例如:显示圆形的ImageView,要标明圆形是如何实现的,使用的是遮罩还是剪裁。) -​ 避免无效注释 (例如:在onDraw上面标注绘图),大家都知道这个是绘图,但绘制逻辑才是重点,要去标注绘制逻辑。 +虽然有时候文档写起来确实挺麻烦,但是个人建议要留下一份文档,至少要为自己写的程序添加**有效的注释**,这不仅是方便他人,更重要的是方便自己以后修改项目。 + +* 于自定义View而言,首先要标明这个自定义View是解决什么问题,有怎样的效果,使用的场景如何。 +* 其次要在关键部位标注实现原理。(例如:显示圆形的ImageView,要标明圆形是如何实现的,使用的是遮罩还是剪裁。) +* 避免无效注释 (例如:在onDraw上面标注绘图),大家都知道这个是绘图,但绘制逻辑才是重点,要去标注绘制逻辑。 + +#### 第五条:面向结果编程。 + +我们既然使用自定义View,自然是想要实现一些系统组件无法实现的效果,所以要时刻谨记自己所需要的内容,让其中的所有逻辑都为这个结果服务,我自己实现自定义 View 一般有如下步骤: + +1. 原型,用我能想到的逻辑实现原型(demo),不管其代码复杂度,首先要得到结果,通常情况下,第一份代码可得性和整洁性都比较差。 +2. 优化,在原型的基础上对代码进行优化,剔除不必要的内容,例如尝试优化逻辑,对与一些重复性的内容抽取函数进行封装,想办法消灭一些中间变量。同时添加上必要注释,让其逻辑更加清晰易懂。 +3. 测试,对其进行场景测试,尽量保证其正常运行。 From 5b728f9e130192aa6492810d463f0201ebc4d6d2 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 6 Feb 2017 17:00:14 +0800 Subject: [PATCH 572/615] Update --- CustomView/Advance/[06]Path_Bezier.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[06]Path_Bezier.md b/CustomView/Advance/[06]Path_Bezier.md index 4384d9c2..4f22a239 100644 --- a/CustomView/Advance/[06]Path_Bezier.md +++ b/CustomView/Advance/[06]Path_Bezier.md @@ -122,7 +122,7 @@ > **PS: 三阶曲线对应的方法是cubicTo** -#### [贝塞尔曲线速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Bessel.md) +#### [贝塞尔曲线速查表](https://github.com/GcsSloop/AndroidNote/blob/master/QuickChart/Bezier.md) #### 强烈推荐[点击这里](http://bezier.method.ac/)练习贝塞尔曲线,可以加深对贝塞尔曲线的理解程度。 From 3673a52b1eb0541b3b358590fc13d94ac82ec81c Mon Sep 17 00:00:00 2001 From: WenChao Kong Date: Thu, 9 Feb 2017 09:30:02 +1100 Subject: [PATCH 573/615] Update [06]Path_Bezier.md fix broken link --- CustomView/Advance/[06]Path_Bezier.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[06]Path_Bezier.md b/CustomView/Advance/[06]Path_Bezier.md index 4f22a239..e98db733 100644 --- a/CustomView/Advance/[06]Path_Bezier.md +++ b/CustomView/Advance/[06]Path_Bezier.md @@ -3,7 +3,7 @@ ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) ### [【本系列相关文章】](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) -在上一篇文章[Path之基本图形](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B05%5DPath_BasicGraphics.md)中我们了解了Path的基本使用方法,本次了解Path中非常非常非常重要的内容-贝塞尔曲线。 +在上一篇文章[Path之基本图形](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B05%5DPath_Basic.md)中我们了解了Path的基本使用方法,本次了解Path中非常非常非常重要的内容-贝塞尔曲线。 ****** From 16019c79ba2f4c7328bfd79bd2deae11bc53c1ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=AC=A2?= Date: Mon, 13 Mar 2017 20:48:43 +0800 Subject: [PATCH 574/615] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=96=87=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[02]Canvas_BasicGraphics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[02]Canvas_BasicGraphics.md b/CustomView/Advance/[02]Canvas_BasicGraphics.md index 86336f5e..65720057 100644 --- a/CustomView/Advance/[02]Canvas_BasicGraphics.md +++ b/CustomView/Advance/[02]Canvas_BasicGraphics.md @@ -111,7 +111,7 @@ Canvas我们可以称之为画布,能够在上面绘制各种东西,是安 ****** ### 绘制矩形: -确定确定一个矩形最少需要四个数据,就是**对角线的两个点**的坐标值,这里一般采用**左上角和右下角**的两个点的坐标。 +确定一个矩形最少需要四个数据,就是**对角线的两个点**的坐标值,这里一般采用**左上角和右下角**的两个点的坐标。 关于绘制矩形,Canvas提供了三种重载方法,第一种就是提供**四个数值(矩形左上角和右下角两个点的坐标)来确定一个矩形**进行绘制。 其余两种是先将矩形封装为**Rect或RectF**(实际上仍然是用两个坐标点来确定的矩形),然后传递给Canvas绘制,如下: From dcec08b7eaac1f2a5cb13e2945029870dd05c225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=AC=A2?= Date: Tue, 14 Mar 2017 11:59:44 +0800 Subject: [PATCH 575/615] fix spelling error --- CustomView/Advance/[04]Canvas_PictureText.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[04]Canvas_PictureText.md b/CustomView/Advance/[04]Canvas_PictureText.md index ba7f2c4f..06bffcd5 100644 --- a/CustomView/Advance/[04]Canvas_PictureText.md +++ b/CustomView/Advance/[04]Canvas_PictureText.md @@ -415,9 +415,9 @@ PS:图片左上角位置默认为坐标原点。 | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -假设我我们指定star为1,end为3,那么最终截取的字符串就是"BC"。 +假设我们指定start为1,end为3,那么最终截取的字符串就是"BC"。 -一般来说,**使用start和end指定的区间是前闭后开的,即包含start指定的下标,而不包含end指定的下标**,故[1,3)最后获取到的下标只有 下标1 和 下标2 的字符,就是"BC". +一般来说,**使用start和end指定的区间是前闭后开的,即包含start指定的下标,而不包含end指定的下标**,故[1,3)最后获取到的下标只有 下标1 和 下标2 的字符,就是"BC"。 示例: ``` java @@ -430,7 +430,7 @@ PS:图片左上角位置默认为坐标原点。 另外,对于字符数组char[]我们截取字符串使用起始位置(index)和长度(count)来确定。 -同样,我们指定index为1,count为3,那么最终截取到的字符串是"BCD". +同样,我们指定index为1,count为3,那么最终截取到的字符串是"BCD"。 其实就是从下标位置为1处向后数3位就是截取到的字符串,示例: ``` java From d7a6a1d53fd572985b2847e07b3da1b4138ad1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=AC=A2?= Date: Wed, 15 Mar 2017 10:05:16 +0800 Subject: [PATCH 576/615] fix spelling errors --- CustomView/Advance/[05]Path_Basic.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[05]Path_Basic.md b/CustomView/Advance/[05]Path_Basic.md index 85f12f53..41fb94e8 100644 --- a/CustomView/Advance/[05]Path_Basic.md +++ b/CustomView/Advance/[05]Path_Basic.md @@ -239,7 +239,7 @@ close方法用于连接当前最后一个点和最初的一个点(如果两个 **这一类就是在path中添加一个基本形状,基本形状部分和前面所讲的绘制基本形状并无太大差别,详情参考[Canvas(1)颜色与基本形状](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Canvas(1).md), 本次只将其中不同的部分摘出来详细讲解一下。** -**仔细观察一下第一类是方法,无一例外,在最后都有一个_Path.Direction_,这是一个什么神奇的东东?** +**仔细观察一下第一类的方法,无一例外,在最后都有一个_Path.Direction_,这是一个什么神奇的东东?** Direction的意思是 方向,趋势。 点进去看一下会发现Direction是一个枚举(Enum)类型,里面只有两个枚举常量,如下: @@ -369,7 +369,7 @@ Direction的意思是 方向,趋势。 点进去看一下会发现Direction是 -首先我们新建地方两个Path(矩形和圆形)中心都是坐标原点,我们在将包含圆形的path添加到包含矩形的path之前将其进行移动了一段距离,最终绘制出来的效果就如上面所示。 +首先我们新建的两个Path(矩形和圆形)中心都是坐标原点,我们在将包含圆形的path添加到包含矩形的path之前将其进行移动了一段距离,最终绘制出来的效果就如上面所示。 #### 第三类(addArc与arcTo) 方法预览: @@ -524,12 +524,12 @@ log 输出结果: **但是第二个方法最后怎么会有一个path作为参数?** -其实第二个方法中最后的参数das是存储平移后的path的。 +其实第二个方法中最后的参数dst是存储平移后的path的。 | dst状态 | 效果 | | ----------- | ------------------------------ | | dst不为空 | 将当前path平移后的状态存入dst中,不会影响当前path | -| dat为空(null) | 平移将作用于当前path,相当于第一种方法 | +| dst为空(null) | 平移将作用于当前path,相当于第一种方法 | 示例: ``` java From d245e0651ec2d71b40a2bf6f098c71cfb414f750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=AC=A2?= Date: Thu, 16 Mar 2017 15:27:13 +0800 Subject: [PATCH 577/615] fix spelling and format errors --- CustomView/Advance/[07]Path_Over.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/CustomView/Advance/[07]Path_Over.md b/CustomView/Advance/[07]Path_Over.md index 19007696..dad580ce 100644 --- a/CustomView/Advance/[07]Path_Over.md +++ b/CustomView/Advance/[07]Path_Over.md @@ -113,8 +113,8 @@ ![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f42368af2jj308c0dwt8z.jpg) > ->P1: 从P1点发出一条射线,沿射线防线移动,并没有与边相交点部分,环绕数为0,故P1在图形外边。
->P2: 从P2点发出一条射线,沿射线方向移动,与图形点左侧边相交,该边从左到右穿过穿过射线,环绕数-1,最终环绕数为-1,故P2在图形内部。
+>P1: 从P1点发出一条射线,沿射线方向移动,并没有与边相交点部分,环绕数为0,故P1在图形外边。
+>P2: 从P2点发出一条射线,沿射线方向移动,与图形点左侧边相交,该边从左到右穿过射线,环绕数-1,最终环绕数为-1,故P2在图形内部。
>P3: 从P3点发出一条射线,沿射线方向移动,在第一个交点处,底边从右到左穿过射线,环绕数+1,在第二个交点处,右侧边从左到右穿过射线,环绕数-1,最终环绕数为0,故P3在图形外部。
通常,这两种方法的判断结果是相同的,但也存在两种方法判断结果不同的情况,如下面这种情况: @@ -144,7 +144,7 @@ Android中的填充模式有四种,是封装在Path中的一个枚举。 我们可以看到上面有四种模式,分成两对,例如 "奇偶规则" 与 "反奇偶规则" 是一对,它们之间有什么关系呢? -Inverse 和含义是“相反,对立”,说明反奇偶规则刚好与奇偶规则相反,例如对于一个矩形而言,使用奇偶规则会填充矩形内部,而使用反奇偶规则会填充矩形外部,这个会在后面示例中代码展示两者对区别。 +Inverse 的含义是“相反,对立”,说明反奇偶规则刚好与奇偶规则相反,例如对于一个矩形而言,使用奇偶规则会填充矩形内部,而使用反奇偶规则会填充矩形外部,这个会在后面示例中代码展示两者的区别。 #### Android与填充模式相关的方法 @@ -176,7 +176,7 @@ Inverse 和含义是“相反,对立”,说明反奇偶规则刚好与奇偶 path.addRect(-200,-200,200,200, Path.Direction.CW); // 给Path中添加一个矩形 ``` -下面两张图片分别是在奇偶规则于反奇偶规则的情况下绘制的结果,可以看出其填充的区域刚好相反: +下面两张图片分别是在奇偶规则与反奇偶规则的情况下绘制的结果,可以看出其填充的区域刚好相反: > PS: 白色为背景色,黑色为填充色。 @@ -214,7 +214,7 @@ Inverse 和含义是“相反,对立”,说明反奇偶规则刚好与奇偶 ### 布尔操作(API19) -布尔操作与我们中学所学的集合操作非常像,只要知道集合操作中等交集,并集,差集等操作,那么理解布尔操作也是很容易的。 +布尔操作与我们中学所学的集合操作非常像,只要知道集合操作中的交集,并集,差集等操作,那么理解布尔操作也是很容易的。 **布尔操作是两个Path之间的运算,主要作用是用一些简单的图形通过一些规则合成一些相对比较复杂,或难以直接得到的图形**。 @@ -257,7 +257,7 @@ Path的布尔运算有五种逻辑,如下: #### 布尔运算方法 -通过前面到理论知识铺垫,相信大家对布尔运算已经有了基本的认识和理解,下面我们用代码演示一下布尔运算: +通过前面的理论知识铺垫,相信大家对布尔运算已经有了基本的认识和理解,下面我们用代码演示一下布尔运算: 在Path中的布尔运算有两个方法 @@ -268,7 +268,7 @@ Path的布尔运算有五种逻辑,如下: 两个方法中的返回值用于判断布尔运算是否成功,它们使用方法如下: -``` `java +``` java // 对 path1 和 path2 执行布尔运算,运算方式由第二个参数指定,运算结果存入到path1中。 path1.op(path2, Path.Op.DIFFERENCE); @@ -334,7 +334,7 @@ Path的布尔运算有五种逻辑,如下: | 参数 | 作用 | | ------ | ------------------------------- | | bounds | 测量结果会放入这个矩形 | -| exact | 是否精确测量,目前这一个参数作用已经废弃,一般写true即可。 | +| exact | 是否精确测量,目前这一个参数作用已经废弃,一般写true即可 | 关于exact如有疑问可参见Google官方的提交记录[Path.computeBounds()](https://code.google.com/p/android/issues/detail?id=4070) @@ -369,7 +369,7 @@ Path的布尔运算有五种逻辑,如下: ### 重置路径 -重置Path有两个方法,分别是reset和rewind,两者区别主要有一下两点: +重置Path有两个方法,分别是reset和rewind,两者区别主要有以下两点: | 方法 | 是否保留FillType设置 | 是否保留原有数据结构 | | ------ | :------------: | :--------: | @@ -385,7 +385,7 @@ _因为“FillType”影响的是显示效果,而“数据结构”影响的 ## 总结 -Path中常用的方法到此已经结束,希望能够帮助大家加深对Path对理解运用,让大家能够用Path愉快的玩耍。( ̄▽ ̄) +Path中常用的方法到此已经结束,希望能够帮助大家加深对Path的理解运用,让大家能够用Path愉快的玩耍。( ̄▽ ̄) (,,• ₃ •,,) #### PS: 由于本人水平有限,某些地方可能存在误解或不准确,如果你对此有疑问可以提交Issues进行反馈。 From 92d8647dacecdf6eb6d3807b35cb187e61e02808 Mon Sep 17 00:00:00 2001 From: sloop Date: Sat, 25 Mar 2017 17:26:18 +0800 Subject: [PATCH 578/615] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[09]Matrix_Basic.md | 338 ++----------------------- 1 file changed, 18 insertions(+), 320 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 852ee6d9..72b5f3a6 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -12,17 +12,7 @@ 它看起来大概是下面这样: -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} -MSCALE\\_X & MSKEW\\_X & MTRANS\\_X \\\\ -\\ -MSKEW\\_Y & MSCALE\\_Y & MTRANS\\_Y \\\\ -\\ -MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2 -\\end{1} -\\right ] -$$) +![](https://ww1.sinaimg.cn/large/006tKfTcly1fdz72rjfnjj30ak01yglo.jpg) **Matrix作用就是坐标映射,那么为什么需要Matrix呢? 举一个简单的例子:** @@ -75,36 +65,11 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 ### 1.缩放(Scale) -![](http://latex.codecogs.com/png.latex?$$x = k_1 x_0 $$) - -![](http://latex.codecogs.com/png.latex?$$y = k_2 y_0 $$) +![](https://ww2.sinaimg.cn/large/006tKfTcly1fdz7baj17gj302h01rdfr.jpg) 用矩阵表示: -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} -x\\\\ -y\\\\ -1 -\\end{1} -\\right ] - = -\\left [ -\\begin{matrix} -k_1 & 0 & 0 \\\\ - 0 & k_2 & 0 \\\\ - 0 & 0 & 1 -\\end{1} -\\right ] -\\left [ -\\begin{matrix} -x_0 \\\\ -y_0 \\\\ -1 -\\end{1} -\\right ] -$$) +![](https://ww3.sinaimg.cn/large/006tKfTcly1fdz7busaiej3062020mx4.jpg) > 你可能注意到了,我们坐标多了一个1,这是使用了齐次坐标系的缘故,在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,计算机无法区分,为此让计算机也可以区分它们,增加了一个标志位,增加之后看起来是这样:
> @@ -123,36 +88,11 @@ $$) #### 水平错切 -![](http://latex.codecogs.com/png.latex?$$ x = x_0 + ky_0 $$) - -![](http://latex.codecogs.com/png.latex?$$ y = y_0 $$) +![](https://ww3.sinaimg.cn/large/006tKfTcly1fdz7d0niaqj303601mglj.jpg) 用矩阵表示: -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} -x\\\\ -y\\\\ -1 -\\end{1} -\\right ] - = -\\left [ -\\begin{matrix} - 1 & k & 0 \\\\ - 0 & 1 & 0 \\\\ - 0 & 0 & 1 -\\end{1} -\\right ] -\\left [ -\\begin{matrix} -x_0\\\\ -y_0\\\\ -1 -\\end{1} -\\right ] -$$) +![](https://ww4.sinaimg.cn/large/006tKfTcly1fdz7dryrfcj305m020glk.jpg) 图例: @@ -160,36 +100,11 @@ $$) #### 垂直错切 -![](http://latex.codecogs.com/png.latex?$$ x = x_0 $$) - -![](http://latex.codecogs.com/png.latex?$$ y = kx_0 + y_0 $$) +![](https://ww3.sinaimg.cn/large/006tKfTcly1fdz7esq5j4j303701pdfr.jpg) 用矩阵表示: -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} -x\\\\ -y\\\\ -1 -\\end{1} -\\right ] - = -\\left [ -\\begin{matrix} - 1 & 0 & 0 \\\\ - k & 1 & 0 \\\\ - 0 & 0 & 1 -\\end{1} -\\right ] -\\left [ -\\begin{matrix} -x_0\\\\ -y_0\\\\ -1 -\\end{1} -\\right ] -$$) +![](https://ww4.sinaimg.cn/large/006tKfTcly1fdz7ffdxauj305n024glk.jpg) 图例: @@ -199,36 +114,11 @@ $$) > 水平错切和垂直错切的复合。 -![](http://latex.codecogs.com/png.latex?$$ x = x_0 + k_1 y_0 $$) - -![](http://latex.codecogs.com/png.latex?$$ y = k_2 x_0 + y_0 $$) +![](https://ww4.sinaimg.cn/large/006tKfTcly1fdz7g0lmcaj303801mq2v.jpg) 用矩阵表示: -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} -x\\\\ -y\\\\ -1 -\\end{1} -\\right ] - = -\\left [ -\\begin{matrix} - 1 & k_1 & 0 \\\\ - k_2 & 1 & 0 \\\\ - 0 & 0 & 1 -\\end{1} -\\right ] -\\left [ -\\begin{matrix} -x_0\\\\ -y_0\\\\ -1 -\\end{1} -\\right ] -$$) +![](https://ww2.sinaimg.cn/large/006tKfTcly1fdz7gkg5dej3062021mx4.jpg) 图例: @@ -238,49 +128,11 @@ $$) 假定一个点 A(x0, y0) ,距离原点距离为 r, 与水平轴夹角为 α 度, 绕原点旋转 θ 度, 旋转后为点 B(x, y) 如下: -![](http://latex.codecogs.com/png.latex?$$ x_0 = r \\cdot cos \\alpha $$) - -![](http://latex.codecogs.com/png.latex?$$ y_0 = r \\cdot sin \\alpha $$) - -![](http://latex.codecogs.com/png.latex?$$ -x = r \\cdot cos( \\alpha + \\theta) -= r \\cdot cos \\alpha \\cdot cos \\theta - r \\cdot sin \\alpha \\cdot sin \\theta -= x_0 \\cdot cos \\theta - y_0 \\cdot sin \\theta -$$) - -![](http://latex.codecogs.com/png.latex?$$ -y = r \\cdot sin( \\alpha + \\theta) -= r \\cdot sin \\alpha \\cdot cos \\theta + r \\cdot cos \\alpha \\cdot sin \\theta -= y_0 \\cdot cos \\theta + x_0 \\cdot sin \\theta -$$) +![](https://ww3.sinaimg.cn/large/006tKfTcly1fdz7h61ddsj30gm03twel.jpg) 用矩阵表示: -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} -x\\\\ -y\\\\ -1 -\\end{1} -\\right ] - = -\\left [ -\\begin{matrix} -cos(\\theta) & -sin(\\theta) & 0 \\\\ -sin(\\theta) & cos(\\theta) & 0 \\\\ - 0 & 0 & 1 -\\end{1} -\\right ] - . -\\left [ -\\begin{matrix} -x_0\\\\ -y_0\\\\ -1 -\\end{1} -\\right ] -$$) +![](https://ww2.sinaimg.cn/large/006tKfTcly1fdz7hn7pbdj308i0240sq.jpg) 图例: @@ -290,37 +142,11 @@ $$) > 此处也是使用齐次坐标的优点体现之一,实际上前面的三个操作使用 2x2 的矩阵也能满足需求,但是使用 2x2 的矩阵,无法将平移操作加入其中,而将坐标扩展为齐次坐标后,将矩阵扩展为 3x3 就可以将算法统一,四种算法均可以使用矩阵乘法完成。 -![](http://latex.codecogs.com/png.latex?$$ x = x_0 + \\Delta x $$) - -![](http://latex.codecogs.com/png.latex?$$ y = y_0 + \\Delta y $$) +![](https://ww4.sinaimg.cn/large/006tKfTcly1fdz7igi28cj302w01kdfr.jpg) 用矩阵表示: -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} -x\\\\ -y\\\\ -1 -\\end{1} -\\right ] - = -\\left [ -\\begin{matrix} -1 & 0 & \\Delta x \\\\ -0 & 1 & \\Delta y \\\\ -0 & 0 & 1 -\\end{1} -\\right ] - . -\\left [ -\\begin{matrix} -x_0\\\\ -y_0\\\\ -1 -\\end{1} -\\right ] -$$) +![](https://ww2.sinaimg.cn/large/006tKfTcly1fdz7izsq8hj306b022mx4.jpg) 图例: @@ -473,42 +299,11 @@ Log.e(TAG, "MatrixTest" + matrix.toShortString()); 之所以平移距离是 MTRANS\_X = 500,MTRANS\_Y = 800,那是因为执行 Translate 之前 Matrix 已经具有了一个缩放比例。在右乘的时候影响到了具体的数值计算,可以用矩阵乘法计算一下。 -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} -0.5 & 0 & 0 \\\\ -0 & 0.8 & 0 \\\\ -0 & 0 & 1 -\\end{1} -\\right ] -\\cdot -\\left [ -\\begin{matrix} -1 & 0 & 1000 \\\\ -0 & 1 & 1000 \\\\ -0 & 0 & 1 -\\end{1} -\\right ] = -\\left [ -\\begin{matrix} -0.5*1+0*0+0*0 & 0.5*0+0*1+0*0 & 0.5*1000+0*1000+0*1\\\\ -0*1+0.8*0+0*0 & 0*0+0.8*1+0*1 & 0*1000+0.8*1000+0*1\\\\ -0*1+0*0+1*0 & 0*0+0*1+1*0 & 0*1000+0*1000+1*1 -\\end{1} -\\right ] -$$) +![](https://ww3.sinaimg.cn/large/006tKfTcly1fdz7lhb20fj30lz01zgm8.jpg) 最终结果为: -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} -0.5 & 0 & 500\\\\ -0 & 0.8 & 800\\\\ -0 & 0 & 1 -\\end{1} -\\right ] -$$) +![](https://ww2.sinaimg.cn/large/006tKfTcly1fdz7m2pgyuj303o022wef.jpg) 当 T*S 的时候,缩放比例则不会影响到 MTRANS\\_X 和 MTRANS\\_Y ,具体可以使用矩阵乘法自己计算一遍。 @@ -620,40 +415,7 @@ m.preScale(sx, sy); ``` 用矩阵表示: - -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} - & &\\\\ - & Result Matrix &\\\\ - & & -\\end{1} -\\right ] - = - \\left [ -\\begin{matrix} - & &\\\\ - & Initial Matrix &\\\\ - & & -\\end{1} -\\right ] -\\cdot -\\left [ -\\begin{matrix} -1 & 0 & \\Delta x \\\\ -0 & 1 & \\Delta y \\\\ -0 & 0 & 1 -\\end{1} -\\right ] -\\cdot -\\left [ -\\begin{matrix} -sx & 0 & 0\\\\ -0 & sy & 0\\\\ -0 & 0 & 1 -\\end{1} -\\right ] -$$) +![](https://ww4.sinaimg.cn/large/006tKfTcly1fdz7mv29jhj30gg02374b.jpg) #### 2.仅用post: @@ -667,39 +429,7 @@ m.postTranslate(tx, ty); 用矩阵表示: -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} - & &\\\\ - & Result Matrix &\\\\ - & & -\\end{1} -\\right ] - = -\\left [ -\\begin{matrix} -1 & 0 & \\Delta x \\\\ -0 & 1 & \\Delta y \\\\ -0 & 0 & 1 -\\end{1} -\\right ] -\\cdot -\\left [ -\\begin{matrix} -sx & 0 & 0\\\\ -0 & sy & 0\\\\ -0 & 0 & 1 -\\end{1} -\\right ] -\\cdot - \\left [ -\\begin{matrix} - & &\\\\ - & Initial Matrix &\\\\ - & & -\\end{1} -\\right ] -$$) +![](https://ww1.sinaimg.cn/large/006tKfTcly1fdz7nde6gcj30gh020dfv.jpg) #### 3.混合: @@ -725,39 +455,7 @@ m.preScale(sx, sy); 用矩阵表示: -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} - & &\\\\ - & Result Matrix &\\\\ - & & -\\end{1} -\\right ] - = -\\left [ -\\begin{matrix} -1 & 0 & \\Delta x \\\\ -0 & 1 & \\Delta y \\\\ -0 & 0 & 1 -\\end{1} -\\right ] -\\cdot - \\left [ -\\begin{matrix} - & &\\\\ - & Initial Matrix &\\\\ - & & -\\end{1} -\\right ] -\\cdot -\\left [ -\\begin{matrix} -sx & 0 & 0\\\\ -0 & sy & 0\\\\ -0 & 0 & 1 -\\end{1} -\\right ] -$$) +![](http://ww4.sinaimg.cn/large/006tKfTcly1fdz7o3i9kfj30gh021aa3.jpg) **注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为单位矩阵,如果初始矩阵不为单位矩阵,则导致运算结果不同。** From bffa074225366c9ea41e23e7f478c70c96ec4fff Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 25 Mar 2017 17:29:32 +0800 Subject: [PATCH 579/615] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[09]Matrix_Basic.md | 34 +++++++++++++------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index 72b5f3a6..e60d8bfe 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -12,7 +12,7 @@ 它看起来大概是下面这样: -![](https://ww1.sinaimg.cn/large/006tKfTcly1fdz72rjfnjj30ak01yglo.jpg) +![](http://ww1.sinaimg.cn/large/006tKfTcly1fdz72rjfnjj30ak01yglo.jpg) **Matrix作用就是坐标映射,那么为什么需要Matrix呢? 举一个简单的例子:** @@ -65,11 +65,11 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 ### 1.缩放(Scale) -![](https://ww2.sinaimg.cn/large/006tKfTcly1fdz7baj17gj302h01rdfr.jpg) +![](http://ww2.sinaimg.cn/large/006tKfTcly1fdz7baj17gj302h01rdfr.jpg) 用矩阵表示: -![](https://ww3.sinaimg.cn/large/006tKfTcly1fdz7busaiej3062020mx4.jpg) +![](http://ww3.sinaimg.cn/large/006tKfTcly1fdz7busaiej3062020mx4.jpg) > 你可能注意到了,我们坐标多了一个1,这是使用了齐次坐标系的缘故,在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,计算机无法区分,为此让计算机也可以区分它们,增加了一个标志位,增加之后看起来是这样:
> @@ -88,11 +88,11 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 #### 水平错切 -![](https://ww3.sinaimg.cn/large/006tKfTcly1fdz7d0niaqj303601mglj.jpg) +![](http://ww3.sinaimg.cn/large/006tKfTcly1fdz7d0niaqj303601mglj.jpg) 用矩阵表示: -![](https://ww4.sinaimg.cn/large/006tKfTcly1fdz7dryrfcj305m020glk.jpg) +![](http://ww4.sinaimg.cn/large/006tKfTcly1fdz7dryrfcj305m020glk.jpg) 图例: @@ -100,11 +100,11 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 #### 垂直错切 -![](https://ww3.sinaimg.cn/large/006tKfTcly1fdz7esq5j4j303701pdfr.jpg) +![](http://ww3.sinaimg.cn/large/006tKfTcly1fdz7esq5j4j303701pdfr.jpg) 用矩阵表示: -![](https://ww4.sinaimg.cn/large/006tKfTcly1fdz7ffdxauj305n024glk.jpg) +![](http://ww4.sinaimg.cn/large/006tKfTcly1fdz7ffdxauj305n024glk.jpg) 图例: @@ -114,11 +114,11 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 > 水平错切和垂直错切的复合。 -![](https://ww4.sinaimg.cn/large/006tKfTcly1fdz7g0lmcaj303801mq2v.jpg) +![](http://ww4.sinaimg.cn/large/006tKfTcly1fdz7g0lmcaj303801mq2v.jpg) 用矩阵表示: -![](https://ww2.sinaimg.cn/large/006tKfTcly1fdz7gkg5dej3062021mx4.jpg) +![](http://ww2.sinaimg.cn/large/006tKfTcly1fdz7gkg5dej3062021mx4.jpg) 图例: @@ -128,11 +128,11 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 假定一个点 A(x0, y0) ,距离原点距离为 r, 与水平轴夹角为 α 度, 绕原点旋转 θ 度, 旋转后为点 B(x, y) 如下: -![](https://ww3.sinaimg.cn/large/006tKfTcly1fdz7h61ddsj30gm03twel.jpg) +![](http://ww3.sinaimg.cn/large/006tKfTcly1fdz7h61ddsj30gm03twel.jpg) 用矩阵表示: -![](https://ww2.sinaimg.cn/large/006tKfTcly1fdz7hn7pbdj308i0240sq.jpg) +![](http://ww2.sinaimg.cn/large/006tKfTcly1fdz7hn7pbdj308i0240sq.jpg) 图例: @@ -142,11 +142,11 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 > 此处也是使用齐次坐标的优点体现之一,实际上前面的三个操作使用 2x2 的矩阵也能满足需求,但是使用 2x2 的矩阵,无法将平移操作加入其中,而将坐标扩展为齐次坐标后,将矩阵扩展为 3x3 就可以将算法统一,四种算法均可以使用矩阵乘法完成。 -![](https://ww4.sinaimg.cn/large/006tKfTcly1fdz7igi28cj302w01kdfr.jpg) +![](http://ww4.sinaimg.cn/large/006tKfTcly1fdz7igi28cj302w01kdfr.jpg) 用矩阵表示: -![](https://ww2.sinaimg.cn/large/006tKfTcly1fdz7izsq8hj306b022mx4.jpg) +![](http://ww2.sinaimg.cn/large/006tKfTcly1fdz7izsq8hj306b022mx4.jpg) 图例: @@ -299,11 +299,11 @@ Log.e(TAG, "MatrixTest" + matrix.toShortString()); 之所以平移距离是 MTRANS\_X = 500,MTRANS\_Y = 800,那是因为执行 Translate 之前 Matrix 已经具有了一个缩放比例。在右乘的时候影响到了具体的数值计算,可以用矩阵乘法计算一下。 -![](https://ww3.sinaimg.cn/large/006tKfTcly1fdz7lhb20fj30lz01zgm8.jpg) +![](http://ww3.sinaimg.cn/large/006tKfTcly1fdz7lhb20fj30lz01zgm8.jpg) 最终结果为: -![](https://ww2.sinaimg.cn/large/006tKfTcly1fdz7m2pgyuj303o022wef.jpg) +![](http://ww2.sinaimg.cn/large/006tKfTcly1fdz7m2pgyuj303o022wef.jpg) 当 T*S 的时候,缩放比例则不会影响到 MTRANS\\_X 和 MTRANS\\_Y ,具体可以使用矩阵乘法自己计算一遍。 @@ -415,7 +415,7 @@ m.preScale(sx, sy); ``` 用矩阵表示: -![](https://ww4.sinaimg.cn/large/006tKfTcly1fdz7mv29jhj30gg02374b.jpg) +![](http://ww4.sinaimg.cn/large/006tKfTcly1fdz7mv29jhj30gg02374b.jpg) #### 2.仅用post: @@ -429,7 +429,7 @@ m.postTranslate(tx, ty); 用矩阵表示: -![](https://ww1.sinaimg.cn/large/006tKfTcly1fdz7nde6gcj30gh020dfv.jpg) +![](http://ww1.sinaimg.cn/large/006tKfTcly1fdz7nde6gcj30gh020dfv.jpg) #### 3.混合: From d7a98aa2827497ca6d1ba0e6c311d358499cd0a7 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 15 Apr 2017 22:56:08 +0800 Subject: [PATCH 580/615] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SourceAnalysis/AtomicFile.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SourceAnalysis/AtomicFile.md b/SourceAnalysis/AtomicFile.md index 6f6d8995..78e669c2 100644 --- a/SourceAnalysis/AtomicFile.md +++ b/SourceAnalysis/AtomicFile.md @@ -71,7 +71,7 @@ public AtomicFile(File baseName) { ```java public FileOutputStream startWrite() throws IOException { - // 如果备份文件不存在,将原文件重命名为备份文件,并删除原文件 + // 当原文件存在,备份文件不存在的时候,原文件更名为备份文件 if (mBaseName.exists()) { if (!mBackupName.exists()) { // 如果原文件存在且备份文件不存在,直接将原文件重命名为备份文件 From dc51d03d505af3cd93ca1e705f707eba7faf6aa5 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 19 May 2017 11:05:31 +0800 Subject: [PATCH 581/615] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E6=96=87?= =?UTF-8?q?=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[19]gesture-detector.md | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 CustomView/Advance/[19]gesture-detector.md diff --git a/CustomView/Advance/[19]gesture-detector.md b/CustomView/Advance/[19]gesture-detector.md new file mode 100644 index 00000000..814c6f4f --- /dev/null +++ b/CustomView/Advance/[19]gesture-detector.md @@ -0,0 +1,47 @@ +# Android 手势检测(GestureDetector) + +因为工作等原因,已经很长时间没有写文章了,趁节假日来水一篇简单的文章,Android 手势检测,如题,本文依旧是和事件相关的,如果你没看过之前的文章,可以到 [自定义 View 系列](http://www.gcssloop.com/customview/CustomViewIndex) 来查看前面的内容。 + +在开发 Android 手机应用过程中,可能需要对一些手势作出响应,如:单击、双击、长按、滑动、缩放等。这些都是很常用的手势。就拿最简单的双击来说吧,假如我们需要判断一个控件是否被双击(即在较短的时间内快速的点击两次),似乎是一个很容易的任务,但仔细考虑起来,要处理的细节问题也有不少,例如: + +1. **记录点击次数**,为了判断是否被点击超过 1 次,所以必须记录点击次数。 +2. **记录点击时间**,由于双击事件是较快速的点击两次,像点击一次后,过来几分钟再点击一次肯定不能算是双击事件,所以在记录点击次数的同时也要记录上一次的点击时间,我们可以设置本次点击距离上一次时间超过一定时间(例如:超过1s)就不识别为双击事件。 +3. **点击状态重置**,在响应双击事件,或者判断不是双击事件的时候要重置计数器和上一次点击时间。重置既可以在点击的时候判断并进行重新设置,也可以使用定时器等超过一定时间后重置状态。 + +这样看起来,判断一个双击事件就有这么多麻烦事情,更别其他的手势了,虽然这些看起来都很简单,但设计起来需要考虑的细节情况实在是太多了。 + +那么有没有一种更好的方法来方便的检测手势呢?当然有啦,因为这些手势很常用,系统早就封装了一些方法给我们用,它就是 **GestureDetector** 。我们先看一下关于它的简单介绍: + +> GestureDetector 可以使用 MotionEvents 检测各种手势和事件。GestureDetector.OnGestureListener 是一个回调方法,在发生特定的事件时会调用 Listener 中对应的方法回调。这个类只能用于检测触摸事件的 MotionEvent,不能用于轨迹球事件。 +> (话说轨迹球已经消失多长时间了,估计很多人都没见过轨迹球这种东西)。 +> +> 如何使用: +> +> - 创建一个 GestureDetector 实例。 +> - 在onTouchEvent(MotionEvent)方法中,确保调用 GestureDetector 实例的 onTouchEvent(MotionEvent)。回调中定义的方法将在事件发生时执行。 +> - 如果侦听 onContextClick(MotionEvent),则必须在 View 的 onGenericMotionEvent(MotionEvent)中调用 GestureDetector OnGenericMotionEvent(MotionEvent)。 + + GestureDetector 本身的方法很少,使用起来也非常简单,下面让我们看一下它的简单使用方法。 + +```java +// 创建一个监听回调 +SimpleOnGestureListener listener = new SimpleOnGestureListener() { + @Override public boolean onDoubleTap(MotionEvent e) { + Toast.makeText(MainActivity.this, "双击666", Toast.LENGTH_SHORT).show(); + return super.onDoubleTap(e); + } +}; + +// 创建一个检测器 +final GestureDetector detector = new GestureDetector(this, listener); + +// 给监听器设置数据源 +view.setOnTouchListener(new View.OnTouchListener() { + @Override public boolean onTouch(View v, MotionEvent event) { + return detector.onTouchEvent(event); + } +}); +``` + +上面是监听一个双击事件,可以看到它使用起来非常简单,接下来我们就看一下有关于它的详细信息。 + From 11fae36ef87029d8a945e7cf6e52dd73d26104ae Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 28 May 2017 13:46:52 +0800 Subject: [PATCH 582/615] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a338c9e8..e3b614e8 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ ******

+ ## [自定义View](https://github.com/GcsSloop/AndroidNote/tree/master/CustomView/README.md) * 基础篇 From 7a43d4a2d4fac37e21ce2750ae55274ab70df644 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 9 Jul 2017 23:01:44 +0800 Subject: [PATCH 583/615] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AE=9E=E4=BE=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/Code/FailingBall.zip | Bin 0 -> 699913 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 CustomView/Advance/Code/FailingBall.zip diff --git a/CustomView/Advance/Code/FailingBall.zip b/CustomView/Advance/Code/FailingBall.zip new file mode 100644 index 0000000000000000000000000000000000000000..92f0b8f514c43358347b655d3eb9f6cff571fee4 GIT binary patch literal 699913 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

_kY$ZFvdezu4f-5cP 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

#>v<(%&H%+MtIi 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 z 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

O&r#wqLsb=*5+QHt}%=yYu+X6 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 literal 0 HcmV?d00001 From ce2d201f14bf59f89de8348884fcdb9e2c54cb0f Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 9 Jul 2017 23:03:40 +0800 Subject: [PATCH 584/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/{Advance/Code => Demo}/FailingBall.zip | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename CustomView/{Advance/Code => Demo}/FailingBall.zip (100%) diff --git a/CustomView/Advance/Code/FailingBall.zip b/CustomView/Demo/FailingBall.zip similarity index 100% rename from CustomView/Advance/Code/FailingBall.zip rename to CustomView/Demo/FailingBall.zip From c22cb865dfd603db89f40c32143af62ee3378e0d Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 9 Jul 2017 23:10:24 +0800 Subject: [PATCH 585/615] =?UTF-8?q?=E5=8B=98=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[08]Path_Play.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[08]Path_Play.md b/CustomView/Advance/[08]Path_Play.md index 7b4285a8..35387d5f 100644 --- a/CustomView/Advance/[08]Path_Play.md +++ b/CustomView/Advance/[08]Path_Play.md @@ -234,7 +234,7 @@ canvas.drawPath(dst, mDeafultPaint); // 绘制 Path ### 4.nextContour -我们知道 Path 可以由多条曲线构成,但不论是 getLength , getgetSegment 或者是其它方法,都只会在其中第一条线段上运行,而这个 `nextContour` 就是用于跳转到下一条曲线到方法,_如果跳转成功,则返回 true, 如果跳转失败,则返回 false。_ +我们知道 Path 可以由多条曲线构成,但不论是 getLength , getSegment 或者是其它方法,都只会在其中第一条线段上运行,而这个 `nextContour` 就是用于跳转到下一条曲线到方法,_如果跳转成功,则返回 true, 如果跳转失败,则返回 false。_ 如下,我们创建了一个 Path 并使其中包含了两个闭合的曲线,内部的边长是200,外面的边长是400,现在我们使用 PathMeasure 分别测量两条曲线的总长度。 From 501ccfdccf857af2576cb7c29d0bec16c0720d53 Mon Sep 17 00:00:00 2001 From: sloop Date: Sun, 9 Jul 2017 23:24:34 +0800 Subject: [PATCH 586/615] =?UTF-8?q?=E5=8B=98=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[10]Matrix_Method.md | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/CustomView/Advance/[10]Matrix_Method.md b/CustomView/Advance/[10]Matrix_Method.md index 6d7b0a0c..3254f4bb 100644 --- a/CustomView/Advance/[10]Matrix_Method.md +++ b/CustomView/Advance/[10]Matrix_Method.md @@ -40,16 +40,7 @@ Matrix matrix = new Matrix(); 通过这种方式创建出来的并不是一个数值全部为空的矩阵,而是一个单位矩阵,如下: -![](http://latex.codecogs.com/png.latex?$$ -\\left [ -\\begin{matrix} -1 & 0 & 0 \\\\ -0 & 1 & 0 \\\\ -0 & 0 & 1 -\\end{1} -\\right ] -$$) - +![](https://ww2.sinaimg.cn/large/006tKfTcgy1fhe1potuf8j302301z3yf.jpg) #### 有参构造 From 2811e90790bf6b394584e59f06bca768531d8e88 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 9 Jul 2017 23:29:42 +0800 Subject: [PATCH 587/615] =?UTF-8?q?=E5=8B=98=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[09]Matrix_Basic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index e60d8bfe..a78731e1 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -162,7 +162,7 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 前乘相当于矩阵的右乘: -![](http://latex.codecogs.com/png.latex?$$ M' = M \\cdot S $$) +![](https://ww1.sinaimg.cn/large/006tKfTcgy1fhe1ul01s9j302m00gq2u.jpg) > 这表示一个矩阵与一个特殊矩阵前乘后构造出结果矩阵。 @@ -170,7 +170,7 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 前乘相当于矩阵的左乘: -![](http://latex.codecogs.com/png.latex?$$ M' = S \\cdot M $$) +![](https://ww3.sinaimg.cn/large/006tKfTcgy1fhe1vta7ooj302s00pq2u.jpg) > 这表示一个矩阵与一个特殊矩阵后乘后构造出结果矩阵。 From 23357ab05c1c5f29f8b438ebbe9a6c9da676cd9a Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 9 Jul 2017 23:46:02 +0800 Subject: [PATCH 588/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[19]gesture-detector.md | 350 ++++++++++++++++++++- 1 file changed, 342 insertions(+), 8 deletions(-) diff --git a/CustomView/Advance/[19]gesture-detector.md b/CustomView/Advance/[19]gesture-detector.md index 814c6f4f..5c7d1eb4 100644 --- a/CustomView/Advance/[19]gesture-detector.md +++ b/CustomView/Advance/[19]gesture-detector.md @@ -1,16 +1,18 @@ # Android 手势检测(GestureDetector) -因为工作等原因,已经很长时间没有写文章了,趁节假日来水一篇简单的文章,Android 手势检测,如题,本文依旧是和事件相关的,如果你没看过之前的文章,可以到 [自定义 View 系列](http://www.gcssloop.com/customview/CustomViewIndex) 来查看前面的内容。 +Android 手势检测,主要是 GestureDetector 相关内容的用法和注意事项,本文依旧属于事件处理这一体系,部分内容会涉及到之前文章提及过的知识点,如果你没看过之前的文章,可以到 [自定义 View 系列](http://www.gcssloop.com/customview/CustomViewIndex) 来查看这些内容。 在开发 Android 手机应用过程中,可能需要对一些手势作出响应,如:单击、双击、长按、滑动、缩放等。这些都是很常用的手势。就拿最简单的双击来说吧,假如我们需要判断一个控件是否被双击(即在较短的时间内快速的点击两次),似乎是一个很容易的任务,但仔细考虑起来,要处理的细节问题也有不少,例如: 1. **记录点击次数**,为了判断是否被点击超过 1 次,所以必须记录点击次数。 -2. **记录点击时间**,由于双击事件是较快速的点击两次,像点击一次后,过来几分钟再点击一次肯定不能算是双击事件,所以在记录点击次数的同时也要记录上一次的点击时间,我们可以设置本次点击距离上一次时间超过一定时间(例如:超过1s)就不识别为双击事件。 +2. **记录点击时间**,由于双击事件是较快速的点击两次,像点击一次后,过来几分钟再点击一次肯定不能算是双击事件,所以在记录点击次数的同时也要记录上一次的点击时间,我们可以设置本次点击距离上一次时间超过一定时间(例如:超过100ms)就不识别为双击事件。 3. **点击状态重置**,在响应双击事件,或者判断不是双击事件的时候要重置计数器和上一次点击时间。重置既可以在点击的时候判断并进行重新设置,也可以使用定时器等超过一定时间后重置状态。 这样看起来,判断一个双击事件就有这么多麻烦事情,更别其他的手势了,虽然这些看起来都很简单,但设计起来需要考虑的细节情况实在是太多了。 -那么有没有一种更好的方法来方便的检测手势呢?当然有啦,因为这些手势很常用,系统早就封装了一些方法给我们用,它就是 **GestureDetector** 。我们先看一下关于它的简单介绍: +那么有没有一种更好的方法来方便的检测手势呢?当然有啦,因为这些手势很常用,系统早就封装了一些方法给我们用,接下来我们就看看它们是如何使用的。 + +## GestureDetector > GestureDetector 可以使用 MotionEvents 检测各种手势和事件。GestureDetector.OnGestureListener 是一个回调方法,在发生特定的事件时会调用 Listener 中对应的方法回调。这个类只能用于检测触摸事件的 MotionEvent,不能用于轨迹球事件。 > (话说轨迹球已经消失多长时间了,估计很多人都没见过轨迹球这种东西)。 @@ -21,10 +23,10 @@ > - 在onTouchEvent(MotionEvent)方法中,确保调用 GestureDetector 实例的 onTouchEvent(MotionEvent)。回调中定义的方法将在事件发生时执行。 > - 如果侦听 onContextClick(MotionEvent),则必须在 View 的 onGenericMotionEvent(MotionEvent)中调用 GestureDetector OnGenericMotionEvent(MotionEvent)。 - GestureDetector 本身的方法很少,使用起来也非常简单,下面让我们看一下它的简单使用方法。 + GestureDetector 本身的方法比较少,使用起来也非常简单,下面让我们先看一下它的简单使用示例,分解开来大概需要三个步骤。 ```java -// 创建一个监听回调 +// 1.创建一个监听回调 SimpleOnGestureListener listener = new SimpleOnGestureListener() { @Override public boolean onDoubleTap(MotionEvent e) { Toast.makeText(MainActivity.this, "双击666", Toast.LENGTH_SHORT).show(); @@ -32,10 +34,10 @@ SimpleOnGestureListener listener = new SimpleOnGestureListener() { } }; -// 创建一个检测器 +// 2.创建一个检测器 final GestureDetector detector = new GestureDetector(this, listener); -// 给监听器设置数据源 +// 3.给监听器设置数据源 view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return detector.onTouchEvent(event); @@ -43,5 +45,337 @@ view.setOnTouchListener(new View.OnTouchListener() { }); ``` -上面是监听一个双击事件,可以看到它使用起来非常简单,接下来我们就看一下有关于它的详细信息。 +接下来我们先了解一下 GestureDetector 里面都有哪些内容。 + +### 1. 构造函数 + +GestureDetector 一共有 5 种构造函数,但有 2 种被废弃了,1 种是重复的,所以我们只需要关注其中的 2 种构造函数即可,如下: + +| 构造函数 | +| ---------------------------------------- | +| GestureDetector(Context context, GestureDetector.OnGestureListener listener) | +| GestureDetector(Context context, GestureDetector.OnGestureListener listener, Handler handler) | + +第 1 种构造函数里面需要传递两个参数,上下文(Context) 和 手势监听器(OnGestureListener),这个很容易理解,就不再过多叙述,上面的例子中使用的就是这一种。 + +第 2 种构造函数则需要多传递一个 Handler 作为参数,这个有什么作用呢?其实作用也非常简单,这个 Handler 主要是为了给 GestureDetector 提供一个 Looper。 + +在通常情况下是不需这个 Handler 的,因为它会在内部自动创建一个 Handler 用于处理数据,如果你在主线程中创建 GestureDetector,那么它内部创建的 Handler 会自动获得主线程的 Looper,然而如果你在一个没有创建 Looper 的子线程中创建 GestureDetector 则需要传递一个带有 Looper 的 Handler 给它,否则就会因为无法获取到 Looper 导致创建失败。 + +第 2 种构造函数使用方式如下(下面是两种在子线程中创建 GestureDetector 的方法): + +```java +// 方式一、在主线程创建 Handler +final Handler handler = new Handler(); +new Thread(new Runnable() { + @Override public void run() { + final GestureDetector detector = new GestureDetector(MainActivity.this, new + GestureDetector.SimpleOnGestureListener() , handler); + // ... 省略其它代码 ... + } +}).start(); + +// 方式二、在子线程创建 Handler,并且指定 Looper +new Thread(new Runnable() { + @Override public void run() { + final Handler handler = new Handler(Looper.getMainLooper()); + final GestureDetector detector = new GestureDetector(MainActivity.this, new + GestureDetector.SimpleOnGestureListener() , handler); + // ... 省略其它代码 ... + } +}).start(); +``` + +当然了,使用其它创建 Handler 的方式也是可以的,重点传递的 Handler 一定要有 Looper,敲黑板,重点是 Handler 中的 Looper。假如子线程准备了 Looper 那么可以直接使用第 1 种构造函数进行创建,如下: + +```java +new Thread(new Runnable() { + @Override public void run() { + Looper.prepare(); // <- 重点在这里 + final GestureDetector detector = new GestureDetector(MainActivity.this, new + GestureDetector.SimpleOnGestureListener()); + // ... 省略其它代码 ... + } +}).start(); +``` + +### 2.手势监听器 + +既然是手势检测,自然要在对应的手势出现的时候通知调用者,最合适的自然是事件监听器模式。目前 GestureDetecotr 有四种监听器。 + +| 监听器 | 简介 | +| ---------------------------------------- | ---------------------------------------- | +| [OnContextClickListener](https://developer.android.com/reference/android/view/GestureDetector.OnContextClickListener.html) | 这个很容易让人联想到ContextMenu,然而它和ContextMenu并没有什么关系,它是在Android6.0(API 23)才添加的一个选项,是用于检测外部设备上的按钮是否按下的,例如蓝牙触控笔上的按钮,一般情况下,忽略即可。 | +| [OnDoubleTapListener](https://developer.android.com/reference/android/view/GestureDetector.OnDoubleTapListener.html) | 双击事件,有三个回调类型:双击(DoubleTap)、单击确认(SingleTapConfirmed) 和 双击事件回调(DoubleTapEvent) | +| [OnGestureListener](https://developer.android.com/reference/android/view/GestureDetector.OnGestureListener.html) | 手势检测,主要有以下类型事件:按下(Down)、 一扔(Fling)、长按(LongPress)、滚动(Scroll)、触摸反馈(ShowPress) 和 单击抬起(SingleTapUp) | +| [SimpleOnGestureListener](https://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html) | 这个是上述三个接口的空实现,一般情况下使用这个比较多,也比较方便。 | + +#### 2.1 OnContextClickListener + +由于 OnContextClickListener 主要是用于检测外部设备按钮的,关于它需要注意一点,如果侦听 onContextClick(MotionEvent),则必须在 View 的 onGenericMotionEvent(MotionEvent)中调用 GestureDetector 的 OnGenericMotionEvent(MotionEvent)。 + +由于目前我们用到这个监听器的场景并不多,所以也就不展开介绍了,重点关注后面几个监听器。 + +#### 2.2 OnDoubleTapListener + +这个很明显就是用于检测双击事件的,它有三个回调接口,分别是 onDoubleTap、onDoubleTapEvent 和 onSingleTapConfirmed。 + +##### **2.2.1 onDoubleTap 与 onSingleTapConfirmed** + +**如果你只想监听双击事件,那么只用关注 onDoubleTap 就行了,如果你同时要监听单击事件则需要关注 onSingleTapConfirmed 这个回调函数**。 + +有人可能会有疑问,监听单击事件为什么要使用 onSingleTapConfirmed,使用 OnClickListener 不行吗?从理论上是可行的,但是我并不推荐这样使用,主要有两个原因: +1.它们两个是存在一定冲突的,如果你看过 [事件分发机制详解](http://www.gcssloop.com/customview/dispatch-touchevent-source) 就会知道,如果想要两者同时被触发,则 setOnTouchListener 不能消费事件,如果 onTouchListener 消费了事件,就可能导致 OnClick 无法正常触发。 +2.需要同时监听单击和双击,则说明单击和双击后响应逻辑不同,然而使用 OnClickListener 会在双击事件发生时触发两次,这显然不是我们想要的结果。而使用 onSingleTapConfirmed 就不用考虑那么多了,你完全可以把它当成单击事件来看待,而且在双击事件发生时,onSingleTapConfirmed 不会被调用,这样就不会引发冲突。 + +如果你需要同时监听两种点击事件可以这样写: + +```java +GestureDetector detector = new GestureDetector(this, new GestureDetector + .SimpleOnGestureListener() { + @Override public boolean onSingleTapConfirmed(MotionEvent e) { + Toast.makeText(MainActivity.this, "单击", Toast.LENGTH_SHORT).show(); + return false; + } + @Override public boolean onDoubleTap(MotionEvent e) { + Toast.makeText(MainActivity.this, "双击", Toast.LENGTH_SHORT).show(); + return false; + } +}); +``` + +关于 onSingleTapConfirmed 原理也非常简单,这一个回调函数在单击事件发生后300ms后触发(注意,不是立即触发的),只有在确定不会有后续的事件后,既当前事件肯定是单击事件才触发 onSingleTapConfirmed,所以在进行点击操作时,onDoubleTap 和 onSingleTapConfirmed 只会有一个被触发,也就不存在冲突了。 + +当然,如果你对事件分发机制非常了解的话,随便怎么用都行,条条大路通罗马,我这里只是推荐一种最简单而且不容易出错的实现方案。 + +##### **2.2.2 onDoubleTapEvent** + +**有些细心的小伙伴可能注意到还有一个 onDoubleTapEvent 回调函数,它是干什么的呢?它在双击事件确定发生时会对第二次按下产生的 MotionEvent 信息进行回调。** + +至于为什么要存在这样的回调,就要涉及到另一个比较细致的问题了,那就是 onDoubleTap 的触发时间,如果你在这些函数被调用时打印一条日志,那么你会看到这样的信息: + +``` +GCS-LOG: onDoubleTap +GCS-LOG: onDoubleTapEvent - down +GCS-LOG: onDoubleTapEvent - move +GCS-LOG: onDoubleTapEvent - move +GCS-LOG: onDoubleTapEvent - up +``` + +通过观察这些信息你会发现它们的调用顺序非常有趣,首先是 onDoubleTap 被触发,之后依次触发 onDoubleTapEvent 的 down、move、up 等信息,为什么说它们有趣呢?是因为这样的调用顺序会引发两种猜想,第一种猜想是 onDoubleTap 是在第二次手指抬起(up)后触发的,而 onDoubleTapEvent 是一种延时回调。第二种猜想则是 onDoubleTap 在第二次手指按下(dowm)时触发,onDoubleTapEvent 是一种实时回调。 + +通过测试和观察源码发现第二种猜想是正确的,因为第二次按下手指时,即便不抬起也会触发 onDoubleTap 和 onDoubleTapEvent 的 down,而且源码中逻辑也表明 onDoubleTapEvent 是一种实时回调。 + +这就引发了另一个问题,双击的触发时间,虽然这是一个细微到很难让人注意到的问题,假如说我们想要在第二次按下抬起后才判定这是一个双击操作,触发后续的内容,则不能使用 onDoubleTap 了,需要使用 onDoubleTapEvent 来进行更细微的控制,如下: + +```java +final GestureDetector detector = new GestureDetector(MainActivity.this, new GestureDetector.SimpleOnGestureListener() { + @Override public boolean onDoubleTap(MotionEvent e) { + Logger.e("第二次按下时触发"); + return super.onDoubleTap(e); + } + + @Override public boolean onDoubleTapEvent(MotionEvent e) { + switch (e.getActionMasked()) { + case MotionEvent.ACTION_UP: + Logger.e("第二次抬起时触发"); + break; + } + return super.onDoubleTapEvent(e); + } +}); +``` + +如果你不需要控制这么细微的话,忽略即可(Logger 是我自己封装的日志库,忽略即可)。 + +#### 2.3 OnGestureListener + +这个是手势检测中较为核心的一个部分了,主要检测以下类型事件:按下(Down)、 一扔(Fling)、长按(LongPress)、滚动(Scroll)、触摸反馈(ShowPress) 和 单击抬起(SingleTapUp)。 + +##### 2.3.1 onDown + +```java +@Override public boolean onDown(MotionEvent e) { + return true; +} +``` + +看过前面的文章应该知道,down 在事件分发体系中是一个较为特殊的事件,为了保证事件被唯一的 View 消费,哪个 View 消费了 down 事件,后续的内容就会传递给该 View。如果我们想让一个 View 能够接收到事件,有两种做法: + +1、让该 View 可以点击,因为可点击状态会默认消费 down 事件。 + +2、手动消费掉 down 事件。 + +由于图片、文本等一些控件默认是不可点击的,所以我们要么声明它们的 clickable 为 true,要么在发生 down 事件是返回 true。所以 onDown 在这里的作用就很明显了,就是为了保证让该控件能拥有消费事件的能力,以接受后续的事件。 + +##### 2.3.2 onFling + +Failing 中文直接翻译过来就是一扔、抛、甩,最常见的场景就是在 ListView 或者 RecyclerView 上快速滑动时手指抬起后它还会滚动一段时间才会停止。onFling 就是检测这种手势的。 + +```java +@Override +public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float + velocityY) { + return super.onFling(e1, e2, velocityX, velocityY); +} +``` + +在 onFling 的回调中共有四个参数,分别是: + +| 参数 | 简介 | +| --------- | ------------------ | +| e1 | 手指按下时的 Event。 | +| e2 | 手指抬起时的 Event。 | +| velocityX | 在 X 轴上的运动速度(像素/秒)。 | +| velocityY | 在 Y 轴上的运动速度(像素/秒)。 | + +我们可以通过 e1 和 e2 获取到手指按下和抬起时的坐标、时间等相关信息,通过 velocityX 和 velocityY 获取到在这段时间内的运动速度,单位是像素/秒(即 1 秒内滑动的像素距离)。 + +这个我们自己用到的地方比较少,但是也可以帮助我们简单的做出一些有趣的效果,例如下面的这种弹球效果,会根据滑动的力度和方向产生不同的弹跳效果。 + +![](https://ww2.sinaimg.cn/large/006tKfTcgy1fhe10uwa4fg308c0e6wn5.gif) + +其实这种原理非常简单,简化之后如下: + +1. 记录 velocityX 和 velocityY 作为初始速度,之后不断让速度衰减,直至为零。 +2. 根据速度和当前小球的位置计算一段时间后的位置,并在该位置重新绘制小球。 +3. 判断小球边缘是否碰触控件边界,如果碰触了边界则让速度反向。 + +根据这三条基本的逻辑就可以做出比较像的弹球效果,[具体的Demo可以看这里](https://raw.githubusercontent.com/GcsSloop/AndroidNote/master/CustomView/Demo/FailingBall.zip)。 + +##### 2.3.3 onLongPress + +这个是检测长按事件的,即手指按下后不抬起,在一段时间后会触发该事件。 + +```java +@Override +public void onLongPress(MotionEvent e) { +} +``` + +##### 2.3.4 onScroll + +onScroll 就是监听滚动事件的,它看起来和 onFaling 比较像,不同的是,onSrcoll 后两个参数不是速度,而是滚动的距离。 + +```java +@Override +public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float + distanceY) { + return super.onScroll(e1, e2, distanceX, distanceY); +} +``` + +| 参数 | | +| --------- | ----------- | +| e1 | 手指按下时的Event | +| e2 | 手指抬起时的Event | +| distanceX | 在 X 轴上划过的距离 | +| distanceY | 在 Y 轴上划过的距离 | + +##### 2.3.5 onShowPress + +它在用户按下时就会回调,主要作用是给用户提供一种视觉反馈,其实它就是对 down 事件对一种回调,在监听到这种事件时可以让控件换一种颜色,或者产生一些变化,告诉用户他的动作已经被识别。 + +```java +@Override +public void onShowPress(MotionEvent e) { +} +``` + +##### 2.3.6 onSingleTapUp + +```java +@Override +public boolean onSingleTapUp(MotionEvent e) { + return super.onSingleTapUp(e); +} +``` + +这个也很容易理解,就是用户单击抬起时的回调,但是它和上面的 `onSingleTapConfirmed` 之间有何不同呢?和 `onClick` 又有何不同呢? + +单击事件触发: + +```java +GCS: onSingleTapUp +GCS: onClick +GCS: onSingleTapConfirmed +``` + +| 类型 | 触发次数 | 摘要 | +| -------------------- | ---- | ---- | +| onSingleTapUp | 1 | 单击抬起 | +| onSingleTapConfirmed | 1 | 单击确认 | +| onClick | 1 | 单击事件 | + +双击事件触发: + +```java +GCS: onSingleTapUp +GCS: onClick +GCS: onDoubleTap // <- 双击 +GCS: onClick +``` + +| 类型 | 触发次数 | 摘要 | +| -------------------- | ---- | ------------ | +| onSingleTapUp | 1 | 在双击的第一次抬起时触发 | +| onSingleTapConfirmed | 0 | 双击发生时不会触发。 | +| onClick | 2 | 在双击事件时触发两次。 | + +可以看出来这三个事件还是有所不同的,根据自己实际需要进行使用即可 + +#### 2.4 SimpleOnGestureListener + +这个里面并没有什么内容,只是对上面三种 Listener 的空实现,在上面的例子中使用的基本都是这监听器。因为它用起来更方便一点。 + +这主要是 GestureDetector 构造函数的设计问题,以只监听 OnDoubleTapListener 为例,如果想要使用 OnDoubleTapListener 接口则需要这样进行设置: + +```java +GestureDetector detector = new GestureDetector(this, new GestureDetector + .SimpleOnGestureListener()); +detector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() { + @Override public boolean onSingleTapConfirmed(MotionEvent e) { + Toast.makeText(MainActivity.this, "单击确认", Toast.LENGTH_SHORT).show(); + return false; + } + + @Override public boolean onDoubleTap(MotionEvent e) { + Toast.makeText(MainActivity.this, "双击", Toast.LENGTH_SHORT).show(); + return false; + } + + @Override public boolean onDoubleTapEvent(MotionEvent e) { + // Toast.makeText(MainActivity.this,"",Toast.LENGTH_SHORT).show(); + return false; + } +}); +``` + +既然都已经创建 SimpleOnGestureListener 了,再创建一个 OnDoubleTapListener 显然十分浪费,如果构造函数不使用 SimpleOnGestureListener,而是使用 OnGestureListener 的话,会多出几个无用的空实现,显然很浪费,所以在一般情况下,老老实实的使用 SimpleOnGestureListener 就好了。 + +### 3. 相关方法 + +除了各类监听器之外,与 GestureDetector 相关的方法其实并不多,只有几个,下面来简单介绍一下。 + +| 方法 | 摘要 | +| ----------------------- | ---------------------------------------- | +| setIsLongpressEnabled | 通过布尔值设置是否允许触发长按事件,true 表示允许,false 表示不允许。 | +| isLongpressEnabled | 判断当前是否允许触发长按事件,true 表示允许,false 表示不允许。 | +| onTouchEvent | 这个是其中一个重要的方法,在最开始已经演示过使用方式了。 | +| onGenericMotionEvent | 这个是在 API 23 之后才添加的内容,主要是为 OnContextClickListener 服务的,暂时不用关注。 | +| setContextClickListener | 设置 ContextClickListener 。 | +| setOnDoubleTapListener | 设置 OnDoubleTapListener 。 | + +### 结语 + +关于手势检测部分的 GestureDetector 相关内容基本就这么多了,其实手势检测还有一个 ScaleGestureDetector 也是为手势检测服务的,限于篇幅,本次就讲这么多吧。 + +## About Me + +### 作者微博: @GcsSloop + + + +## 参考资料 +[GestureDetector ](https://developer.android.com/reference/android/view/GestureDetector.html) \ No newline at end of file From 268bb4e06dc8d719a81fb8dac9744d2880c83c75 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 10 Jul 2017 00:14:30 +0800 Subject: [PATCH 589/615] Update README --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index e3b614e8..1218323a 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,14 @@ * 商业用途请点击最下面图片联系本人。 * 微信公众号转载一律不授权 `原创` 标志。 +## 捐赠 + +#### 如果你觉得我的文章有帮助的话,捐赠一些晶石,鼓励我继续研究! 🐾 + +| | | +| ---------------------------------------- | ---------------------------------------- | +| ![](http://www.gcssloop.com/assets/images/wechat.png) | ![](http://www.gcssloop.com/assets/images/alipay.png) | + ## 交流群 QQ群:612310796 From 6ef9ef95636d7305b326bb43fc69e7258c3527d7 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 10 Jul 2017 00:16:18 +0800 Subject: [PATCH 590/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1218323a..542978bd 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ * [安卓自定义View进阶 - MotionEvent详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B16%5DMotionEvent.md) * [安卓自定义View进阶 - 特殊形状控件事件处理方案](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B17%5Dtouch-matrix-region.md) * [安卓自定义View进阶 - 多点触控详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B18%5Dmulti-touch.md) + * [安卓自定义View进阶 - 手势检测(GestureDetector)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B19%5Dgesture-detector.md) * [ViewSupport - 自定义View工具包](https://github.com/GcsSloop/ViewSupport) From 73e0c86f6bf92b8933abc4d534a37b777f2fb294 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 10 Jul 2017 09:20:20 +0800 Subject: [PATCH 591/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[19]gesture-detector.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[19]gesture-detector.md b/CustomView/Advance/[19]gesture-detector.md index 5c7d1eb4..7e0a14cd 100644 --- a/CustomView/Advance/[19]gesture-detector.md +++ b/CustomView/Advance/[19]gesture-detector.md @@ -370,6 +370,8 @@ detector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() { 关于手势检测部分的 GestureDetector 相关内容基本就这么多了,其实手势检测还有一个 ScaleGestureDetector 也是为手势检测服务的,限于篇幅,本次就讲这么多吧。 +其实手势检测辅助类 GestureDetector 本身并不是很复杂,带上注释等内容才不到1000行,感兴趣的可以自己研究一下实现方式。 + ## About Me ### 作者微博: @GcsSloop @@ -378,4 +380,5 @@ detector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() { ## 参考资料 -[GestureDetector ](https://developer.android.com/reference/android/view/GestureDetector.html) \ No newline at end of file +[文档 · GestureDetector ](https://developer.android.com/reference/android/view/GestureDetector.html) +[源码 · GestureDetector](https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/view/GestureDetector.java) \ No newline at end of file From b6b942a94b30789c6b1fb04a38164f5923f99d7e Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 12 Jul 2017 09:20:56 +0800 Subject: [PATCH 592/615] =?UTF-8?q?=E5=8B=98=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[19]gesture-detector.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[19]gesture-detector.md b/CustomView/Advance/[19]gesture-detector.md index 7e0a14cd..94e60e18 100644 --- a/CustomView/Advance/[19]gesture-detector.md +++ b/CustomView/Advance/[19]gesture-detector.md @@ -274,7 +274,9 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float ##### 2.3.5 onShowPress -它在用户按下时就会回调,主要作用是给用户提供一种视觉反馈,其实它就是对 down 事件对一种回调,在监听到这种事件时可以让控件换一种颜色,或者产生一些变化,告诉用户他的动作已经被识别。 +它是用户按下时的一种回调,主要作用是给用户提供一种视觉反馈,可以在监听到这种事件时可以让控件换一种颜色,或者产生一些变化,告诉用户他的动作已经被识别。 + +不过这个消息和 onSingleTapConfirmed 类似,也是一种延时回调,延迟时间是 180 ms,假如用户手指按下后立即抬起或者事件立即被拦截,时间没有超过 180 ms的话,这条消息会被 remove 掉,也就不会触发这个回调。 ```java @Override From 8a35bdf5f142a13808cc589ba3f5ec38146659d7 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 6 Oct 2017 15:43:42 +0800 Subject: [PATCH 593/615] Update --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 542978bd..bfba94e6 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,8 @@ ## 开源库 +* [encrypt - 加密工具包](https://github.com/GcsSloop/encrypt) +* [rclayout - 通用圆角布局](https://github.com/GcsSloop/rclayout) * [FontsManager - 快速替换字体](https://github.com/GcsSloop/FontsManager) * [Rocker - 自定义摇杆](https://github.com/GcsSloop/Rocker) * [LeafLoading - 进度条](https://github.com/GcsSloop/LeafLoading) From 6f11054027e0f138b582658085f7f1abea21632b Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 5 Nov 2017 18:03:24 +0800 Subject: [PATCH 594/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bfba94e6..8dbbd955 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,7 @@ QQ群:612310796 微信群:加我个人微信 GcsSloop,备注加群。 +![](https://ww4.sinaimg.cn/large/006tKfTcly1fl7d6wy91dj30p005k0ue.jpg) ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From 41a756b67fe9e3f4f8a00ee5b96b1a4552063a12 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 6 Nov 2017 21:14:09 -0600 Subject: [PATCH 595/615] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8dbbd955..bf315325 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,12 @@ ****** +## 雕虫晓技 + +* [组件化](https://mp.weixin.qq.com/s?__biz=MzI3MzMzNjgzMA==&mid=2247483674&idx=1&sn=fc93e05445a8fefcde0fdfb2c0145321&chksm=eb25918bdc52189d3ce82d7796ec95105927734d0cf47544126937d3d1255f41002f0cfb3afe&mpshare=1&scene=1&srcid=1106IA3DQP1u3IkOcCVwq1u2&key=5dba587a8b06ccca4ff30ff629f458ed05559774b37f3b9080982d26a7151db05c0324f15551f87029d3a11fee57d8fd51c5622f26b109f6f59a4c6c4ee811a840d7e9862b796b9dbdea8c14a1d32e9f&ascene=0&uin=NjM4NDkwNzgy&devicetype=iMac+MacBookAir7%2C2+OSX+OSX+10.12.4+build(16E195)&version=12010110&nettype=WIFI&fontScale=100&pass_ticket=wtm7nx0Fp2owsbSKcyoiIgV4pVu0Rw0GZicnXakuWo0tyipA8VCHAfpOkJGhp3yb) + +****** + ## [教程类](https://github.com/GcsSloop/AndroidNote/tree/master/Course/README.md) * [在AndroidStudio中使用PlantUML(Win)](https://github.com/GcsSloop/AndroidNote/blob/master/Course/HowToUsePlantUMLInAS.md) @@ -154,7 +160,7 @@ QQ群:612310796 微信群:加我个人微信 GcsSloop,备注加群。 -![](https://ww4.sinaimg.cn/large/006tKfTcly1fl7d6wy91dj30p005k0ue.jpg) +![](https://ww3.sinaimg.cn/large/006tNc79gy1fl8bemmtmxj30p005k406.jpg) ### 作者微博: [@GcsSloop](http://weibo.com/GcsSloop) From 4131a7c740b350ff1d6b7d75edc08562eef9fc9b Mon Sep 17 00:00:00 2001 From: sloop Date: Fri, 10 Nov 2017 04:04:00 -0600 Subject: [PATCH 596/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bf315325..ca6dc0d8 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,8 @@ ## 雕虫晓技 -* [组件化](https://mp.weixin.qq.com/s?__biz=MzI3MzMzNjgzMA==&mid=2247483674&idx=1&sn=fc93e05445a8fefcde0fdfb2c0145321&chksm=eb25918bdc52189d3ce82d7796ec95105927734d0cf47544126937d3d1255f41002f0cfb3afe&mpshare=1&scene=1&srcid=1106IA3DQP1u3IkOcCVwq1u2&key=5dba587a8b06ccca4ff30ff629f458ed05559774b37f3b9080982d26a7151db05c0324f15551f87029d3a11fee57d8fd51c5622f26b109f6f59a4c6c4ee811a840d7e9862b796b9dbdea8c14a1d32e9f&ascene=0&uin=NjM4NDkwNzgy&devicetype=iMac+MacBookAir7%2C2+OSX+OSX+10.12.4+build(16E195)&version=12010110&nettype=WIFI&fontScale=100&pass_ticket=wtm7nx0Fp2owsbSKcyoiIgV4pVu0Rw0GZicnXakuWo0tyipA8VCHAfpOkJGhp3yb) +* [雕虫晓技(一) 组件化](http://mp.weixin.qq.com/s/A2yd7DO1NvT0CEmzh_VwsQ) +* [雕虫晓技(二) 编码](http://mp.weixin.qq.com/s/70l0u-3WQeAkCDp6Nau3CQ) ****** From 5cdb29795579033bab23f11708ac3ccb3f44d05e Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 7 Feb 2018 15:43:27 +0800 Subject: [PATCH 597/615] update --- AV/README.md | 4 ++++ ...46\224\276\346\265\201\347\250\213.gliffy" | 1 + ...5\346\224\276\346\265\201\347\250\213.jpg" | Bin 0 -> 35522 bytes ...55\346\224\276\346\265\201\347\250\213.md" | 18 ++++++++++++++++++ 4 files changed, 23 insertions(+) create mode 100644 AV/README.md create mode 100644 "AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.gliffy" create mode 100644 "AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.jpg" create mode 100644 "AV/\351\200\232\347\224\250\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.md" diff --git a/AV/README.md b/AV/README.md new file mode 100644 index 00000000..de09b5cb --- /dev/null +++ b/AV/README.md @@ -0,0 +1,4 @@ +# Audio/Video 杂记 + +- [通用视频解码播放流程](通用视频解码播放流程.md) + diff --git "a/AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.gliffy" "b/AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.gliffy" new file mode 100644 index 00000000..f4a83d31 --- /dev/null +++ "b/AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.gliffy" @@ -0,0 +1 @@ +{"contentType":"application/gliffy+json","version":"1.1","metadata":{"title":"untitled","revision":0,"exportBorder":false},"embeddedResources":{"index":0,"resources":[]},"stage":{"objects":[{"x":20,"y":580,"rotation":0,"id":3,"uid":"com.gliffy.shape.network.network_v3.home.speakers","width":74,"height":100,"lockAspectRatio":true,"lockShape":false,"order":36,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.speakers_3d.network_v3","strokeWidth":2,"strokeColor":"#000000","fillColor":"#003366","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":69,"uid":null,"width":75,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"both","vposition":"below","hposition":"none","html":"

音频驱动/设备

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":264,"y":580,"rotation":0,"id":9,"uid":"com.gliffy.shape.network.network_v3.home.tv_flatscreen","width":76,"height":100,"lockAspectRatio":true,"lockShape":false,"order":35,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.tv_flatscreen_3d.network_v3","strokeWidth":2,"strokeColor":"#000000","fillColor":"#003366","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":70,"uid":null,"width":75,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"both","vposition":"below","hposition":"none","html":"

视频驱动/设备

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":245,"y":580,"rotation":0,"id":60,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":34,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-65,0],[-65,50],[57,50]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":45,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":9,"px":0.5,"py":0.5}}},"linkMap":[]},{"x":114,"y":584,"rotation":0,"id":59,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":33,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[66,-4],[66,46],[-57,46]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":45,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":3,"px":0.5,"py":0.5}}},"linkMap":[]},{"x":270,"y":502,"rotation":0,"id":58,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":32,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[10,-2],[10,18],[-90,18],[-90,38]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":40,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":45,"px":0.5,"py":0}}},"linkMap":[]},{"x":92,"y":497,"rotation":0,"id":56,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":31,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-12,3],[-12,23],[88,23],[88,43]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":38,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":45,"px":0.5,"py":0}}},"linkMap":[]},{"x":267,"y":433,"rotation":0,"id":54,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":30,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[13,-3],[13,7],[13,17],[13,27]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":36,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":40,"px":0.5,"py":0}}},"linkMap":[]},{"x":87,"y":431,"rotation":0,"id":53,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":29,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-7,-1],[-7,9],[-7,19],[-7,29]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":34,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":38,"px":0.5,"py":0}}},"linkMap":[]},{"x":271,"y":362,"rotation":0,"id":52,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":28,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[9,-2],[9,8],[9,18],[9,28]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":32,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":36,"px":0.5,"py":0}}},"linkMap":[]},{"x":92,"y":356,"rotation":0,"id":51,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":27,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-12,4],[-12,14],[-12,24],[-12,34]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":29,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":34,"px":0.5,"py":0}}},"linkMap":[]},{"x":243,"y":271,"rotation":0,"id":50,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":26,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-63,-1],[-63,24],[37,24],[37,49]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":27,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":32,"px":0.5,"py":0}}},"linkMap":[]},{"x":106,"y":268,"rotation":0,"id":49,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":25,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[74,2],[74,27],[-26,27],[-26,52]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":27,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":29,"px":0.5,"py":0}}},"linkMap":[]},{"x":181,"y":201,"rotation":0,"id":48,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":24,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-1,-1],[-1,9],[-1,19],[-1,29]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":25,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":27,"px":0.5,"py":0}}},"linkMap":[]},{"x":179,"y":134,"rotation":0,"id":47,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":23,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[1,-4],[1,6],[1,16],[1,26]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":23,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":25,"px":0.5,"py":0}}},"linkMap":[]},{"x":120,"y":540,"rotation":0,"id":45,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":21,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.4000000000000004,"y":0,"rotation":0,"id":46,"uid":null,"width":115.2,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

音视频同步

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":182,"y":62,"rotation":0,"id":42,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":20,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-2,-2],[-2,8],[-2,18],[-2,28]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":19,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":23,"px":0.5,"py":0}}},"linkMap":[]},{"x":220,"y":460,"rotation":0,"id":40,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":18,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#d0e0e3","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.4,"y":0,"rotation":0,"id":41,"uid":null,"width":115.2,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

视频原始数据

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":20,"y":460,"rotation":0,"id":38,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":16,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#d0e0e3","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.4,"y":0,"rotation":0,"id":39,"uid":null,"width":115.2,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

音频原始数据

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":220,"y":390,"rotation":0,"id":36,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":14,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#f9cb9c","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.4,"y":0,"rotation":0,"id":37,"uid":null,"width":115.2,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

视频解码

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":20,"y":390,"rotation":0,"id":34,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":12,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#f9cb9c","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.4,"y":0,"rotation":0,"id":35,"uid":null,"width":115.2,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

音频解码

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":220,"y":320,"rotation":0,"id":32,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":10,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#a2c4c9","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.4,"y":0,"rotation":0,"id":33,"uid":null,"width":115.2,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

视频压缩数据

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":20,"y":320,"rotation":0,"id":29,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":8,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#a2c4c9","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.4,"y":0,"rotation":0,"id":30,"uid":null,"width":115.2,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

音频压缩数据

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":120,"y":230,"rotation":0,"id":27,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":6,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.3999999999999995,"y":0,"rotation":0,"id":28,"uid":null,"width":115.19999999999999,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

解封装

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":120,"y":160,"rotation":0,"id":25,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":4,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#76a5af","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.3999999999999995,"y":0,"rotation":0,"id":26,"uid":null,"width":115.19999999999999,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

封装格式数据

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":120,"y":90,"rotation":0,"id":23,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":2,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.4000000000000004,"y":0,"rotation":0,"id":24,"uid":null,"width":115.19999999999999,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

解协议

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":120,"y":20,"rotation":0,"id":19,"uid":"com.gliffy.shape.flowchart.flowchart_v1.default.process","width":120,"height":40,"lockAspectRatio":false,"lockShape":false,"order":0,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#45818e","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2.3999999999999995,"y":0,"rotation":0,"id":21,"uid":null,"width":115.19999999999993,"height":14,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

网络数据

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]}],"background":"#FFFFFF","width":340.5,"height":698,"maxWidth":5000,"maxHeight":5000,"nodeIndex":72,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":true,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"shapeStyles":{"com.gliffy.shape.network.network_v3.home":{"fill":"#003366"},"com.gliffy.shape.flowchart.flowchart_v1.default":{"fill":"#f9cb9c","stroke":"#333333","strokeWidth":2}},"lineStyles":{"global":{"endArrow":2,"orthoMode":0}},"textStyles":{},"themeData":null}} \ No newline at end of file diff --git "a/AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.jpg" "b/AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..25f9b8205897992d7971f05a0ce462f880efc19b GIT binary patch literal 35522 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 ZAW**=X#khi;M4z|c>lk?&iiBPe*h9Jrvm^0 literal 0 HcmV?d00001 diff --git "a/AV/\351\200\232\347\224\250\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.md" "b/AV/\351\200\232\347\224\250\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.md" new file mode 100644 index 00000000..6f35f5d3 --- /dev/null +++ "b/AV/\351\200\232\347\224\250\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.md" @@ -0,0 +1,18 @@ +--- +typora-copy-images-to: ./image +--- + +## 通用视频解码播放流程 + +**通用的网络视频播放流程:** + +1. 从网络数据流中获得视频数据流。 +2. 将视频数据流解析成压缩音频数据和压缩视频数据。 +3. 分别对音频和视频解码获取原始(采样)数据。 +4. 经过同步策略后,有序的将原始(采样)数据输出到指定设备播放。 + +![视频解码播放流程](image/视频解码播放流程.jpg) + +### 参考资料: + +[视音频编解码技术零基础学习方法](http://blog.csdn.net/leixiaohua1020/article/details/18893769) \ No newline at end of file From 017e76ed955f6d3b130c947a47be94c2612b875c Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 8 Feb 2018 18:09:15 +0800 Subject: [PATCH 598/615] Update --- ...01\350\243\205\346\240\274\345\274\217.md" | 28 +++++ ...74\345\274\217\346\246\202\350\247\210.md" | 14 +++ ...22\344\275\223\345\215\217\350\256\256.md" | 33 ++++++ ...06\351\242\221\347\274\226\347\240\201.md" | 110 ++++++++++++++++++ 4 files changed, 185 insertions(+) create mode 100644 "AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217.md" create mode 100644 "AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217\346\246\202\350\247\210.md" create mode 100644 "AV/\345\270\270\350\247\201\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" create mode 100644 "AV/\345\270\270\350\247\201\351\237\263\350\247\206\351\242\221\347\274\226\347\240\201.md" diff --git "a/AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217.md" "b/AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217.md" new file mode 100644 index 00000000..5dcf80b8 --- /dev/null +++ "b/AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217.md" @@ -0,0 +1,28 @@ +## 常见封装格式 + +封装格式的主要作用是把视频码流和音频码流按照一定的格式存储在一个文件中。现如今流行的封装格式如下表所示: + +主要封装格式一览 + +| 名称 | 推出机构 | 流媒体 | 支持的视频编码 | 支持的音频编码 | 目前使用领域 | +| ---- | ------------------ | ---- | ----------------------------- | ------------------------------------ | --------- | +| AVI | Microsoft Inc. | 不支持 | 几乎所有格式 | 几乎所有格式 | BT下载影视 | +| MP4 | MPEG | 支持 | MPEG-2, MPEG-4, H.264, H.263等 | AAC, MPEG-1 Layers I, II, III, AC-3等 | 互联网视频网站 | +| TS | MPEG | 支持 | MPEG-1, MPEG-2, MPEG-4, H.264 | MPEG-1 Layers I, II, III, AAC, | IPTV,数字电视 | +| FLV | Adobe Inc. | 支持 | Sorenson, VP6, H.264 | MP3, ADPCM, Linear PCM, AAC等 | 互联网视频网站 | +| MKV | CoreCodec Inc. | 支持 | 几乎所有格式 | 几乎所有格式 | 互联网视频网站 | +| RMVB | Real Networks Inc. | 支持 | RealVideo 8, 9, 10 | AAC, Cook Codec, RealAudio Lossless | BT下载影视 | + +由表可见,除了AVI之外,其他封装格式都支持流媒体,即可以“边下边播”。有些格式更“万能”一些,支持的视音频编码标准多一些,比如MKV。而有些格式则支持的相对比较少,比如说RMVB。 + +这些封装格式都有相关的文档,在这里就不一一例举了。 + +我自己也做过辅助学习的小项目: + +[TS封装格式分析器](http://blog.csdn.net/leixiaohua1020/article/details/17973587) + +[FLV封装格式分析器](http://blog.csdn.net/leixiaohua1020/article/details/17934487) + +### 参考资料: + +[视音频编解码技术零基础学习方法](http://blog.csdn.net/leixiaohua1020/article/details/18893769) \ No newline at end of file diff --git "a/AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217\346\246\202\350\247\210.md" "b/AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217\346\246\202\350\247\210.md" new file mode 100644 index 00000000..98f1e818 --- /dev/null +++ "b/AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217\346\246\202\350\247\210.md" @@ -0,0 +1,14 @@ +## 常见封装格式概览 + +| 名称 | 推出机构 | 流媒体 | 支持的视频编码 | 支持的音频编码 | 目前使用领域 | +| ---- | ------------------ | ---- | ----------------------------- | ------------------------------------ | --------- | +| AVI | Microsoft Inc. | 不支持 | 几乎所有格式 | 几乎所有格式 | BT下载影视 | +| MP4 | MPEG | 支持 | MPEG-2, MPEG-4, H.264, H.263等 | AAC, MPEG-1 Layers I, II, III, AC-3等 | 互联网视频网站 | +| TS | MPEG | 支持 | MPEG-1, MPEG-2, MPEG-4, H.264 | MPEG-1 Layers I, II, III, AAC, | IPTV,数字电视 | +| FLV | Adobe Inc. | 支持 | Sorenson, VP6, H.264 | MP3, ADPCM, Linear PCM, AAC等 | 互联网视频网站 | +| MKV | CoreCodec Inc. | 支持 | 几乎所有格式 | 几乎所有格式 | 互联网视频网站 | +| RMVB | Real Networks Inc. | 支持 | RealVideo 8, 9, 10 | AAC, Cook Codec, RealAudio Lossless | BT下载影视 | + +### 参考资料: + +[视音频编解码技术零基础学习方法](http://blog.csdn.net/leixiaohua1020/article/details/18893769) \ No newline at end of file diff --git "a/AV/\345\270\270\350\247\201\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" "b/AV/\345\270\270\350\247\201\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" new file mode 100644 index 00000000..7cb5b7a2 --- /dev/null +++ "b/AV/\345\270\270\350\247\201\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" @@ -0,0 +1,33 @@ +## 常见流媒体协议 + +流媒体协议是服务器与客户端之间通信遵循的规定。当前网络上主要的流媒体协议如表所示。 + +| 名称 | 推出机构 | 传输层协议 | 客户端 | 目前使用领域 | +| -------- | -------------- | ------- | -------- | -------- | +| RTSP+RTP | IETF | TCP+UDP | VLC, WMP | IPTV | +| RTMP | Adobe Inc. | TCP | Flash | 互联网直播 | +| RTMFP | Adobe Inc. | UDP | Flash | 互联网直播 | +| MMS | Microsoft Inc. | TCP/UDP | WMP | 互联网直播+点播 | +| HTTP | WWW+IETF | TCP | Flash | 互联网点播 | + +RTSP+RTP经常用于IPTV领域。因为其采用UDP传输视音频,支持组播,效率较高。但其缺点是网络不好的情况下可能会丢包,影响视频观看质量。因而围绕IPTV的视频质量的研究还是挺多的。 + +RTSP规范可参考:[RTSP协议学习笔记](http://blog.csdn.net/leixiaohua1020/article/details/11955341) + +RTSP+RTP系统中衡量服务质量可参考:[网络视频传输的服务质量(QoS)](http://blog.csdn.net/leixiaohua1020/article/details/11883393) + +上海IPTV码流分析结果可参考:[IPTV视频码流分析](http://blog.csdn.net/leixiaohua1020/article/details/11846761) + +因为互联网网络环境的不稳定性,RTSP+RTP较少用于互联网视音频传输。互联网视频服务通常采用TCP作为其流媒体的传输层协议,因而像RTMP,MMS,HTTP这类的协议广泛用于互联网视音频服务之中。这类协议不会发生丢包,因而保证了视频的质量,但是传输的效率会相对低一些。 + +此外RTMFP是一种比较新的流媒体协议,特点是支持P2P。 + +RTMP我做的研究相对多一些:比如[RTMP规范简单分析](http://blog.csdn.net/leixiaohua1020/article/details/11694129),或者[RTMP流媒体播放过程](http://blog.csdn.net/leixiaohua1020/article/details/11704355) + +相关工具的源代码分析:[RTMPdump源代码分析 1: main()函数[系列文章\]](http://blog.csdn.net/leixiaohua1020/article/details/12952977) + +RTMP协议学习:[RTMP流媒体技术零基础学习方法](http://blog.csdn.net/leixiaohua1020/article/details/15814587) + +### 参考资料: + +[视音频编解码技术零基础学习方法](http://blog.csdn.net/leixiaohua1020/article/details/18893769) \ No newline at end of file diff --git "a/AV/\345\270\270\350\247\201\351\237\263\350\247\206\351\242\221\347\274\226\347\240\201.md" "b/AV/\345\270\270\350\247\201\351\237\263\350\247\206\351\242\221\347\274\226\347\240\201.md" new file mode 100644 index 00000000..524415e3 --- /dev/null +++ "b/AV/\345\270\270\350\247\201\351\237\263\350\247\206\351\242\221\347\274\226\347\240\201.md" @@ -0,0 +1,110 @@ +## 常见音视频编码 + +### 1. 视频编码 + +视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,可以获得更高的视频质量。 + +视频编码的简单原理可以参考:[视频压缩编码和音频压缩编码的基本原理](http://blog.csdn.net/leixiaohua1020/article/details/28114081) + +注:视频编码技术在整个视音频技术中应该是最复杂的技术。如果没有基础的话,可以先买一些书看一下原理,比如说《现代电视原理》《数字电视广播原理与应用》(本科的课本)中的部分章节。 + +主要视频编码一览 + +| 名称 | 推出机构 | 推出时间 | 目前使用领域 | +| ----------- | -------------- | ---- | ------ | +| HEVC(H.265) | MPEG/ITU-T | 2013 | 研发中 | +| H.264 | MPEG/ITU-T | 2003 | 各个领域 | +| MPEG4 | MPEG | 2001 | 不温不火 | +| MPEG2 | MPEG | 1994 | 数字电视 | +| VP9 | Google | 2013 | 研发中 | +| VP8 | Google | 2008 | 不普及 | +| VC-1 | Microsoft Inc. | 2006 | 微软平台 | + +由表可见,有两种视频编码方案是最新推出的:VP9和HEVC。目前这两种方案都处于研发阶段,还没有到达实用的程度。当前使用最多的视频编码方案就是H.264。 + +#### **1.1 主流编码标准** + +H.264仅仅是一个编码标准,而不是一个具体的编码器,H.264只是给编码器的实现提供参照用的。 + +基于H.264标准的编码器还是很多的,究竟孰优孰劣?可参考:[MSU出品的 H.264编码器比较(2011.5)](http://blog.csdn.net/leixiaohua1020/article/details/12373947) + +在学习视频编码的时候,可能会用到各种编码器(实际上就是一个exe文件),他们常用的编码命令可以参考:[各种视频编码器的命令行格式](http://blog.csdn.net/leixiaohua1020/article/details/11705495) + +学习H.264最标准的源代码,就是其官方标准JM了。但是要注意,JM速度非常的慢,是无法用于实际的:[H.264参考软件JM12.2RC代码详细流程](http://blog.csdn.net/leixiaohua1020/article/details/11980219) + +实际中使用最多的就是x264了,性能强悍(超过了很多商业编码器),而且开源。其基本教程网上极多,不再赘述。编码时候可参考:[x264编码指南——码率控制](http://blog.csdn.net/leixiaohua1020/article/details/12720135)。编码后统计值的含义:[X264输出的统计值的含义(X264 Stats Output)](http://blog.csdn.net/leixiaohua1020/article/details/11884559) + +Google推出的VP8属于和H.264同一时代的标准。总体而言,VP8比H.264要稍微差一点。有一篇写的很好的VP8的介绍文章:[深入了解 VP8](http://blog.csdn.net/leixiaohua1020/article/details/12760173)。除了在技术领域,VP8和H.264在专利等方面也是打的不可开交,可参考文章:[WebM(VP8) vs H.264](http://blog.csdn.net/leixiaohua1020/article/details/12720237) + +此外,我国还推出了自己的国产标准AVS,性能也不错,但目前比H.264还是要稍微逊色一点。不过感觉我国在视频编解码领域还算比较先进的,可参考:[视频编码国家标准AVS与H.264的比较(节选)](http://blog.csdn.net/leixiaohua1020/article/details/12851745) + +近期又推出了AVS新一代的版本AVS+,具体的性能测试还没看过。不过据说AVS+得到了国家政策上非常强力的支持。 + +#### **1.2 下一代编码标准** + +下一代的编解码标准就要数HEVC和VP9了。VP9是Google继VP8之后推出的新一代标准。VP9和HEVC相比,要稍微逊色一些。它们的对比可参考:(1)[HEVC与VP9编码效率对比](http://blog.csdn.net/leixiaohua1020/article/details/11713041) (2)[HEVC,VP9,x264性能对比](http://blog.csdn.net/leixiaohua1020/article/details/19014955) + +HEVC在未来拥有很多大的优势,可参考:[HEVC将会取代H.264的原因](http://blog.csdn.net/leixiaohua1020/article/details/11844949) + +学习HEVC最标准的源代码,就是其官方标准HM了。其速度比H.264的官方标准代码又慢了一大截,使用可参考:[HEVC学习—— HM的使用](http://blog.csdn.net/leixiaohua1020/article/details/12759297) + +未来实际使用的HEVC开源编码器很有可能是x265,目前该项目还处于发展阶段,可参考:[x265(HEVC编码器,基于x264)](http://blog.csdn.net/leixiaohua1020/article/details/13991351)[介绍](http://blog.csdn.net/leixiaohua1020/article/details/13991351)。x265的使用可以参考:[HEVC(H.265)标准的编码器(x265,DivX265)试用](http://blog.csdn.net/leixiaohua1020/article/details/18861635) + +主流以及下一代编码标准之间的比较可以参考文章:[视频编码方案之间的比较(HEVC,H.264,MPEG2等)](http://blog.csdn.net/leixiaohua1020/article/details/12237177) + +此外,在码率一定的情况下,几种编码标准的比较可参考:[限制码率的视频编码标准比较(包括MPEG-2,H.263,MPEG-4,以及 H.264)](http://blog.csdn.net/leixiaohua1020/article/details/12851975) + +结果大致是这样的: + +HEVC > VP9 > H.264> VP8 > MPEG4 > H.263 > MPEG2。 + +截了一些图,可以比较直观的了解各种编码标准: + +HEVC码流简析:[HEVC码流简单分析](http://blog.csdn.net/leixiaohua1020/article/details/11845069) + +H.264码流简析:[H.264简单码流分析](http://blog.csdn.net/leixiaohua1020/article/details/11845625) + +MPEG2码流简析:[MPEG2简单码流分析](http://blog.csdn.net/leixiaohua1020/article/details/11846185) + +以上简析使用的工具:[视频码流分析工具](http://blog.csdn.net/leixiaohua1020/article/details/11845435) + +我自己做的小工具: [H.264码流分析器](http://blog.csdn.net/leixiaohua1020/article/details/17933821) + +### 2. 音频编码 + +音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。音频编码也是互联网视音频技术中一个重要的技术。但是一般情况下音频的数据量要远小于视频的数据量,因而即使使用稍微落后的音频编码标准,而导致音频数据量有所增加,也不会对视音频的总数据量产生太大的影响。高效率的音频编码在同等的码率下,可以获得更高的音质。 + +音频编码的简单原理可以参考:[视频压缩编码和音频压缩编码的基本原理](http://blog.csdn.net/leixiaohua1020/article/details/28114081) + +主要音频编码一览 + +| 名称 | 推出机构 | 推出时间 | 目前使用领域 | +| ---- | -------------- | ---- | ------- | +| AAC | MPEG | 1997 | 各个领域(新) | +| AC-3 | Dolby Inc. | 1992 | 电影 | +| MP3 | MPEG | 1993 | 各个领域(旧) | +| WMA | Microsoft Inc. | 1999 | 微软平台 | + +由表可见,近年来并未推出全新的音频编码方案,可见音频编码技术已经基本可以满足人们的需要。音频编码技术近期绝大部分的改动都是在MP3的继任者——AAC的基础上完成的。 + +这些编码标准之间的比较可以参考文章:[音频编码方案之间音质比较(AAC,MP3,WMA等)](http://blog.csdn.net/leixiaohua1020/article/details/11730661) + +结果大致是这样的: + +AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3 + +AAC格式的介绍:[AAC格式简介](http://blog.csdn.net/leixiaohua1020/article/details/11822537) + +AAC几种不同版本之间的对比:[AAC规格(LC,HE,HEv2)及性能对比](http://blog.csdn.net/leixiaohua1020/article/details/11971419) + +AAC专利方面的介绍:[AAC专利介绍](http://blog.csdn.net/leixiaohua1020/article/details/11854587) + +此外杜比数字的编码标准也比较流行,但是貌似比最新的AAC稍为逊色:[AC-3技术综述](http://blog.csdn.net/leixiaohua1020/article/details/11822737) + +我自己做的小工具:[ AAC格式分析器](http://blog.csdn.net/leixiaohua1020/article/details/18155549) + + + +### 参考资料: + +[视音频编解码技术零基础学习方法](http://blog.csdn.net/leixiaohua1020/article/details/18893769) \ No newline at end of file From 05b800c05e3c4b7d35743f26af170cd6060a9308 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 19 Mar 2018 16:00:40 +0800 Subject: [PATCH 599/615] add --- {AV => AudioVideo}/README.md | 0 AudioVideo/SDL.md | 73 ++++++++++++++++++ ...0\346\215\256\347\273\223\346\236\204.jpg" | Bin 0 -> 31591 bytes .../image/SDL\346\265\201\347\250\213.jpg" | Bin 0 -> 69935 bytes .../image/SDL\347\273\223\346\236\204.png" | Bin 0 -> 296051 bytes ...46\224\276\346\265\201\347\250\213.gliffy" | 0 ...5\346\224\276\346\265\201\347\250\213.jpg" | Bin ...01\350\243\205\346\240\274\345\274\217.md" | 0 ...74\345\274\217\346\246\202\350\247\210.md" | 0 ...22\344\275\223\345\215\217\350\256\256.md" | 0 ...06\351\242\221\347\274\226\347\240\201.md" | 0 ...55\346\224\276\346\265\201\347\250\213.md" | 0 12 files changed, 73 insertions(+) rename {AV => AudioVideo}/README.md (100%) create mode 100644 AudioVideo/SDL.md create mode 100755 "AudioVideo/image/SDL\346\225\260\346\215\256\347\273\223\346\236\204.jpg" create mode 100755 "AudioVideo/image/SDL\346\265\201\347\250\213.jpg" create mode 100644 "AudioVideo/image/SDL\347\273\223\346\236\204.png" rename "AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.gliffy" => "AudioVideo/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.gliffy" (100%) rename "AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.jpg" => "AudioVideo/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.jpg" (100%) rename "AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217.md" => "AudioVideo/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217.md" (100%) rename "AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217\346\246\202\350\247\210.md" => "AudioVideo/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217\346\246\202\350\247\210.md" (100%) rename "AV/\345\270\270\350\247\201\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" => "AudioVideo/\345\270\270\350\247\201\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" (100%) rename "AV/\345\270\270\350\247\201\351\237\263\350\247\206\351\242\221\347\274\226\347\240\201.md" => "AudioVideo/\345\270\270\350\247\201\351\237\263\350\247\206\351\242\221\347\274\226\347\240\201.md" (100%) rename "AV/\351\200\232\347\224\250\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.md" => "AudioVideo/\351\200\232\347\224\250\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.md" (100%) diff --git a/AV/README.md b/AudioVideo/README.md similarity index 100% rename from AV/README.md rename to AudioVideo/README.md diff --git a/AudioVideo/SDL.md b/AudioVideo/SDL.md new file mode 100644 index 00000000..02b79fb9 --- /dev/null +++ b/AudioVideo/SDL.md @@ -0,0 +1,73 @@ +--- +typora-copy-images-to: ./image +--- + +## SDL + +### 简介 + +SDL(Simple DirectMedia Layer)库的作用就是封装了复杂的音视频底层交互工作,简化了音视频处理的难度。 + +**特点:** 开源、跨平台。 + +### 结构 + +![SDL结构](image/SDL结构.png) + +它是对底层进行了封装,最终还是调用的平台底层接口与硬件进行交互。 + +### SDL 流程 + +![SDL流程](image/SDL流程.jpg) + +### SDL 主要函数 + +| 函数 | 简介 | +| -------------------- | -------------------------- | +| SDL_Init() | 初始化 SDL 系统。 | +| SDL_CreateWindow() | 创建窗口 SDL_Window。 | +| SDL_CreateRenderer() | 创建渲染器 SDL_Renderer。 | +| SDL_CreateTexture() | 创建纹理 SDL_Texture。 | +| SDL_UpdateTexture() | 设置纹理数据。 | +| SDL_RenderCopy() | 将纹理的数据拷贝给渲染器。 | +| SDL_RenderPresent() | 显示。 | +| SDL_Delay() | 工具函数,用于延时。 | +| SDL_Quit() | 退出 SDL 系统。 | + +### SDL 数据结构 + +![SDL数据结构](image/SDL数据结构.jpg) + +**数据结构简介:** + +| 结构 | 简介 | +| ------------ | -------------------- | +| SDL_Window | 代表一个“窗口”。 | +| SDL_Renderer | 代表一个“渲染器”。 | +| SDL_Texture | 代表一个“纹理”。 | +| SDL_Rect | 一个简单的矩形结构。 | + +### SDL 事件和多线程 + +#### **SDL 多线程** + +| 函数 | 简介 | +| ------------------ | -------------- | +| SDL_CreateThread() | 创建一个线程。 | +| SDL_Thread() | 线程的句柄。 | + +#### **SDL 事件** + +**函数:** + +| 函数 | 简介 | +| --------------- | -------------- | +| SDL_WaitEvent() | 等待一个事件。 | +| SDL_PushEvent() | 发送一个事件。 | + +**数据结构:** + +| 结构 | 简介 | +| ----------- | -------------- | +| SDL_Event() | 代表一个事件。 | + diff --git "a/AudioVideo/image/SDL\346\225\260\346\215\256\347\273\223\346\236\204.jpg" "b/AudioVideo/image/SDL\346\225\260\346\215\256\347\273\223\346\236\204.jpg" new file mode 100755 index 0000000000000000000000000000000000000000..0fa937b7d7e0e1cb375338e0615f0f6eb6fbeae6 GIT binary patch literal 31591 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 Y#&82a(CTx8kM5e5t#fq!@{f`K1#zWZ`2YX_ literal 0 HcmV?d00001 diff --git "a/AudioVideo/image/SDL\346\265\201\347\250\213.jpg" "b/AudioVideo/image/SDL\346\265\201\347\250\213.jpg" new file mode 100755 index 0000000000000000000000000000000000000000..181050336a2f281cb016f2bd12e753e5e298b5e2 GIT binary patch literal 69935 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 og=*-ZxK;F|1VyiAG%W+vANIDZcP2dYY{J^%m! literal 0 HcmV?d00001 diff --git "a/AudioVideo/image/SDL\347\273\223\346\236\204.png" "b/AudioVideo/image/SDL\347\273\223\346\236\204.png" new file mode 100644 index 0000000000000000000000000000000000000000..9d150d3770365d64a3007b31001d9931045fa871 GIT binary patch literal 296051 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 z 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℞RI&;G+pa(cR%x=x_WLZRt;zZdLDn<`#i|bZx~mG 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 literal 0 HcmV?d00001 diff --git "a/AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.gliffy" "b/AudioVideo/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.gliffy" similarity index 100% rename from "AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.gliffy" rename to "AudioVideo/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.gliffy" diff --git "a/AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.jpg" "b/AudioVideo/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.jpg" similarity index 100% rename from "AV/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.jpg" rename to "AudioVideo/image/\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.jpg" diff --git "a/AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217.md" "b/AudioVideo/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217.md" similarity index 100% rename from "AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217.md" rename to "AudioVideo/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217.md" diff --git "a/AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217\346\246\202\350\247\210.md" "b/AudioVideo/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217\346\246\202\350\247\210.md" similarity index 100% rename from "AV/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217\346\246\202\350\247\210.md" rename to "AudioVideo/\345\270\270\350\247\201\345\260\201\350\243\205\346\240\274\345\274\217\346\246\202\350\247\210.md" diff --git "a/AV/\345\270\270\350\247\201\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" "b/AudioVideo/\345\270\270\350\247\201\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" similarity index 100% rename from "AV/\345\270\270\350\247\201\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" rename to "AudioVideo/\345\270\270\350\247\201\346\265\201\345\252\222\344\275\223\345\215\217\350\256\256.md" diff --git "a/AV/\345\270\270\350\247\201\351\237\263\350\247\206\351\242\221\347\274\226\347\240\201.md" "b/AudioVideo/\345\270\270\350\247\201\351\237\263\350\247\206\351\242\221\347\274\226\347\240\201.md" similarity index 100% rename from "AV/\345\270\270\350\247\201\351\237\263\350\247\206\351\242\221\347\274\226\347\240\201.md" rename to "AudioVideo/\345\270\270\350\247\201\351\237\263\350\247\206\351\242\221\347\274\226\347\240\201.md" diff --git "a/AV/\351\200\232\347\224\250\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.md" "b/AudioVideo/\351\200\232\347\224\250\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.md" similarity index 100% rename from "AV/\351\200\232\347\224\250\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.md" rename to "AudioVideo/\351\200\232\347\224\250\350\247\206\351\242\221\350\247\243\347\240\201\346\222\255\346\224\276\346\265\201\347\250\213.md" From aecd1908ce855d6e124bae5d0c6df899f594046c Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 19 Mar 2018 16:02:49 +0800 Subject: [PATCH 600/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ca6dc0d8..6b0caaf5 100644 --- a/README.md +++ b/README.md @@ -48,8 +48,10 @@ ## 雕虫晓技 -* [雕虫晓技(一) 组件化](http://mp.weixin.qq.com/s/A2yd7DO1NvT0CEmzh_VwsQ) -* [雕虫晓技(二) 编码](http://mp.weixin.qq.com/s/70l0u-3WQeAkCDp6Nau3CQ) +* [雕虫晓技(一) 组件化](http://www.gcssloop.com/gebug/componentr) +* [雕虫晓技(二) 编码](http://www.gcssloop.com/gebug/coding) +* [雕虫晓技(三) 通用圆角布局全解析](http://www.gcssloop.com/gebug/rclayout) +* [雕虫晓技(四) 搭建私有Maven仓库(带容灾备份)](http://www.gcssloop.com/gebug/maven-private) ****** From 8ce4f1b69edc6605a08562ece43df66a5134b5be Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Tue, 10 Apr 2018 09:53:21 +0800 Subject: [PATCH 601/615] doc --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6b0caaf5..ef7fb530 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ * [雕虫晓技(二) 编码](http://www.gcssloop.com/gebug/coding) * [雕虫晓技(三) 通用圆角布局全解析](http://www.gcssloop.com/gebug/rclayout) * [雕虫晓技(四) 搭建私有Maven仓库(带容灾备份)](http://www.gcssloop.com/gebug/maven-private) +* [雕虫晓技(五) 网格分页布局源码解析(上) (付费)](https://xiaozhuanlan.com/topic/5841730926) ****** From 692b0cc13c02be23bd3d670eb0e678392b7ebf6c Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 12 Apr 2018 11:24:49 +0800 Subject: [PATCH 602/615] Doc --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ef7fb530..3407cc40 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ * [雕虫晓技(三) 通用圆角布局全解析](http://www.gcssloop.com/gebug/rclayout) * [雕虫晓技(四) 搭建私有Maven仓库(带容灾备份)](http://www.gcssloop.com/gebug/maven-private) * [雕虫晓技(五) 网格分页布局源码解析(上) (付费)](https://xiaozhuanlan.com/topic/5841730926) +* [雕虫晓技(六) 网格分页布局源码解析(下) (付费)](https://xiaozhuanlan.com/topic/1456397082) ****** From 711e43673d97f21a672af01c5a40f7f880131ca9 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 14 Jun 2018 10:25:26 +0800 Subject: [PATCH 603/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3407cc40..9426a6f2 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ * [雕虫晓技(四) 搭建私有Maven仓库(带容灾备份)](http://www.gcssloop.com/gebug/maven-private) * [雕虫晓技(五) 网格分页布局源码解析(上) (付费)](https://xiaozhuanlan.com/topic/5841730926) * [雕虫晓技(六) 网格分页布局源码解析(下) (付费)](https://xiaozhuanlan.com/topic/1456397082) +* [雕虫晓技(七) 用旧Android手机做远程摄像头](http://www.gcssloop.com/gebug/internet-ip-webcam) ****** From 3f9660f2dc2d3dfa0cff8f71e023e73a11306247 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Thu, 9 Aug 2018 23:56:12 +0800 Subject: [PATCH 604/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9426a6f2..2e0481c2 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ * [安卓自定义View进阶 - 特殊形状控件事件处理方案](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B17%5Dtouch-matrix-region.md) * [安卓自定义View进阶 - 多点触控详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B18%5Dmulti-touch.md) * [安卓自定义View进阶 - 手势检测(GestureDetector)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B19%5Dgesture-detector.md) + * [安卓自定义View进阶 - 缩放手势检测(ScaleGestureDetector)](http://www.gcssloop.com/customview/scalegesturedetector) * [ViewSupport - 自定义View工具包](https://github.com/GcsSloop/ViewSupport) From b8f11e46be13169021ef5b1e0eda6a94ac0c6d8b Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 12 Aug 2018 18:48:15 +0800 Subject: [PATCH 605/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2e0481c2..13ce9203 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ * [雕虫晓技(五) 网格分页布局源码解析(上) (付费)](https://xiaozhuanlan.com/topic/5841730926) * [雕虫晓技(六) 网格分页布局源码解析(下) (付费)](https://xiaozhuanlan.com/topic/1456397082) * [雕虫晓技(七) 用旧Android手机做远程摄像头](http://www.gcssloop.com/gebug/internet-ip-webcam) +* [雕虫晓技(八) Android与数据流的斗争](http://www.gcssloop.com/gebug/android-stream) ****** From dcadfe6a877cca993730a3c257720a912c9a7341 Mon Sep 17 00:00:00 2001 From: sloop Date: Mon, 3 Sep 2018 12:17:42 +0800 Subject: [PATCH 606/615] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 13ce9203..4763beca 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ * [雕虫晓技(六) 网格分页布局源码解析(下) (付费)](https://xiaozhuanlan.com/topic/1456397082) * [雕虫晓技(七) 用旧Android手机做远程摄像头](http://www.gcssloop.com/gebug/internet-ip-webcam) * [雕虫晓技(八) Android与数据流的斗争](http://www.gcssloop.com/gebug/android-stream) +* [雕虫晓技(九) Netty与私有协议框架](http://www.gcssloop.com/gebug/netty-private-protocol) ****** From e7719edb6172f54430cc54fd0c32b7ed047043d4 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sun, 9 Sep 2018 18:43:01 +0800 Subject: [PATCH 607/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4763beca..9e46e27d 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ * [雕虫晓技(七) 用旧Android手机做远程摄像头](http://www.gcssloop.com/gebug/internet-ip-webcam) * [雕虫晓技(八) Android与数据流的斗争](http://www.gcssloop.com/gebug/android-stream) * [雕虫晓技(九) Netty与私有协议框架](http://www.gcssloop.com/gebug/netty-private-protocol) +* [雕虫晓技(十) Android超简单气泡效果](http://www.gcssloop.com/gebug/bubble-sample) ****** @@ -109,6 +110,7 @@ ## 开源库 +* [arc-seekbar - 弧形SeekBar](https://github.com/GcsSloop/arc-seekbar) * [encrypt - 加密工具包](https://github.com/GcsSloop/encrypt) * [rclayout - 通用圆角布局](https://github.com/GcsSloop/rclayout) * [FontsManager - 快速替换字体](https://github.com/GcsSloop/FontsManager) From e286b0ea1ade6d366dd5770fead509d28b9e5c57 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 15 Sep 2018 11:17:50 +0800 Subject: [PATCH 608/615] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[01]CustomViewProcess.md | 2 +- CustomView/Base/[03]Color.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CustomView/Advance/[01]CustomViewProcess.md b/CustomView/Advance/[01]CustomViewProcess.md index 5166f06f..70e4a5be 100644 --- a/CustomView/Advance/[01]CustomViewProcess.md +++ b/CustomView/Advance/[01]CustomViewProcess.md @@ -29,7 +29,7 @@ > 例如:制作一个支持自动加载网络图片的ImageView,制作图表等。 -**PS: 自定义View在大多数情况下都有替代方案,利用图片或者组合动画来实现,但是使用后者可能会面临内存耗费过大,制作麻烦更诸多问题。** +**PS: 自定义View在大多数情况下都有替代方案,利用图片或者组合动画来实现,但是使用后者可能会面临内存耗费过大,制作麻烦等诸多问题。** ******* diff --git a/CustomView/Base/[03]Color.md b/CustomView/Base/[03]Color.md index 86d3983c..300b9cc5 100644 --- a/CustomView/Base/[03]Color.md +++ b/CustomView/Base/[03]Color.md @@ -32,7 +32,7 @@ B(Blue) | 蓝色 | 无色 | 蓝色 *其中 A R G B 的取值范围均为0~255(即16进制的0x00~0xff)* -A 从ox00到oxff表示从透明到不透明。 +A 从0x00到0xff表示从透明到不透明。 RGB 从0x00到0xff表示颜色从浅到深。 @@ -131,7 +131,7 @@ PicPick具备了截取全屏、活动窗口、指定区域、固定区域、手 **注意:** -1.这里我们一般把每个通道的取值从0(ox00)到255(0xff)映射到0到1的浮点数表示。 +1.这里我们一般把每个通道的取值从0(0x00)到255(0xff)映射到0到1的浮点数表示。 2.这里等式右边的“绘制的颜色"、“Canvas上的原有颜色”都是经过预乘了自己的Alpha通道的值。如绘制颜色:0x88ffffff,那么参与运算时的每个颜色通道的值不是1.0,而是(1.0 * 0.5333 = 0.5333)。 (其中0.5333 = 0x88/0xff) From 1d7b090581212d2b28c558933e74b829abb6722b Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Sat, 15 Sep 2018 18:01:24 +0800 Subject: [PATCH 609/615] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Advance/[02]Canvas_BasicGraphics.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/CustomView/Advance/[02]Canvas_BasicGraphics.md b/CustomView/Advance/[02]Canvas_BasicGraphics.md index 65720057..60143dc4 100644 --- a/CustomView/Advance/[02]Canvas_BasicGraphics.md +++ b/CustomView/Advance/[02]Canvas_BasicGraphics.md @@ -111,22 +111,22 @@ Canvas我们可以称之为画布,能够在上面绘制各种东西,是安 ****** ### 绘制矩形: -确定一个矩形最少需要四个数据,就是**对角线的两个点**的坐标值,这里一般采用**左上角和右下角**的两个点的坐标。 +我们都知道,确定一个矩形最少需要四个数据,就是**对角线的两个点**的坐标值,这里一般采用**左上角和右下角**的两个点的坐标。 关于绘制矩形,Canvas提供了三种重载方法,第一种就是提供**四个数值(矩形左上角和右下角两个点的坐标)来确定一个矩形**进行绘制。 其余两种是先将矩形封装为**Rect或RectF**(实际上仍然是用两个坐标点来确定的矩形),然后传递给Canvas绘制,如下: ``` java - // 第一种 - canvas.drawRect(100,100,800,400,mPaint); +// 第一种 +canvas.drawRect(100,100,800,400,mPaint); - // 第二种 - Rect rect = new Rect(100,100,800,400); - canvas.drawRect(rect,mPaint); +// 第二种 +Rect rect = new Rect(100,100,800,400); +canvas.drawRect(rect,mPaint); - // 第三种 - RectF rectF = new RectF(100,100,800,400); - canvas.drawRect(rectF,mPaint); +// 第三种 +RectF rectF = new RectF(100,100,800,400); +canvas.drawRect(rectF,mPaint); ``` 以上三种方法所绘制出来的结果是完全一样的。 @@ -192,7 +192,7 @@ Canvas我们可以称之为画布,能够在上面绘制各种东西,是安 ****** ### 绘制椭圆: -相对于绘制圆角矩形,绘制椭圆就简单的多了,因为他只需要一个矩形矩形作为参数: +相对于绘制圆角矩形,绘制椭圆就简单的多了,因为他只需要一个矩形作为参数: ``` java // 第一种 From 40c865975c5fc27987251d44bbd97a6dcdc91c89 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 17 Sep 2018 22:39:34 +0800 Subject: [PATCH 610/615] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[03]Canvas_Convert.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/CustomView/Advance/[03]Canvas_Convert.md b/CustomView/Advance/[03]Canvas_Convert.md index 2e1c8206..4ad9f63f 100644 --- a/CustomView/Advance/[03]Canvas_Convert.md +++ b/CustomView/Advance/[03]Canvas_Convert.md @@ -77,15 +77,15 @@ 缩放比例(sx,sy)取值范围详解: -| 取值范围(n) | 说明 | -| -------- | -------------------------- | -| [-∞, -1) | 先根据缩放中心放大n倍,再根据中心轴进行翻转 | -| -1 | 根据缩放中心轴进行翻转 | -| (-1, 0) | 先根据缩放中心缩小到n,再根据中心轴进行翻转 | -| 0 | 不会显示,若sx为0,则宽度为0,不会显示,sy同理 | -| (0, 1) | 根据缩放中心缩小到n | -| 1 | 没有变化 | -| (1, +∞) | 根据缩放中心放大n倍 | +| 取值范围(n) | 说明 | +| ----------- | ---------------------------------------------- | +| (-∞, -1) | 先根据缩放中心放大n倍,再根据中心轴进行翻转 | +| -1 | 根据缩放中心轴进行翻转 | +| (-1, 0) | 先根据缩放中心缩小到n,再根据中心轴进行翻转 | +| 0 | 不会显示,若sx为0,则宽度为0,不会显示,sy同理 | +| (0, 1) | 根据缩放中心缩小到n | +| 1 | 没有变化 | +| (1, +∞) | 根据缩放中心放大n倍 | 如果在缩放时稍微注意一下就会发现缩放的中心默认为坐标原点,而缩放中心轴就是坐标轴,如下: @@ -181,6 +181,9 @@ 调用两次缩放则 x轴实际缩放为0.5x0.5=0.25 y轴实际缩放为0.5x0.1=0.05 下面我们利用这一特性制作一个有趣的图形。 + +> 注意设置画笔模式为描边(STROKE) + ``` java // 将坐标系原点移动到画布正中心 canvas.translate(mWidth / 2, mHeight / 2); @@ -324,7 +327,7 @@ Y = sy * x + y #### ⑸快照(save)和回滚(restore) -Q: 为什存在快照与回滚
+Q: 为什么存在快照与回滚
A:画布的操作是不可逆的,而且很多画布操作会影响后续的步骤,例如第一个例子,两个圆形都是在坐标原点绘制的,而因为坐标系的移动绘制出来的实际位置不同。所以会对画布的一些状态进行保存和回滚。
From 54c54a385b983cedac66a3cdf8d99248960c3d0b Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 5 Oct 2018 14:41:09 +0800 Subject: [PATCH 611/615] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[05]Path_Basic.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CustomView/Advance/[05]Path_Basic.md b/CustomView/Advance/[05]Path_Basic.md index 41fb94e8..58e9c2d2 100644 --- a/CustomView/Advance/[05]Path_Basic.md +++ b/CustomView/Advance/[05]Path_Basic.md @@ -36,7 +36,7 @@ **请关闭硬件加速,以免引起不必要的问题!
请关闭硬件加速,以免引起不必要的问题!
请关闭硬件加速,以免引起不必要的问题!** -**在AndroidMenifest文件中application节点下添上 android:hardwareAccelerated="false"以关闭整个应用的硬件加速。
更多请参考这里:[Android的硬件加速及可能导致的问题](https://github.com/GcsSloop/AndroidNote/issues/7)** +**在AndroidMainfest文件中application节点下添上 android:hardwareAccelerated="false"以关闭整个应用的硬件加速。
更多请参考这里:[Android的硬件加速及可能导致的问题](https://github.com/GcsSloop/AndroidNote/issues/7)** ## Path作用 本次特地开了一篇详细讲解Path,为什么要单独摘出来呢,这是因为Path在2D绘图中是一个很重要的东西。 @@ -60,10 +60,10 @@ _The Path class encapsulates compound (multiple contour) geometric paths consist 另外路径有开放和封闭的区别。 -| 图像 | 名称 | 备注 | -| ---------------------------------------- | ---- | ------------- | +| 图像 | 名称 | 备注 | +| ------------------------------------------------------------ | -------- | -------------------------- | | ![](http://ww4.sinaimg.cn/thumbnail/005Xtdi2jw1f0zx9g9gggj30f00aiwek.jpg) | 封闭路径 | 首尾相接形成了一个封闭区域 | -| ![](http://ww1.sinaimg.cn/thumbnail/005Xtdi2jw1f0zxg8ilpxj30f00aimx8.jpg) | 开放路径 | 没有首位相接形成封闭区域 | +| ![](http://ww1.sinaimg.cn/thumbnail/005Xtdi2jw1f0zxg8ilpxj30f00aimx8.jpg) | 开放路径 | 没有首尾相接形成封闭区域 | > 这个是我随便画的,仅为展示一下区别,请无视我灵魂画师一般的绘图水准。 From 74d5634da2754aecdcf139975eba8201d6557f64 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Fri, 5 Oct 2018 14:46:42 +0800 Subject: [PATCH 612/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[09]Matrix_Basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[09]Matrix_Basic.md b/CustomView/Advance/[09]Matrix_Basic.md index a78731e1..e3985de3 100644 --- a/CustomView/Advance/[09]Matrix_Basic.md +++ b/CustomView/Advance/[09]Matrix_Basic.md @@ -168,7 +168,7 @@ Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就 ### 后乘(post) -前乘相当于矩阵的左乘: +后乘相当于矩阵的左乘: ![](https://ww3.sinaimg.cn/large/006tKfTcgy1fhe1vta7ooj302s00pq2u.jpg) From 96f6da122c5c254db9bb8843fb897f9025f35582 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Wed, 14 Nov 2018 10:13:45 +0800 Subject: [PATCH 613/615] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9e46e27d..1e8b8821 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ * [安卓自定义View进阶 - 多点触控详解](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B18%5Dmulti-touch.md) * [安卓自定义View进阶 - 手势检测(GestureDetector)](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B19%5Dgesture-detector.md) * [安卓自定义View进阶 - 缩放手势检测(ScaleGestureDetector)](http://www.gcssloop.com/customview/scalegesturedetector) + * [安卓自定义View进阶 - 画笔基础(Paint)](http://www.gcssloop.com/customview/paint-base) * [ViewSupport - 自定义View工具包](https://github.com/GcsSloop/ViewSupport) From 438ffe163abdf9fb64b87467dd6a60864643181b Mon Sep 17 00:00:00 2001 From: ytianhui Date: Tue, 19 Mar 2019 12:04:12 +0800 Subject: [PATCH 614/615] Update [11]Matrix_3D_Camera.md misspell --- CustomView/Advance/[11]Matrix_3D_Camera.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index 0e4c83b6..1c309dae 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -16,7 +16,7 @@ | 基本方法 | save、restore | 保存、 回滚 | | 常用方法 | getMatrix、applyToCanvas | 获取Matrix、应用到画布 | | 平移 | translate | 位移 | -| 旋转 | rotat (API 12)、rotateX、rotateY、rotateZ | 各种旋转 | +| 旋转 | rotate (API 12)、rotateX、rotateY、rotateZ | 各种旋转 | | 相机位置 | setLocation (API 12)、getLocationX (API 16)、getLocationY (API 16)、getLocationZ (API 16) | 设置与获取相机位置 | > Camera的方法并不是特别多,很多内容与之前的讲解的Canvas和Matrix类似,不过又稍有不同,之前的画布操作和Matrix主要是作用于2D空间,而Camera则主要作用于3D空间。 From 40cd93974e33cfb1cfbdecc994ad1baac882ad34 Mon Sep 17 00:00:00 2001 From: GcsSloop Date: Mon, 29 Apr 2019 17:08:41 +0800 Subject: [PATCH 615/615] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomView/Advance/[11]Matrix_3D_Camera.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CustomView/Advance/[11]Matrix_3D_Camera.md b/CustomView/Advance/[11]Matrix_3D_Camera.md index 0e4c83b6..ce0b0d7a 100644 --- a/CustomView/Advance/[11]Matrix_3D_Camera.md +++ b/CustomView/Advance/[11]Matrix_3D_Camera.md @@ -71,7 +71,9 @@ ![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f7q71yek4wg308c058go5.gif) -> 摄像机的位置默认是 (0, 0, -576)。其中 -576= -8 x 72,虽然官方文档说距离屏幕的距离是 -8, 但经过测试实际距离是 -576 像素,当距离为 -10 的时候,实际距离为 -720 像素。不过这个数值72我也不明白是什么东西,我使用了3款手机测试,屏幕大小和像素密度均不同,但结果都是一样的,知道的小伙伴可以告诉我一声。 +> 摄像机的位置默认是 (0, 0, -576)。其中 -576= -8 x 72,虽然官方文档说距离屏幕的距离是 -8, 但经过测试实际距离是 -576 像素,当距离为 -10 的时候,实际距离为 -720 像素。我使用了3款手机测试,屏幕大小和像素密度均不同,但结果都是一样的。 +> +> 这个魔数可以在 Android 底层的图像引擎 Skia 中找到。在 Skia 中,Camera 的位置单位是英寸,英寸和像素的换算单位在 Skia 中被固定为 72 像素,而 Android 中把这个换算单位照搬了过来。