`
wen742538485
  • 浏览: 238975 次
  • 性别: 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记录和更新显示列表.没有被invalidated的Views可以简单地使用先前的显示列表中的记录进行重绘.新的绘制模式包含三个阶段:

1使整个View层级都无效

2记录并更新显示列表

3画显示列表




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




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

DrawDisplayList(ListView)

DrawDisplayList(Button)

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

SaveLayerAlpha(0.5)

DrawDisplayList(ListView)

Restore

DrawDisplayList(Button)




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


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

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)为受影响的部分关闭硬加速.用此方法,你依然可以在其它地方享用到硬加速.
分享到:
评论

相关推荐

    源码

    `Paint`对象是Android图形系统中另一个重要的组成部分,它允许我们控制文本的外观。你可以设置`Paint`的颜色、字体大小、样式(如粗体或斜体)、抗锯齿效果以及更多其他属性。 例如,如果你想要在屏幕中心绘制红色...

    Android多媒体应用开发实战详解:图像、音频、视频、2D和3D

    《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》是一本针对Android平台多媒体开发的详尽指南,旨在帮助Android程序员、研发人员以及对此领域感兴趣的爱好者掌握核心技能,从基础到高级,从理论到实践...

    Android shape 绘制图形的实例详解

    Android shape 绘制图形的实例详解 Android shape 绘制图形是一种常见的 UI 组件绘制方式,通过 shape 属性可以绘制各种图形,如线、圆形、矩形等。下面是 Android shape 绘制图形的实例详解。 shape 属性 shape ...

    《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》

    这本书详细介绍了如何利用Android系统提供的API和技术,来实现图像处理、音频播放与录制、视频操作以及2D和3D图形的绘制,从而为用户提供丰富的多媒体体验。 在图像处理方面,书中会涵盖Android的Bitmap类,讲解...

    Android优化技术详解

    Android系统采用Dalvik/ART虚拟机进行运行时环境支持,内存优化主要包括减少内存泄漏、避免过度绘制和合理使用内存池。开发者应学习使用MAT工具分析内存快照,找出内存泄漏问题,并通过避免长时间持有强引用和使用...

    Android入门到精通详解(完整书签)

    ### Android入门到精通详解知识点概览 #### 第一篇:Android系统结构和SDK使用 ##### 第1章:Android的系统介绍 - **系统介绍**:Android是Google开发的一款基于Linux平台的开源操作系统,专为移动设备设计。它...

    Android优化技术详解 陈德春

    《Android优化技术详解》是陈德春先生撰写的一本深入探讨Android系统优化的专业书籍,旨在帮助开发者提升应用程序的性能和用户体验。这本书详细介绍了多种Android优化技术,包括但不限于内存管理、性能调优、电量...

    Android_图形系统分析-surfaceFlinger流程

    SurfaceFlinger作为Android图形系统的核心组件之一,负责管理屏幕上的多个显示层,并控制它们的合成与渲染,以确保用户界面流畅、高效地显示。本文将深入解析SurfaceFlinger的工作原理及其实现机制,帮助读者更好地...

    Android shape属性详解

    Shape对象是Android图形绘制的核心部分,通过调整其属性可以实现丰富的视觉效果。下面将详细解析Android中的shape属性。 一、Shape类型 Shape元素有四种基本类型,分别是`<rectangle>`(矩形)、`<oval>`(椭圆)、...

    Android应用开发详解

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

    android应用开发详解 郭宏志编著 pdf格式

    - **Android的架构**:详解Android系统的层次结构,包括Linux内核层、系统运行环境层、应用框架层和应用层。 - **Android生态系统**:阐述Android设备市场占有率、应用商店(Google Play)及其对开发者的意义。 **...

    Android系统原理与开发要点详解

    《Android系统原理与开发要点详解》是一套深入探讨Android操作系统核心机制及开发实践的课程资料。这份资料详尽地解析了Android系统从底层到上层的各个关键组件,旨在帮助开发者全面理解Android的工作原理,提升开发...

    Android入门到精通详解 带书签 PDF

    《Android入门到精通详解》这本书全面覆盖了Android开发的各个方面,从系统结构和SDK使用,到应用程序的开发框架和UI设计,再到图形和动画的高级主题。对于初学者来说,这本书提供了一个系统的学习路径,帮助他们...

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

    在Android中使用OpenGL ES进行3D图形绘制,首先需要理解EGL(Embedded Graphics Library)的角色。EGL作为OpenGL ES与本地窗口系统之间的桥梁,负责管理渲染上下文(EGLContext)、渲染面(EGLSurface)以及与设备...

    《Android创意实例详解》源代码

    4. 多媒体处理:Android提供MediaPlayer和ExoPlayer用于音频和视频播放,同时支持图像处理(Bitmap)和图形绘制(Canvas)。源代码中可能包含音视频播放器的实现,或者图片编辑和滤镜应用。 5. 传感器交互:Android...

    Android SurfaceFlinger详解

    1. **Surface**:在Android图形系统中,Surface是一个重要的概念。它是用于绘制视图(如TextView、Button等)的基础载体。每个视图都需通过Surface进行绘制。 2. **Canvas**:每个Surface都会创建一个或多个Canvas...

Global site tag (gtag.js) - Google Analytics