SurfaceView和View的区别,你知道吗?

开发 架构
如果Surface上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。另外,SurfaceView变得可见时,Surface被创建;SurfaceView隐藏前,Surface被销毁。这样能节省资源。

View介绍

View是Android开发中UI界面的基本构建块。它是用户界面上的一个单一矩形区域,用于显示文本、图像、视频等,并且可以响应用户的触摸事件。View有很多种类,例如Button、TextView、ImageView等,每种View都有其特定的用途和属性。

View的主要功能:

  • 绘制界面:View负责在其指定的区域内绘制内容,如文本、图像等。
  • 事件处理:View可以响应触摸事件、键盘事件等用户交互操作。
  • 布局参数:View可以设置各种布局参数,如宽度、高度、边距等,以控制其在屏幕上的显示位置和大小。

View注意点:

  • View的大小和位置:可以通过设置View的宽度和高度属性来控制其大小,通过设置left、top、right、bottom属性来控制其位置。
  • View的绘制性能:View的绘制可能会比较消耗性能,因此应避免在性能敏感的区域进行复杂的绘制操作。
  • View的事件处理:View的事件处理应尽可能高效,以避免影响用户体验。

SurfaceView介绍

SurfaceView是Android中一个重要的绘图容器,可以直接从内存或者DMA等硬件接口取得图像数据。它的特性是可以在主线程之外的线程中向屏幕绘图,从而避免画图任务繁重的时候造成主线程阻塞,提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。

SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。

SurfaceView提供了一个可见区域,只有在这个可见区域内的Surface部分内容才可见,可见区域外的部分不可见。surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味着 surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。

注意:如果Surface上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。另外,SurfaceView变得可见时,Surface被创建;SurfaceView隐藏前,Surface被销毁。这样能节省资源。

两者区别

SurfaceView和View的区别主要表现在绘制机制、性能、同步问题和适用场景等方面。

  1. 绘制机制:SurfaceView和View在绘制机制上有根本的区别。View的绘制必须在UI主线程中完成,而SurfaceView可以在一个单独的线程中进行绘制。这意味着在处理大量绘图操作时,使用SurfaceView可以避免阻塞UI主线程,提高应用程序的响应性。
  2. 性能:由于SurfaceView在独立的线程中进行绘制,它可以更高效地处理大型数据集和复杂的图形操作。这使得SurfaceView更适合于需要频繁更新或处理大量数据的场景,如游戏或视频播放器等。
  3. 同步问题:虽然SurfaceView的绘制操作独立于UI主线程,但这也带来了事件同步的问题。例如,如果你需要在SurfaceView中处理触摸事件,需要设计一个事件队列来保存这些事件,因为它们发生在不同的线程中。这需要更复杂的编程模型,因为涉及到线程同步的问题。
  4. 适用场景:View适用于一般的应用程序界面开发,它提供了基本的绘制和事件处理功能。而SurfaceView更适合于需要高性能和复杂图形操作的场景,如游戏或视频播放器等。
责任编辑:武晓燕 来源: 沐雨花飞蝶
相关推荐

2023-06-01 08:15:04

CentOS红帽

2023-12-29 22:41:12

同步架构业务

2017-09-05 15:27:33

View Api23Api24

2022-03-13 18:53:31

interfacetypeTypeScript

2021-08-29 18:01:57

HTTP协议版本

2024-05-27 00:00:00

localhostIPv6IPv4

2021-12-06 20:00:59

人工智能AI自动化

2024-10-22 09:59:36

虚拟化容器化系统

2021-04-29 22:31:51

显卡硬件芯片

2023-02-20 14:27:56

Kubernetes内存单位

2023-12-12 08:41:01

2015-05-26 09:42:34

路由器交换器

2021-02-06 21:57:40

Debug模式Release

2020-06-18 09:04:59

CC++程序

2024-09-18 07:00:00

消息队列中间件消息队列

2021-10-14 06:52:47

算法校验码结构

2022-09-29 15:32:58

云计算计算模式

2018-05-11 15:53:59

2024-04-07 00:00:00

ESlint命令变量

2024-05-28 09:12:10

点赞
收藏

51CTO技术栈公众号