Kivy - 架构
阅读本章以了解 Kivy 框架的设计架构。一方面,Kivy 提供各种小部件,让用户与应用程序交互,另一方面,它与各种硬件设备(如鼠标 TUIO、音频和视频流等)交互。中间层由驱动程序或提供程序组成,用于处理触摸输入、音频和视频、图形指令和文本输入。
这是 Kivy 框架的官方架构图 −
核心提供程序
Kivy 架构的一个重要特征是"模块化"和"抽象"。打开窗口、读取音频和视频流、加载图像等操作是任何图形应用程序中的核心任务。 Kivy 通过为控制硬件的驱动程序提供易于实现的 API 来抽象这些核心任务。
Kivy 使用特定于运行应用程序的操作系统的提供程序。每个操作系统(Windows、Linux、MacOS 等)都有自己的本机 API 用于不同的核心任务。它们充当操作系统与 Kivy 之间的中间通信层。因此,Kivy 充分利用操作系统公开的功能来提高效率。
使用特定于平台的库可减少 Kivy 发行版的大小并使打包更容易。这也使将 Kivy 移植到其他平台变得更加容易。Android 端口从中受益匪浅。
输入提供程序
输入提供程序是一段添加对特定输入设备支持的代码。 Kivy 内置支持的不同输入设备包括 −
- Android 操纵杆输入提供程序
- Apple 的触控板
- TUIO(有形用户界面对象)
- 鼠标模拟器
- HIDInput
要添加对新输入设备的支持,请提供一个新类,该类从您的设备读取输入数据并将其转换为 Kivy 基本事件。
图形
OpenGL 是 Kivy 框架整个图形 API 的基础。Kivy 使用 OpenGL 指令发出硬件加速的绘图命令。Kivy 通过定义易于使用的功能,省去了编写 OpenGL 命令的困难部分。
Kivy 使用 OpenGL 2.0 ES 版本(嵌入式系统为 GLES 或 OpenGL),您可以使用它进行跨平台开发。
核心库
Kivy 框架的以下组成部分提供了高级抽象 −
时钟 − 时钟 API 可帮助您安排计时器事件。支持单次计时器和周期性计时器。
手势检测 − 多点触控界面的一项重要要求。手势识别器可检测各种笔触,例如圆形或矩形。您甚至可以训练它来检测您自己的笔触。
Kivy 语言 − Kivy 语言用于轻松高效地描述用户界面。这可以将应用程序设计与应用程序逻辑开发分离开来。
属性 − Kivy 独特的属性类概念(它们不同于 Python 类中的属性)将您的小部件代码与用户界面描述联系起来。
UIX
Kivy 的用户界面由小部件和布局构建而成。
小部件是您添加到应用程序中以提供某种功能的 UI 元素。小部件的示例包括按钮、滑块、列表等。小部件接收 MotionEvents。
多个小部件按合适的布局排列。 Kivy 提供了布局类,可以满足各种用途的小部件放置要求。例如网格布局或框布局。您还可以嵌套布局。
事件分派
术语"小部件"用于几乎所有图形工具包中的 UI 元素。任何接收输入事件的对象都是小部件。一个或多个小部件排列在树结构中。
Kivy 应用窗口只能容纳一个根小部件,但根小部件可以在树结构中包含其他小部件。因此,小部件之间存在"父子兄弟"关系。
每当发生新的输入事件时,小部件树的根小部件首先接收事件。根据触摸的状态,事件沿着小部件树向下传播。
树中的每个小部件都可以处理事件或将其传递给层次结构中的下一个小部件。如果小部件吸收并处理该事件,它应该返回 True,以便其沿树向下传播停止,并且不会对该事件进行进一步处理。
def on_touch_down(self, touch): for child in self.children[:]: if child.dispatch('on_touch_down', touch): return True
由于事件通过小部件树传播,因此通常需要验证事件是否发生在预期处理该事件的某个小部件的区域中。 collide_point() 方法可以帮助确定这一事实。此方法检查触摸位置是否位于某个小部件的"监视区域"内,否则返回 True 或 False。默认情况下,这会检查屏幕上由小部件的 pos(位置;x 和 y)和 size(宽度和高度)描述的矩形区域。