11.4.3  高级画布绘图(3)

DashPathEffect  可以使用DashPathEffect来创建一个虚线的轮廓(短横线/小圆点),而不是使用实线。你还可以指定任意的虚/实线段的重复模式。

DiscretePathEffect  与DashPathEffect相似,但是添加了随机性。当绘制它的时候,需要指定每一段的长度和与原始路径的偏离度。

PathDashPathEffect  这种效果可以定义一个新的形状(路径)并将其用作原始路径的轮廓标记。

下面的效果可以在一个Paint中组合使用多个Path Effect。

SumPathEffect  顺序地在一条路径中添加两种效果,这样每一种效果都可以应用到原始路径中,而且两种结果可以结合起来。

ComposePathEffect  将两种效果组合起来应用,先使用第一种效果,然后在这种效果的基础上应用第二种效果。

对象形状的PathEffect的改变会影响到形状的区域。这就能够保证应用到相同形状的填充效果将会绘制到新的边界中。

使用setPathEffect方法可以把PathEffect应用到Paint对象中,如下所示:

  1. borderPaint.setPathEffect(new CornerPathEffect(5));

PathEffect API示例给出了如何应用每一种效果的指导说明。

修改Xfermode

可以通过修改Paint的Xfermode来影响在Canvas已有的图像上面绘制新的颜色的方式。

在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状。如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;如果它是部分透明的,那么它将会被染上下面的颜色。

下面的Xfermode子类可以改变这种行为:

AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。

PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作。

PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。

要应用转换模式,可以使用setXferMode方法,如下所示:

  1. AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);
  2. borderPen.setXfermode(avoid);

3. 使用抗锯齿效果提高Paint质量

在绘制一个新的Paint对象时,可以通过传递给它一些标记来影响它被渲染的方式。ANTI_ALIAS_FLAG是其中一种很有趣的标记,它可以保证在绘制斜线的时候使用抗锯齿效果来平滑该斜线的外观。

在绘制文本的时候,抗锯齿效果尤为重要,因为经过抗锯齿效果处理之后的文本非常容易阅读。要创建更加平滑的文本效果,可以应用SUBPIXEL_TEXT_FLAG,它将会应用子像素抗锯齿效果。

也可以手工地使用setSubpixelText和setAntiAlias方法来设置这些标记,如下所示:

  1. myPaint.setSubpixelText(true);
  2. myPaint.setAntiAlias(true);

4. 2D图形的硬件加速

在当前这个到处都是2D图形爱好者的时代,Android允许你使用硬件加速来渲染你的应用程序。

如果设备可以使用硬件加速,那么通过设置这个标记可以让活动中的每一个View都能使用硬件渲染。尽管减少了系统处理程序的负载,但在极大地提高了图像处理速度的同时,硬件加速也带来了相应的负面效果。

使用requestWindowFeature方法,可以在你的活动中应用Window.FEATURE_OPENGL标记来打开硬件加速,如下所示:

  1. myActivity.requestWindowFeature(Window.FEATURE_OPENGL);

遗憾的是,天上不会掉馅饼,这次也不例外。

并不是Android中所有的2D绘图基本图形都被硬件支持(特别是前面描述的大部分PathEffect)。

与此同时,由于整个活动实际上是作为一个Canvas进行渲染的,所以对任何View的无效请求都将会导致整个活动被重新绘制。

5. Canvas绘图最佳实践经验

2D自绘操作是非常耗费处理程序资源的;低效的绘图方法会阻塞GUI线程,并且会对应用程序的响应造成不利的影响。对于那些只有一个处理程序的资源受限的环境来说,这一点就更加现实了。

这里需要注意onDraw方法的资源消耗以及CPU周期的耗费,这样才能保证不会把一个看起来很吸引人的应用程序变得完全没有响应。

目前有很多技术可以帮助将与自绘控件相关的资源消耗最小化。我们关心的不是一般的原则,而是某些Android特定的注意事项,从而保证你可以创建外观时尚、而且能够保持交互的活动(注意,以下这个列表并不完整):

考虑硬件加速  OpenGL硬件加速对2D图形的支持是非常好的,所以你总是应该考虑它是否适合你的活动。另一种比较优秀的方法是只用一个单独的View和迅速的、耗时的更新来组成活动。一定要保证你使用的基本图形能够被硬件支持。

考虑大小和方向  当在设计View和布局的时候,一定要保证考虑(和测试)它们在不同的分辨率和大小下的外观。

只创建一次静态对象  在Android中对象的创建是相当昂贵的。因此,在可能的地方,应用只创建一次像Paint对象、Path和Shader这样的绘图对象,而不是在View每次无效的时候都重新创建它们。

记住onDraw是很消耗资源的  执行onDraw方法是很消耗资源的处理,它会强制Android执行多个图片组合和位图构建操作。下面有几点建议可以让你修改Canvas的外观,而不用重新绘制它:

使用Canvas转换  可以使用像rotate和translate这样的转换,来简化Canvas中元素复杂的相关位置。例如,相比放置和旋转一个表盘周围的每一个文本元素,你可以简单地将canvas旋转22.5?,然后在相同的位置绘制文本。

使用动画  可以考虑使用动画来执行View的预设置的转换,而不是手动地重新绘制它。在活动的View中可以执行缩放、旋转和转换动画,并可以提供一种能够有效利用资源的方式来提供缩放、旋转或者抖动效果。

考虑使用位图和9 Patch  如果View使用了静态背景,那么你应该考虑使用一个图片,如位图或者9 patch,而不是手动地重新绘制。

