`
mmdev
  • 浏览: 12893936 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

android图形系统详解五:Android绘制模式

 
阅读更多

  当硬加速被启用,Android框架利用一个新的绘制模式来把你的应用呈现到屏幕,这个模式利用了一个显示列表.要完全理解显示列表以及它如何影响你的应用,先要理解android如何在非硬加速下绘制View.下面的小节描述了软加速的和硬加速的绘制models.

软件绘制模式

  在软件绘制模式,view按以下两步进行绘制:

  • 1使整个View层级都变得无效

  • 2绘制所有的View层级



  任何时候一个应用需要更新部分UI时,它应在任何改变了内容的View上调用invalidate()(或它的任一变体),使界面无效的消息在整个View层级中传播以计算应被绘制的屏幕区域(脏区域).之后Android系统绘任View层级中所有与脏区域有交集的View. 不幸的是,这种绘制模式有两个缺点:

  • 第一,这个模式需要在每个绘制路径中都执行很多代码.比如,如果你的应用在一个button上调用了invalidate()并且这个button位于另一个view之上,即使这个View没有变化,Android系统也会绘制这个View

  • 第二个问题是这个绘制模式可能隐藏你应用中的bug.因为Android系统会绘制与脏区域有交集的view,那么一个你改变了内容的view可能在没有被调用invalidate()时也会被重绘了.当这种情况发生时,你只能依赖那个需要重绘的view来获得正确的行为.但这个行为可能在你每次修改你的应用时都会改变.因此,在任何你修改了数据或状态而影响到绘制代码的时候,你总是应该在你的自定义view上调用invalidate()



  注:Androidview们会在它们的属性被改变时自动调用invalidate(),比如一个TextView的背景和文本改变时.

硬加速绘制模式

  Android系统依然使用invalidate()draw()来请求屏幕更新并画出views,但是对实际的绘制处理却不一样.现在不是在收到绘制命令立即执行了,而是Android系统把绘制命令记录到显示列表中,这个列表中包含了View层级的绘制代码的输出.另一个优化是Android系统只需为那些通过invalidate()标记为脏的View记录和更新显示列表.没有被invalidatedViews可以简单地使用先前的显示列表中的记录进行重绘.新的绘制模式包含三个阶段:

  • 1使整个View层级都无效

  • 2记录并更新显示列表

  • 3画显示列表



  使用此模式,你再不能依靠让View与脏区域交界而使它的draw()方法被调用.要保证Android系统记录下view的显示列表,你必须调用invalidate().忘记这样做会导致一个view总是一个模样,即使改变了它.但这是一个很容易被找出的bug



  使用显示列表还对提升动画性能有益,因为设置了某个属性,比如alpharotation等,不再需invalidating目标view(自动做了).这个优化也会应用到拥有显示列表的view(当你的应用被硬加速时的任何view).例如,假设有一个LinearLayout包含了一个ListView一个ButtonListView位于Button之上,LinearLayout的显示列表看起来如下:

  • DrawDisplayList(ListView)

  • DrawDisplayList(Button)

  假设现在你想改变ListViewopacity,在调用了ListViewsetAlpha(0.5f)后,显示列表现在包含如下项:

  • SaveLayerAlpha(0.5)

  • DrawDisplayList(ListView)

  • Restore

  • DrawDisplayList(Button)



  ListView复杂的绘制过程没有被执行,而是仅更新了更简单的LinearLayout的显示列表.如果在一个未硬加速的应用中,列表和它爹的绘制代码都会被重新执行.

不支持的绘制操作

  当启用了硬加速,2D呈现管道会支持通用的Canvas绘制操作,也支持不常用的操作.所有的绘制操作被用来呈现widgetslayouts以及通用高级视觉效果,比如反光和平铺纹理.下面的列表描述了已知的不能被硬加速支持的绘制操作:

  • Canvas

    • clipPath()

    • clipRegion()

    • drawPicture()

    • drawPosText()

    • drawTextOnPath()

    • drawVertices()

  • Paint

    • setLinearText()

    • setMaskFilter()

    • setRasterizer()



  另外,还有一些操作的行为在启用硬加速后会变得不一样:

  • Canvas

    • clipRect():异或,差异和反差异剪切都被忽略.3D变换不应用到剪切框中

    • drawBitmapMesh():颜色数组被忽略

    • drawLines():反锯齿不被支持

    • setDrawFilter():可以设置,但被忽略

  • Paint

    • setDither():被忽略

    • setFilterBitmap():滤镜一直启用

    • setShadowLayer():仅对文本起作用

  • ComposeShader

    • ComposeShader只能包含不同类型的着色器(比如一个BitmapShader和一个LinearGradient,不能是两个BitmapShader)

    • ComposeShader不能包含ComposeShader



  如果你的应用被这些缺少的特性或限制影响了,你可以通过调用setLayerType(View.LAYER_TYPE_SOFTWARE,null)为受影响的部分关闭硬加速.用此方法,你依然可以在其它地方享用到硬加速.




分享到:
评论

相关推荐

    Android Path 解析 绘制各种图形

    Android Path 解析 绘制各种图形

    Android应用开发详解

    Android中的图形图像,讲述了Android中的图片、动画、图形绘制和图形特效 第13章 Android中的互联网应用 Android中的互联网应用,讲述了Android中的各种网络应用,包括Socket、URL、HTTP、Web Service和WebView...

    Android开发 OpenGL ES绘制3D 图形实例详解

    主要介绍了Android开发 OpenGL ES绘制3D 图形实例详解的相关资料,需要的朋友可以参考下

    Android shape 绘制图形的实例详解

    Android shape 绘制图形 Android 绘制图形可以使用shape也可以使用自定义控件的方式,这里我们说下shape的方式去实现。 在绘制图形之前,我们先来了解下shape的几个属性。 shape /* * 线行 圆形 矩形 / android:...

    Android开发应用实战详解源代码

    7.2 绘制几何图形 7.3 手机屏保 7.4 照片拖动效果 7.5 存储卡中的图片 7.6 获取内置媒体文件 7.7 调节音量 7.8 播放mp3资源文件 7.9 录制音频 7.10 实现相机拍照功能 7.10.1 实现原理 7.10.2 编程思想 7.10.3 具体...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    12.3、绘制2D图形: 12.4、绘制3D图形: 第13章、Android的网络应用 13.1、基于TCP协议的网络通信(套接字Socket):Socket; ServerSocket; 13.2、使用URL访问网络资源:URL; URLConnection; 13.3、使用HTTP访问...

    《Android自定义组件开发详解》

    4.4.5 图形绘制 113 4.4.6 绘图区 118 4.4.7 主界面 119 4.5 练习作业 122 第五章 阴影、渐变和位图运算 123 5.1 概述 123 5.2 阴影 123 5.3 渐变 125 5.3.1 线性渐变(LinearGradient) 126 5.3.2 径向渐变...

    android开发揭秘PDF

    1.1.2 Android的系统构架 1.1.3 Android应用程序框架 1.2 OMS介绍 1.2.1 OPhone介绍 1.2.2 Widget介绍 1.3 小结 第2章 Android开发环境搭建 2.1 Android开发准备工作 2.2 开发包及其工具的安装和 配置 2.2.1 安装...

    Android实例代码

    12.3、绘制2D图形: 12.4、绘制3D图形: 第13章、Android的网络应用 13.1、基于TCP协议的网络通信(套接字Socket):Socket; ServerSocket; 13.2、使用URL访问网络资源:URL; URLConnection; 13.3、使用HTTP访问...

    《Android应用开发揭秘》源码

     1.1.2 Android的系统构架  1.1.3 Android应用程序框架  1.2 OMS介绍  1.2.1 OPhone介绍  1.2.2 Widget介绍  1.3 小结  第2章 Android开发环境搭建  2.1 Android开发准备工作  2.2 开发包及其工具的安装和...

    《Android应用开发揭秘》附带光盘代码.

     1.1.2 Android的系统构架  1.1.3 Android应用程序框架  1.2 OMS介绍  1.2.1 OPhone介绍  1.2.2 Widget介绍  1.3 小结  第2章 Android开发环境搭建  2.1 Android开发准备工作  2.2 开发包及其工具的安装和 ...

    Android应用开发揭秘pdf高清版

    1.1.2 Android的系统构架 1.1.3 Android应用程序框架 1.2 OMS介绍 1.2.1 OPhone介绍 1.2.2 Widget介绍 1.3 小结 第2章 Android开发环境搭建 2.1 Android开发准备工作 2.2 开发包及其工具的安装和 配置 2.2.1 安装...

    Android绘图之Paint的使用方法详解

    大家都知道在Android中,自定义控件是一个非常重要的知识点,而自定义控件对Android开发者是一个难点,考验开发人员对View原理的理解,对于继承View的自定义控件,一般都需要重写onDraw方法,而且往往需要开发人员...

    android群雄传

    第1章 Android体系与系统架构 1 1.1 Google生态系统 2 1.2 Android系统架构 2 1.2.1 Linux 3 1.2.2 Dalvik与ART 3 1.2.3 Framework 3 1.2.4 Standard libraries 4 1.2.5 Application 4 1.3 Android App组件...

Global site tag (gtag.js) - Google Analytics