Android 图形

Android 框架提供了各种用于 2D 和 3D 图形渲染的 API,可与制造商的图形驱动程序实现代码交互,因此务必更好地了解这些 API 的工作原理。这类驱动程序的构建基于图形硬件抽象层 (HAL),本页介绍了相关图形 HAL。在继续学习本部分之前,请先熟悉以下术语:

画布(通用术语)、Canvas(API 元素)

画布是一种绘图 Surface,用于对照位图或 Surface 对象来处理实际位合成。Canvas 包含关于位图、线条、圆形、矩形、文字等的标准计算机绘制方法,并与位图或 Surface 相关联。画布是在屏幕上绘制 2D 对象的最简便方法。基类为 Canvas

可绘制对象

可绘制对象是一种经过编译的视觉资源,可用作背景、标题或界面的其他部分。可绘制对象通常会被加载到另一个界面元素中,例如作为背景图片。可绘制对象不能接收事件,但可以指定各种其他属性(如状态和调度),以启用动画对象或图像库等子类。许多可绘制对象都是加载自可绘制资源文件(即描述图像的 XML 或位图文件)。可绘制资源会被编译成 android.graphics.drawable 的子类。如需详细了解可绘制对象和其他资源,请参阅资源

布局资源

布局资源是描述 activity 界面布局的 XML 文件。如需了解详情,请参阅布局资源

九宫格(9 宫格、NinePatch)

九宫格是一种可调整大小的位图资源,可用作设备上的背景或其他图片。如需了解详情,请参阅九宫格

OpenGL ES

OpenGL ES 是一个用于渲染 2D 和 3D 图形的跨平台 API。Android 提供 OpenGL ES 库,该库可用于实现硬件加速的 3D 渲染。对于 2D 渲染,画布是更简单的选项。Android 原生开发套件 (NDK) 中提供 OpenGL ES。android.opengl 和 javax.microedition.khronos.opengles 软件包提供 OpenGL ES 功能。

Surface (通用术语)、Surface(API 元素)

Surface 表示要合成到界面的内存块。Surface 包含用于绘图的 Surface 对象,并提供各种辅助方法来绘制图层和调整界面大小。请使用 SurfaceView 类,而不是直接使用 Surface 类。

Surface 视图(通用术语)、SurfaceView(API 元素)

Surface 视图是一个 View 对象,它封装用于绘制的 Surface 对象,并提供相应的方法来动态指定其大小和格式。Surface 视图针对资源密集型操作(例如游戏或相机预览)提供了一种独立于界面线程进行绘制的方式,但也会因此占用额外的内存。Surface 视图同时支持画布和 OpenGL ES 图形。SurfaceView 对象的基类是 SurfaceView

主题

主题用于定义各种默认显示设置,它是一组捆绑在一起的属性,例如文字大小和背景颜色。Android 提供了一些标准的主题,这些主题列于 R.style 中,并以 Theme_ 开头。

视图(通用术语)、View(API 元素)

视图会在屏幕上绘制为矩形区域并用于处理点击、按键和其他互动事件。View 类是 activity 或对话框界面的大多数布局组件(如文本框和窗口)的基类。View 对象接收来自其父对象(请参阅 ViewGroup)的调用,以绘制自身,并告知父对象其首选大小和位置,但父对象不一定会遵循。如需了解详情,请参阅 View

视图组(通用术语)、ViewGroup(API 元素)

视图组用于对一组子视图进行分组。视图组负责确定子视图的位置和大小,以及在适当的时候调用每个子视图来绘制自身。某些视图组是不可见的,仅用于布局,而有些视图组则具有固有的界面(例如,滚动列表框)。视图组位于 widget 软件包中,但会扩展 ViewGroup 类。

视图层次结构

视图层次结构是视图和视图组对象的排列方式,定义应用中每个组件的界面。层次结构由视图组构成,而视图组中又可包含一个或多个子视图或视图组。在进行调试和优化时,您可以通过 Android SDK 提供的 Hierarchy Viewer 获得视图层次结构的可视化表示。

Vulkan

Vulkan 是一个适用于高性能 3D 图形的低开销、跨平台 API。

widget

widget 是一组完全实现的视图子类,这些子类用于渲染表单元素和其他界面组件,例如文本框或弹出式菜单。由于微件是完全实现的,因此它会自行处理测量和绘制,并且会响应屏幕事件。widget 位于 android.widget 软件包中。

窗口(通用术语)、Window(API 元素)