6. 高级指南针表盘的例子

在第4章中,已经创建了一个简单的指南针。而在上一章,你又回到了这个例子,对它进行了扩展从而使它够使用加速计硬件来显示横向和纵向方向。

那些例子中的UI都很简单,从而保证了那些章节中的代码都尽可能地清晰。

在下面的例子中,将对CompassView的onDraw方法做一些重要的改动,从而把它从一个简单的、平面的指南针,变成一个动态的航空地平仪(artificial horizon ),如图11-2所示。

 
图11-2

转载于:https://www.cnblogs.com/zsw-1993/archive/2012/09/25/4880853.html

android 高级画布绘图相关推荐

  1. Android高级进阶——绘图篇(五)setXfermode 设置混合模式

    一.GPU硬件加速 1.概述 GPU英文全称Graphic Processing Unit,中文翻译为"图形处理器".与CPU不同,GPU是专门为处理图形任务而产生的芯片. 在GP ...

  2. Android 高级UI解密 (三) :Canvas裁剪 与 二维、三维Camera几何变换(图层Layer原理)

    Android的绘图机制是核心内容之一,无论是什么样的功能最终都是以图像的形式呈现给用户.因此掌握Android的绘图技巧,有助于Android理解层次的提高,在面对产品经理提出的idea时也更有底气 ...

  3. java安卓布局与画布_Android 画布绘图

    我们已经介绍了Canvas,在那里,已经学习了如何创建自己的View.在第7章中也使用了Canvas来为MapView标注覆盖. 画布(Canvas)是图形编程中一个很普通的概念,通常由三个基本的绘图 ...

  4. Android高级终端开发学习笔记(《疯狂Android讲义》第11章-第17章)

    Android高级终端开发笔记 2021/6/19 下午 13:34开始 多媒体应用开发 Android支持的音频格式有:MP3 WAV 3GP等.支持的视频格式有MP4 3GP等. 多媒体数据既可以 ...

  5. Android 高级UI解密 (二) :Paint滤镜 与 颜色过滤(矩阵变换)

    若是曾经查看过系统UI的源码, 会发现其中使用了一些渲染效果,例如将图片加上黑白.怀旧的效果,生活中常用的逆天美颜相机,其中的原理就是使用了滤镜效果.颜色通道过滤.若还要深究其原理组成,便涉及到了高等 ...

  6. android高级编程-android高级应用

    android高级应用>>> 第一阶段 程序员基本素质养成 程序员所需要具备的12条职业素质 让学员初步了解和审视自己所应该具备的职业素质.并且我们会在授课中随时训练和贯彻这样的素质 ...

  7. 如何学习android高级编程

    学了android高级编程有前途吗?进入2010年之后,android的应用开发进入了一个爆炸式增长的状态,从去年的不到1万款应用程序增加到现在的9万,而且即将突破10万,这也从开发者这一方面展现了用 ...

  8. Android高级大纲

    2019独角兽企业重金招聘Python工程师标准>>> 1.Android高级UI开发 Android高级UI开发.png 2.Android性能优化 Android性能优化.png ...

  9. 耗时118天爆肝【1296页】的“Android高级开发面试题”,终于成功上岸字节

    前言 本人16年毕业于一家普通二本,考研裂开了且没有实习经验,只做过两个项目,每天就是不断地投简历.刷面经,感觉自己都要抑郁了,最后勉强进入了一家学校合作的互联网公司,后面陆陆续续也换了几家公司,毕业 ...

最新文章

  1. js string转number_Node.js 和 C++ 之间的类型转换
  2. python leetcode_leetcode 刷题经验,主力 python
  3. Facebook陷入史上最大危机;华为5G设备欧洲大卖,美国指责欧盟;红帽宣布OpenShift可用于AWS中国……...
  4. idea报Can’t Open Local Terminal
  5. 基础编程题之牛客网星际密码
  6. Codeforces Round #182 (Div. 1)题解【ABCD】
  7. usb 测试软件,usb端口测试(USB端口测试工具)
  8. 20165318 2017-2018-2《Java程序设计》课程总结
  9. 2018年全国多校算法寒假训练营练习比赛(第三场)I 三角形【皮克公式+gcd】
  10. 天池学习赛:保险反欺诈预测(附代码)
  11. ffmpeg实现视频实时动态时间水印
  12. Ubuntu和windows之间复制粘贴,遇到无法安装Vmware-tools
  13. 哈佛大学计算机专业研究生排名,2019USnews美国大学ece研究生专业新排名诞生
  14. MATLAB去读网页源码时中文乱码
  15. Maven从入门到放弃
  16. 01 二叉树的BFS(广度、层次或水平遍历实现)【Binary Tree 二叉树】
  17. 企业BI工具实现库存周转率分析
  18. 高校物资采购管理系统
  19. winfrom ListBox 控件拖动滚动条闪烁
  20. APICloud AVM框架开发消防检查助手APP

热门文章

  1. 选择company回显appname
  2. 两个input在一行让它们能对齐
  3. sqlserver字段选择参照
  4. Sql查询一个列对应多个列
  5. js高级编程中命名空间的两种用法
  6. [译] Facebook杯2013年编程挑战赛——第一轮题目及答案
  7. Linux - MiniFtp实现
  8. BIM技术在地铁中应用
  9. 零日漏洞迟迟未补上:扫描发现超85万思科设备受影响
  10. 【1】ASP.NET异步(1)