@@ -149,7 +149,7 @@ Picture虽然方法就那么几个,但是具体使用起来还是分很多情
149149 mPicture. draw(canvas);
150150```
151151
152- <img src =" https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawPicture1 .jpg" width = " 300 " />
152+ <img src =" http ://ww1.sinaimg.cn/large/005Xtdi2jw1f2kwz9956lj30u01hcdg9 .jpg" width = " 300 " />
153153
154154** PS:这种方法在比较低版本的系统上绘制后可能会影响Canvas状态,所以这种方法一般不会使用。**
155155
@@ -170,7 +170,7 @@ public void drawPicture (Picture picture, RectF dst)
170170 canvas. drawPicture(mPicture,new RectF (0 ,0 ,mPicture. getWidth(),200 ));
171171```
172172
173- <img src =" https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawPicture2 .jpg" width = " 270 " height = " 480 " />
173+ <img src =" http ://ww4.sinaimg.cn/large/005Xtdi2jw1f2kwzseqawj30u01hc74o .jpg" width = " 300 " />
174174
175175 ** PS:对照上一张图片,可以比较明显的看出,绘制的内容根据选区进行了缩放。 **
176176
@@ -184,7 +184,7 @@ public void drawPicture (Picture picture, RectF dst)
184184 drawable.draw(canvas);
185185```
186186
187- <img src =" https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawPicture3 .jpg" width = " 270 " height = " 480 " />
187+ <img src =" http ://ww3.sinaimg.cn/large/005Xtdi2jw1f2kx0bquw3j30u01hcdg8 .jpg" width = " 300 " />
188188
189189** PS:此处setBounds相当于剪裁显示区域,并非根据该区域进行缩放。**
190190
@@ -266,15 +266,15 @@ PS:图片左上角位置默认为坐标原点。
266266
267267> 关于Matrix和Paint暂时略过吧,一展开又是啰啰嗦嗦一大段,反正挖坑已经是常态了,大家应该也习惯了(PAP).
268268
269- <img src =" https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawBitmap1 .jpg" width = " 270 " height = " 480 " />
269+ <img src =" http ://ww3.sinaimg.cn/large/005Xtdi2jw1f2kx0rjzgmj30u01hcwfc .jpg" width = " 300 " />
270270
271271第二种方法就是在绘制时指定了图片左上角的坐标(距离坐标原点的距离):
272272
273273> ** 注意:此处指定的是与坐标原点的距离,并非是与屏幕顶部和左侧的距离, 虽然默认状态下两者是重合的,但是也请注意分别两者的不同。**
274274``` java
275275 canvas. drawBitmap(bitmap,200 ,500 ,new Paint ());
276276```
277- <img src =" https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawBitmap2 .jpg" width = " 270 " height = " 480 " />
277+ <img src =" http ://ww3.sinaimg.cn/large/005Xtdi2jw1f2kx1f34a4j30u01hcgmn .jpg" width = " 300 " />
278278
279279第三种方法比较有意思,上面多了两个矩形区域(src,dst),这两个矩形选区是干什么用的?
280280
@@ -297,38 +297,39 @@ Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域
297297 // 绘制图片
298298 canvas. drawBitmap(bitmap,src,dst,null );
299299```
300- <img src =" https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawBitmap3 .jpg" width = " 270 " height = " 480 " />
300+ <img src =" http ://ww2.sinaimg.cn/large/005Xtdi2jw1f2kx1ygdmwj30u01hct9m .jpg" width = " 300 " />
301301
302302** 详解:**
303303
304304上面是以绘制该图为例,用src指定了图片绘制部分的区域,即下图中红色方框标注的区域。
305305
306- ![ ] ( https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawBitmap4 .jpg)
306+ ![ ] ( http ://ww1.sinaimg.cn/large/005Xtdi2jw1f2kx2daw1qj305k05kq39 .jpg)
307307
308308然后用dst指定了绘制在屏幕上的绘制,即下图中蓝色方框标注的区域,图片宽高会根据指定的区域自动进行缩放。
309- <img src =" https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawBitmap5.jpg " width = " 270 " height = " 480 " />
309+
310+ <img src =" http://ww2.sinaimg.cn/large/005Xtdi2jw1f2kx38lolnj30u01hcjs6.jpg " width = " 300 " />
310311
311312从上面可知,第三种方法可以绘制图片的一部分到画布上,这有什么用呢?
312313
313314如果你看过某些游戏的资源文件,你可能会看到如下的图片(图片来自网络):
314315
315- ![ ] ( https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawBitmap6.png )
316+ ![ ] ( http ://ww4.sinaimg.cn/large/005Xtdi2jw1f2kx3lk1ucj30kg04omz7.jpg )
316317
317318用一张图片包含了大量的素材,在绘制的时候每次只截取一部分进行绘制,这样可以大大的减少素材数量,而且素材管理起来也很方便。
318319
319320然而这和我们有什么关系呢?我们又不做游戏开发。
320321
321- 确实,我们不做游戏开发,但是在某些时候我们需要制作一些炫酷的效果,这些效果因为太复杂了用代码很难实现或者渲染效率不高。这时候很多人就会想起帧动画,将动画分解成一张一张的图片然后使用帧动画制作出来,这种实现方式的确比较简单,但是一个动画效果的图片有十几到几十张,一个应用里面来几个这样炫酷的动画效果就会导致资源文件出现一大堆,想找其中的某一张资源图片简直就是灾难啊有木有。但是把同一个动画效果的所有资源图片整理到一张图片上,会大大的减少资源文件数量 ,方便管理,妈妈再也不怕我找不到资源文件了。
322+ 确实,我们不做游戏开发,但是在某些时候我们需要制作一些炫酷的效果,这些效果因为太复杂了用代码很难实现或者渲染效率不高。这时候很多人就会想起帧动画,将动画分解成一张一张的图片然后使用帧动画制作出来,这种实现方式的确比较简单,但是一个动画效果的图片有十几到几十张,一个应用里面来几个这样炫酷的动画效果就会导致资源文件出现一大堆,想找其中的某一张资源图片简直就是灾难啊有木有。但是把同一个动画效果的所有资源图片整理到一张图片上,会大大的 ** 减少资源文件数量 ,方便管理** ,妈妈再也不怕我找不到资源文件了, ** 同时也节省了图片文件头、文件结束块以及调色板等占用的空间。 **
322323
323324** 下面是利用drawBitmap第三种方法制作的一个简单示例:**
324325
325326资源文件如下:
326327
327- ![ ] ( https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/checkres.png )
328+ ![ ] ( http ://ww1.sinaimg.cn/large/005Xtdi2jw1f2kx6kpukaj310402sglr.jpg )
328329
329330最终效果如下:
330331
331- ![ ] ( https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/checkview .gif)
332+ ![ ] ( http ://ww1.sinaimg.cn/large/005Xtdi2jw1f2kx67fkkog306g0b43yn .gif)
332333
333334源码如下:
334335
@@ -396,7 +397,7 @@ Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域
396397 // 参数分别为 (文本 x轴坐标 y轴坐标 画笔)
397398 canvas. drawText(str,200 ,500 ,textPaint);
398399```
399- <img src =" https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawText1 .jpg" width = " 270 " height = " 480 " />
400+ <img src =" http ://ww2.sinaimg.cn/large/005Xtdi2jw1f2kx7r1l6ej30u01hct9i .jpg" width = " 300 " />
400401
401402当然啦,除了能指定绘制文本的起始位置,还能只取出文本中的一部分内容进行绘制。
402403
@@ -419,7 +420,7 @@ Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域
419420 // 参数分别为 (字符串 开始截取位置 结束截取位置 x轴坐标 y轴坐标 画笔)
420421 canvas. drawText(str,1 ,3 ,200 ,500 ,textPaint);
421422```
422- <img src =" https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawText2 .jpg" width = " 270 " height = " 480 " />
423+ <img src =" http ://ww2.sinaimg.cn/large/005Xtdi2jw1f2kx8aclfhj30u01hct9g .jpg" width = " 300 " />
423424
424425另外,对于字符数组char[ ] 我们截取字符串使用起始位置(index)和长度(count)来确定。
425426
@@ -433,7 +434,7 @@ Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域
433434 // 参数为 (字符数组 起始坐标 截取长度 x轴坐标 y轴坐标 画笔)
434435 canvas. drawText(chars,1 ,3 ,200 ,500 ,textPaint);
435436```
436- <img src =" https ://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawText3 .jpg" width = " 270 " height = " 480 " />
437+ <img src =" http ://ww1.sinaimg.cn/large/005Xtdi2jw1f2kx8w1dcmj30u01hc0th .jpg" width = " 300 " />
437438
438439### 第二类(drawPosText)
439440
@@ -453,20 +454,23 @@ Rect dst 或RectF dst | 指定图片在屏幕上显示(绘制)的区域
453454 500 ,500
454455 },textPaint);
455456```
456- <img src =" https://github.com/GcsSloop/AndroidNote/blob/master/%E9%97%AE%E9%A2%98/Canvas/Art3/drawText4.jpg " width = " 270 " height = " 480 " />
457+
458+ <img src =" http://ww2.sinaimg.cn/large/005Xtdi2jw1f2kx9fl8c8j30u01hcglz.jpg " width = " 300 " />
457459
458460不过嘛,虽然虽然这个方法也比较容易理解,但是关于这个方法我个人是不推荐使用的,因为坑比较的,主要有一下几点:
459461
460462序号 | 反对理由
461- --- | ---
462- 1 | 必须指定所有字符位置,否则直接crash掉,反人类设计
463- 2 | 性能不佳,在大量使用的时候可能导致卡顿
464- 3 | 不支持emoji等特殊字符,不支持字形组合与分解
463+ -----|------------------- ---
464+ 1 | 必须指定所有字符位置,否则直接crash掉,反人类设计
465+ 2 | 性能不佳,在大量使用的时候可能导致卡顿
466+ 3 | 不支持emoji等特殊字符,不支持字形组合与分解
465467
466468关于第二类的第二种方法:
469+
467470``` java
468471public void drawPosText (char [] text, int index, int count, float [] pos, Paint paint)
469472```
473+
470474和上面一样,就是从字符数组中切出来一段进行绘制,相信以诸位看官的聪明才智一眼就看出来了,我这里就不多说了,真的不是我偷懒啊(ˉ▽ ̄~) ~~
471475
472476### 第三类(drawTextOnPath)
@@ -477,13 +481,13 @@ public void drawPosText (char[] text, int index, int count, float[] pos, Paint p
477481
478482学会了图片和文字绘制,对于大部分自定义View都能制作了,可以去看看这位大神制作的作品,尝试模仿一下[ 一个绚丽的loading动效分析与实现!] ( http://blog.csdn.net/tianjian4592/article/details/44538605 )
479483
480- ![ ] ( http://img.blog.csdn.net/20150322173842391?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGlhbmppYW40NTky/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center )
484+ ![ ] ( http://ww4.sinaimg.cn/large/005Xtdi2jw1f2kxbki0wtg308c069mzr.gif )
481485
482486(,,• ₃ •,,)
483487
484488<b >PS: 由于本人英文水平有限,某些地方可能存在误解或词语翻译不准确,如果你对此有疑问可以提交Issues进行反馈。</b >
485489
486- # 四. 参考资料
490+ # 参考资料
487491
488492[ Canvas] ( http://developer.android.com/reference/android/graphics/Canvas.html ) <br />
489493[ Bitmap] ( http://developer.android.com/reference/android/graphics/Bitmap.html ) <br />
0 commit comments