在 Android 应用中,窗口是派生自 Window 抽象类的对象,可指定常规窗口的元素,例如外观和风格、标题栏文字、菜单的位置和内容。对话框和 activity 使用 Window 类的实现来渲染 Window 对象。您无需在应用中实现 Window 类或使用窗口。

应用开发者可通过三种方式将图像绘制到屏幕上:使用画布OpenGL ES 或 Vulkan

Android 图形组件

无论开发者使用什么渲染 API,一切内容都会渲染到 surface 上。Surface 表示缓冲区队列中的生产方,而缓冲区队列通常会被 SurfaceFlinger 消耗。在 Android 平台上创建的每个窗口都由 Surface 提供支持。所有被渲染的可见 Surface 都被 SurfaceFlinger 合成到屏幕。

下图显示了关键组件如何协同工作:

图像渲染组件

图 1. surface 如何被渲染

主要组件如下所述:

图像流生产方

图像流生产方可以是生成图形缓冲区以供消耗的任何内容。例如 OpenGL ES、Canvas 2D 和 mediaserver 视频解码器。

图像流消耗方

图像流的最常见消耗方是 SurfaceFlinger,该系统服务会消耗当前可见的 Surface,并使用窗口管理器中提供的信息将它们合成到屏幕。SurfaceFlinger 是可以修改所显示部分内容的唯一服务。SurfaceFlinger 使用 OpenGL 和 Hardware Composer 来合成一组 Surface。

其他 OpenGL ES 应用也可以消耗图像流,例如相机应用会消耗相机预览图像流。非 GL 应用也可以是使用方,例如 ImageReader 类。

硬件混合渲染器

显示子系统的硬件抽象实现。SurfaceFlinger 可以将某些合成工作委托给硬件混合渲染器,以分担 OpenGL 和 GPU 上的工作量。SurfaceFlinger 只是充当另一个 OpenGL ES 客户端。因此,在 SurfaceFlinger 将一个或两个缓冲区合成到第三个缓冲区中的过程中,它会使用 OpenGL ES。这会让合成的功耗比通过 GPU 执行所有计算时更低。

硬件混合渲染器 HAL 则进行另一半的工作,是所有 Android 图形渲染的中心点。Hardware Composer 必须支持事件,其中之一是 VSYNC(另一个是支持即插即用 HDMI 的热插拔)。

Gralloc

需要使用图形内存分配器 (Gralloc) 来分配图像生产方请求的内存。有关详情,请参阅 Gralloc HAL

数据流

有关 Android 图形管道的描述,请参见下图:

图形数据流

图 2. 流经 Android 的图形数据流

左侧的对象是生成图形缓冲区的渲染器,如主屏幕、状态栏和系统界面。SurfaceFlinger 是合成器,而硬件混合渲染器是混合渲染器。

BufferQueue

BufferQueues 是 Android 图形组件之间的粘合剂。它们是一对队列,可以调解缓冲区从生产方到消耗方的固定周期。一旦生产方移交其缓冲区,SurfaceFlinger 便会负责将所有内容合成到显示部分。

有关 BufferQueue 通信过程,请参见下图。

BufferQueue 通信过程

图 3. BufferQueue 通信过程

BufferQueue 包含将图像流生产方与图像流消耗方结合在一起的逻辑。图像生产方的一些示例包括由相机 HAL 或 OpenGL ES 游戏生成的相机预览。图像消耗方的一些示例包括 SurfaceFlinger 或显示 OpenGL ES 流的另一个应用,如显示相机取景器的相机应用。

BufferQueue 是将缓冲区池与队列相结合的数据结构,它使用 Binder IPC 在进程之间传递缓冲区。生产方接口,或者您传递给想要生成图形缓冲区的某个人的内容,即是 IGraphicBufferProducer(SurfaceTexture 的一部分)。BufferQueue 通常用于渲染到 Surface,并且与 GL 消耗方及其他任务一起消耗内容。

BufferQueue 可以在三种不同的模式下运行:

类同步模式 - 默认情况下,BufferQueue 在类同步模式下运行,在该模式下,从生产方进入的每个缓冲区都在消耗方那退出。在此模式下不会舍弃任何缓冲区。如果生产方速度太快,创建缓冲区的速度比消耗缓冲区的速度更快,它将阻塞并等待可用的缓冲区。

非阻塞模式 - BufferQueue 还可以在非阻塞模式下运行,在此类情况下,它会生成错误,而不是等待缓冲区。在此模式下也不会舍弃缓冲区。这有助于避免可能不了解图形框架的复杂依赖项的应用软件出现潜在死锁现象。

