Skip to content

Commit 9144509

Browse files
committed
Update
1 parent e0710fb commit 9144509

1 file changed

Lines changed: 27 additions & 20 deletions

File tree

CustomView/Advance/[2]Canvas_BasicGraphics.md

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放
130130
```
131131
以上三种方法所绘制出来的结果是完全一样的。
132132

133-
<img src="https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art/drawRect.jpeg" width = "270" height = "480" alt="title" align=center />
133+
<img src="http://ww2.sinaimg.cn/large/005Xtdi2jw1f27478692dj30u01hc3yy.jpg" width = "300" />
134134

135135
看到这里,相信很多观众会产生一个疑问,<b>为什么会有Rect和RectF两种?两者有什么区别吗?</b>
136136

@@ -150,7 +150,7 @@ Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放
150150
```
151151
上面两种方法绘制效果也是一样的,但鉴于第二种方法在API21的时候才添加上,所以我们一般使用的都是第一种。
152152

153-
<img src="https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art/drawRoundRect1.jpeg" width = "270" height = "480" alt="title" align=center />
153+
<img src="http://ww4.sinaimg.cn/large/005Xtdi2jw1f2747s3c5zj30u01hcq3e.jpg" width = "300" />
154154

155155
下面简单解析一下圆角矩形的几个必要的参数的意思。
156156

@@ -165,7 +165,7 @@ Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放
165165

166166
好吧,让你发现了,**这里圆角矩形的角实际上不是一个正圆的圆弧,而是椭圆的圆弧,这里的两个参数实际上是椭圆的两个半径**,他们看起来个如下图:<br/>
167167

168-
![](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art/RoundRect.png)
168+
![](http://ww3.sinaimg.cn/large/005Xtdi2jw1f2748fjw2bj308c0dwmx8.jpg)
169169

170170
在此图之中,外部灰色的矩形表示我们确定的矩形,而用红色圈住的 A、B 两个点是我们用来确定这个矩形的两个重要参数, 而用红线标注的 rx 与 ry 就是两个半径,也就是相比绘制矩形多出来的那两个参数。
171171

@@ -184,15 +184,16 @@ Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放
184184
canvas.drawRoundRect(rectF,700,400,mPaint);
185185
```
186186

187-
<img src="https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art/drawRoundRect3.jpeg" width = "270" height = "480" alt="title" align=center />
187+
<img src="http://ww4.sinaimg.cn/large/005Xtdi2jw1f2748ugy2pj30u01hcwf1.jpg" width = "300" />
188188

189189
其中灰色部分是我们所选定的矩形,而里面的圆角矩形则变成了一个椭圆,<b>实际上在rx为宽度的一半,ry为高度的一半时,刚好是一个椭圆,通过上面我们分析的原理推算一下就能得到,而当rx大于宽度的一半,ry大于高度的一半时,实际上是无法计算出圆弧的,所以drawRoundRect对大于该数值的参数进行了限制(修正),凡是大于一半的参数均按照一半来处理。</b>
190190

191191

192192
******
193193

194194
### 绘制椭圆:
195-
相对于绘制圆角矩形,绘制椭圆就简单的多了,因为他只需要一个矩形就能绘制出一个与矩形内切的椭圆。
195+
相对于绘制圆角矩形,绘制椭圆就简单的多了,因为他只需要一个矩形矩形作为参数:
196+
196197
``` java
197198
// 第一种
198199
RectF rectF = new RectF(100,100,800,400);
@@ -203,23 +204,23 @@ Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放
203204
```
204205
同样,以上两种方法效果完全一样,但一般使用第一种。
205206

206-
<img src="https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art/drawOval.jpeg" width = "270" height = "480" alt="title" align=center />
207+
<img src="http://ww2.sinaimg.cn/large/005Xtdi2jw1f274afxbiyj30u01hczks.jpg" width = "300" />
207208

208-
绘制椭圆实际上就是绘制一个矩形调度内切椭圆,原理如下,就不多说了:
209+
绘制椭圆实际上就是绘制一个矩形的内切图形,原理如下,就不多说了:
209210

210-
![](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art/Oval.png)
211+
![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f274bq1h4rj308c0dwjrl.jpg)
211212

212213
PS: 如果你传递进来的是一个长宽相等的矩形(即正方形),那么绘制出来的实际上就是一个圆。
213214

214215
******
215216
### 绘制圆:
216-
绘制圆形比较简单,因为圆形只需要圆心和半径,如下:
217+
绘制圆形也比较简单,因为圆形只需要圆心和半径,如下:
217218
```
218219
canvas.drawCircle(500,500,400,mPaint); // 绘制一个圆心坐标在(500,500),半径为400 的圆。
219220
```
220221
绘制圆形有四个参数,前两个是圆心,第三个是半径,最后一个是画笔。
221222

222-
<img src="https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art/drawCircle.jpeg" width = "270" height = "480" alt="title" align=center />
223+
<img src="http://ww3.sinaimg.cn/large/005Xtdi2jw1f274c41kknj30u01hcdgf.jpg" width = "300" />
223224

224225
******
225226
### 绘制圆弧:
@@ -262,9 +263,9 @@ useCenter // 是否使用中心
262263
```
263264
上述代码实际上是绘制了一个起始角度为0度,扫过90度的圆弧,两者的区别就是是否使用了中心点,结果如下:
264265

265-
<img src="https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art/drawArc1.jpeg" width = "270" height = "480" alt="title" align=center />
266+
<img src="http://ww4.sinaimg.cn/large/005Xtdi2jw1f274d1smwej30u01hc3z4.jpg" width = "300" />
266267

267-
可以发现使用了中心点之后绘制出来类似于一个扇形,而不使用中心点则是圆弧起始点和结束点之间的连线加上圆弧围成的图形。这样中心点这个参数的作用就很明显了,不必多说想必大家试一下就明白了。 另外可以关于角度可以参考一下这篇: [角度与弧度](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/%E8%A7%92%E5%BA%A6%E4%B8%8E%E5%BC%A7%E5%BA%A6/%E8%A7%92%E5%BA%A6%E4%B8%8E%E5%BC%A7%E5%BA%A6.md)
268+
可以发现使用了中心点之后绘制出来类似于一个扇形,而不使用中心点则是圆弧起始点和结束点之间的连线加上圆弧围成的图形。这样中心点这个参数的作用就很明显了,不必多说想必大家试一下就明白了。 另外可以关于角度可以参考一下这篇: [角度与弧度](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView%2FBase%2F%5B2%5DAngleAndRadian.md)
268269

269270
相比于使用椭圆,我们通常还是使用正圆比较多的,使用正圆展示一下效果:
270271
```
@@ -288,13 +289,14 @@ useCenter // 是否使用中心
288289
mPaint.setColor(Color.BLUE);
289290
canvas.drawArc(rectF2,0,90,true,mPaint);
290291
```
291-
<img src="https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art/drawArc2.jpeg" width = "270" height = "480" alt="title" align=center />
292+
<img src="http://ww2.sinaimg.cn/large/005Xtdi2jw1f274e3surgj30u01hc3z4.jpg" width = "300" />
292293

293294
******
294295
### 简要介绍Paint
296+
295297
看了上面这么多,相信有一部分人会产生一个疑问,如果我想绘制一个圆,只要边不要里面的颜色怎么办?
296298

297-
很简单,在一开始我们就说过,绘制的<b>基本形状</b>由<b>Canvas</b>确定,但绘制出来的<b>颜色,具体效果</b>则由<b>Paint</b>确定
299+
很简单,绘制的**基本形状由Canvas确定**,但绘制出来的**颜色,具体效果则由Paint确定**
298300

299301
如果你注意到了的话,在一开始我们设置画笔样式的时候是这样的:
300302
``` java
@@ -325,11 +327,11 @@ FILL_AND_STROKE //描边加填充
325327
canvas.drawCircle(200, 800, 100, paint);
326328
```
327329

328-
<img src="https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art/paintStyle.jpeg" width = "270" height = "480" alt="title" align=center />
330+
<img src="http://ww4.sinaimg.cn/large/005Xtdi2jw1f274g6lxbpj30u01hcq3n.jpg" width = "300" />
329331

330332
一图胜千言,通过以上实验我们可以比较明显的看出三种模式的区别,如果只需要边缘不需要填充内容的话只需要设置模式为描边(STROKE)即可。
331333

332-
其实关于Paint的内容也是有不少的,这些只是冰山一角,在以后会详细的讲解Paint内容
334+
其实关于Paint的内容也是有不少的,这些只是冰山一角,在后续内容中会详细的讲解Paint
333335

334336
******
335337
## 小示例
@@ -346,7 +348,7 @@ rotate | 旋转
346348
### 制作一个饼状图
347349
在展示百分比数据的时候经常会用到饼状图,像这样:
348350

349-
![](https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art/pie.png)
351+
![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f274gmnlk3j308c0dwglq.jpg)
350352

351353
### 简单分析
352354
其实根据我们上面的知识已经能自己制作一个饼状图了。不过制作东西最重要的不是制作结果,而是制作思路。
@@ -495,18 +497,23 @@ PS: 其中在更改了数据需要重绘界面时要调用invalidate()这个函
495497

496498
### 效果图
497499

498-
<img src="https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art/pieView.jpeg" width = "270" height = "480" alt="title" align=center />
500+
<img src="http://ww4.sinaimg.cn/large/005Xtdi2jw1f274gz06voj30u01hc3za.jpg" width = "300" />
499501

500502

501503
## 总结:
502504
本次偷懒了一点,最后的饼状图并没有绘制完整,以后会补上未完成的部分的。
503505

504506
其实自定义View只要按照流程一步步的走,还是比较容易的。不过里面自然也是有不少坑的,这个坑还是自己踩过印象会比较深,建议大家不要直接copy源码,自己亲手写一遍体验一下。
505-
507+
508+
## About Me
509+
### 作者微博: <a href="http://weibo.com/GcsSloop" target="_blank">@GcsSloop</a>
510+
511+
<a href="https://github.com/GcsSloop/SloopBlog/blob/master/FINDME.md" target="_blank"> <img src="http://ww4.sinaimg.cn/large/005Xtdi2gw1f1qn89ihu3j315o0dwwjc.jpg" width=300/> </a>
512+
506513
## 参考资料:
507514

508515
[View](http://developer.android.com/reference/android/view/View.html)<br/>
509516
[Canvas](http://developer.android.com/reference/android/graphics/Canvas.html)<br/>
510517
[Android Canvas绘图详解](http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html)<br/>
511518

512-
519+
<br/><br/><br/><br/><br/>

0 commit comments

Comments
 (0)