舍弃模式 - 最后,BufferQueue 可以配置为丢弃旧缓冲区,而不是生成错误或进行等待。例如,如果对纹理视图执行 GL 渲染并尽快绘制,则必须丢弃缓冲区。

为了执行这项工作的大部分环节,SurfaceFlinger 就像另一个 OpenGL ES 客户端一样工作。例如,当 SurfaceFlinger 正在积极地将一个缓冲区或两个缓冲区合成到第三个缓冲区中时,它使用的是 OpenGL ES。

Hardware Composer HAL 执行另一半工作。该 HAL 充当所有 Android 图形渲染的中心点。

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在 Android 上创建图形按钮,可以使用以下步骤: 1. 在 res/drawable 文件夹中创建一个 XML 文件,来定义你想要的按钮形状。例如,你可以创建一个名为 "button_shape.xml" 的文件,并在其中添加以下代码: ``` <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="10dp" /> <solid android:color="@color/button_color" /> </shape> ``` 这将创建一个圆角矩形按钮,颜色为 "@color/button_color"。 2. 在布局文件中,使用 Button 元素来创建一个按钮,并为其设置样式为你刚才定义的按钮形状: ``` <Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/button_shape" android:text="My Button" /> ``` 3. 在代码中,可以像处理普通按钮一样处理这个图形按钮: ``` Button myButton = findViewById(R.id.my_button); myButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 处理按钮点击事件 } }); ``` 这样,一个简单的图形按钮就完成了。你可以根据需要自定义按钮形状和颜色,以适应你的应用程序风格。 ### 回答2: Android 图形按钮是一种在Android应用程序中常见的UI元素。它是一种用于用户交互的控件,通常用于触发某个操作或跳转到其他界面。 Android图形按钮通常包含一个图标或者是一个图标和文本组合而成。这个图标可以是一张图片或者是由字体图标库提供的矢量图标。图形按钮的外观可以通过设置按钮的背景色、边框样式、文字颜色等属性进行自定义。 在Android开发中,我们通常使用Button控件来创建图形按钮。在XML布局文件中,我们可以使用`Button`标签来定义一个图形按钮,并通过设置`android:background`属性来指定按钮的背景样式。同时,我们还可以使用`android:drawableLeft`、`android:drawableRight`等属性来设置按钮中图标的位置。在Java代码中,我们可以通过`setOnClickListener`方法来为按钮绑定点击事件的处理逻辑。 使用图形按钮可以为用户提供直观的操作体验,通过不同的图标或颜色搭配,可以增加按钮的辨识度,并且可以提高用户对界面的可理解性和使用便捷性。在设计图形按钮时,需要考虑按钮的大小、样式和布局,以及按钮与其他UI元素的协调性,从而实现更好的用户交互体验。 综上所述,Android图形按钮是一种常见的用户交互控件,通过图标和文字组合形成,通过设置属性和绑定点击事件的方式实现功能。它可以提供直观的操作体验,增加界面可理解性和使用便捷性,是Android应用程序中不可或缺的一部分。 ### 回答3: Android 图形按钮是一种用于用户界面的交互元素,它可以呈现各种形状和样式的图形Android 提供了多种方式来创建图形按钮,其中最常用的方式是使用Button控件和ImageView控件。 Button控件是Android中最基本的按钮控件之一,它可以显示文本、图标或二者的组合。可以通过设置Button的背景、文本、文本颜色和点击事件来自定义按钮的外观和行为。 ImageView控件是一种显示图像的控件,它可以加载本地或网络上的图像资源。将图像设置为按钮的背景,可以实现图形按钮的效果。可以使用setImageResource()方法或setImageBitmap()方法来设置ImageView的图像资源。 通过设置图形按钮的点击事件,可以为按钮添加事件监听器。当用户点击按钮时,可以执行相应的操作,例如跳转到另一个界面、提交表单或执行其他逻辑。 除了使用基本的Button和ImageView控件,还可以使用自定义控件或第三方库来创建更复杂的图形按钮。自定义控件可以继承Button或ImageView来实现特定的按钮效果,例如圆形按钮、带有动画效果的按钮等。第三方库提供了丰富的图形按钮样式和动画效果,可以通过导入库并设置相应的属性来使用。 总结来说,Android 图形按钮是一种用于用户界面的交互元素,可以通过Button和ImageView控件、自定义控件或第三方库来创建。通过设置背景、文本、文本颜色和点击事件等属性,可以自定义图形按钮的外观和行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值