内容列表
1. 前言
Android 是一个广泛被智能手机和平板电脑采用的操作系统。它是一个由 Google 领导并在 Apache 开源许可下发布的开源项目。这个许可证书帮助这个系统被广泛地适配,并且允许制造商自由地修改和定制这个系统。事实上,尽管 Android 是为智能手机和平板电脑设计的,但是它也被应用于电视,相机以及其他的设备。此外,Android 有一个非常庞大的社区——这拓展了它的功能,并发开出了各种各样的应用。
所有的 Android 应用,也就是 App,都是建立在 Android UI 框架上的。用户第一眼就看到并且与之交互的就是应用界面。以用户的视角来看,这个框架使得所有的应用都有着始终一致的体验,无论它们安装在被安装在手机还是平板电脑上。与此同时,通过开发者的视角来看,这个框架提供了一些基础的模块,使其可被用来构建复杂而持久的用户界面(API)。
Android UI 界面被分成了三大不同的区域:
- 主屏幕
- 所有应用程序
- 近期任务列表
我们开机时首先着陆的区域就是“主屏幕”。这个界面是可以被高度定制化、主题化的。也可以使用窗口小部件来个性化我们的主屏幕。“所有应用程序”陈列着安装了的应用程序,而“近期任务列表”则陈列了最近使用的应用程序。
自破壳至今,Android 已经在其功能和界面上发生了很大变化。智能手机发展的潜力无限,使得创造更为吸引人的应用程序成为可能。
初开始的时候,Android 里的应用程序没有一个统一的界面以及定义明确的准则,所以每个应用程序都有独自不同的操作方式、导航结构和按钮位置。这造成了用户的困惑,也成为相较于 iOS 重要的缺失功能之一。
2. Android应用结构和 UI 模式
Android 应用都有自己独特的一面,以定位不同的用户需求。既有非常简单的应用,简单到只有一个视图的 UI ;也有较为复杂的应用,有高度结构化的导航和多个视图。
通常情况下,我们可以说 Android 应用是被一个“顶级视图”和多个“具体视图”构成的。
Google 做的一个最大的努力就是定义了一套框架分明的规则,这帮助开发者开发出具备吸引力的界面。与此同时,这些规则也帮助用户通过一种方式来操作不同的应用。
我们称之为“用户界面一致性”。此外,Android 还保证了开发者需求的灵活性以定制应用的外观和感觉,使其独一无二。这些规则和 UI 模式一样为人所知。模式给那些众所周知的问题提供了解决方案。因此,拥有一个定义明确的 UI 模式类目并且知道何时何地去应用它们,我们就可以创造吸引人的应用——不只是具备有趣功能,同时操作简单、使用户乐在其中。
2.1. 顶级视图
如上文所说,顶级视图是应用的“登陆”区域,是用户看到应用的第一件事,所以我们不得不对其留意更多。有一些特定的模式可以被应用于顶级视图的设计。
- Fixed tabs:固定标签
- Spinner:下拉列表
- Navigation drawer:导航栏抽屉
我们必须依据应用的种类慎重地选择这些模式。当我们想要把应用中不同视图的概览展示给用户时,可以使用“fixed tabs”,这样用户就可以在这些视图中轻松地切换,以展示不同类型的信息。有一个典型的例子,比方说一个推送科技消息的应用,在这种情况下我们就可以用不同的标签来分类新闻:“Android”、“iOS”、“游戏”等等。
在想要直接跳转到特定的视图时,我们通常使用“Spinner”,日历就是一个很好的例子:我们可以用“Spinner”直接跳转到一个特定的月份。
“Navigation drawer”是 Google 推出的最新模式之一。“Navigation drawer”是一个可滑动的菜单,通常在智能手机屏幕的左侧,可被用户开启或关闭。这个模式可以被用于多个“顶级视图”的情况,我们可以给用户提供一种快速的方式进入其中任何一个。想让用户自由地直接跳转到某个低级视图时,也可以使用。这个模式不知为何取代了之前被广泛应用的“仪表盘”模式。“仪表盘”模式非常简单,就是一个视图里有一些较大的按钮或是图标来进入特定的视图或是应用功能项。
2.2. 具体视图
“具体视图”是一个用户可以直接用数据来交互的低级视图,被用于显示数据和编辑数据。在这种视图中,布局扮演了一个非常重要的角色,它使得数据组织有序、结构良好。在这种层次的视图中,可以实现一个高效的导航来提高应用的可用性。实际上,我们可以使用滑动视图模式,这样用户就可以在不同的具体视图之间切换。依据展示给用户具体信息的组件类型而定,我们可以实现某些低级模式来简化用户与应用的交互。
2.3. 导航栏
导航栏是 Android 中相对较新的组件,在 Android 3.0 (API 11) 版本中推出。这是一个较为知名且颇为重要的模式。导航栏是屏幕上一小块空间,通常在屏幕上方,跨越多个视图而持续显示。导航栏提供了如下的关键功能:
- 应用标志:图标区域
- 标题区域
- 主要操作区域
- 菜单区域
3. 标准组件
那我们如何搭建一个用户界面呢?Android 提供了一些关键组件,这些组件可以遵循我们之前讲到的模式来创建用户界面。所有的 Android 用户界面都是通过以下的关键组件构成的:
View
:View
是所有可视化组件(控件和部件)的基类。Android 应用中所有的控件都源于这个类。View
对象在智能手机屏幕上进行绘制某些内容,并允许用户与之交互。Viewgroup
:一个Viewgroup
可以包含一个或多个View
对象,并定义这些View
在用户界面中怎样摆放(通过 Android 布局管理器来使用)。Fragment
:从 API 11 引入的Fragment
是可以封装一块儿 UI 接口的组件。当我们在创建和优化多种设备和多种屏幕尺寸的用户界面时,Fragment
变得尤为重要。
Activity
:通常情况下,一个 Android 应用维持着数个Activity
以同步数据和信息。Activity
对象负责创建用户界面。
而且 Android 还提供了一些标准的 UI 控件、布局管理器和部件,用起来毫不费力。这样一来,我们就可以更简单、更快速地创建应用。
此外,我们可以拓展这些组件,并利用特定的布局和运行情况创建一些定制的控件。使用这四个组件和以下的标准 UI 模式可以让我们制作出绚丽且易用的应用。无论如何,我们在搭建和编写一个应用时都得考虑:主题、样式、图片等等,这些方面的内容将在后续的文章中介绍。
如上所述,Android 提供了一些标准组件,可以被分为以下几类:
- Tabs:标签
- Spinners:下拉列表
- Pickers:选择器
- Lists:列表
- Buttons:按钮
- Dialogs:对话框
- Grid lists:网格列表
- TextFields:文本域
下图展示了一些 Android的自定义组件:
如果我们更详细地分析一个 Android 用户界面,我们可以发现它有一个层次结构,而且根部是ViewGroup
。
ViewGroup
像是无形的容器一样,把独立的View对象遵循某种规则摆放在其中。我们可以通过ViewGroup
把ViewGroup
组合在一起,以此来更好地控制View
对象的摆放。但是我们必须记住,用户界面越是复杂,系统就需要越多的时间去渲染。因此,为了更好的性能,我们应该创建简单的用户界面,此外,一个清晰的界面也有助于用户在使用我们的 App 时获得更佳的体验。
一个典型的 UI 结构如图所示:
如果我们通过 IDE 来创建一个简单的 Android 程序,我们可以用如图所示的方式来校验 UI 结构:
在上边的例子里我们可以发现,在层次结构的顶端是一个ViewGroup
(称作RelativeLayout
),而且有一个子view的列表(包含控件和部件)。
当我们想创建一个 Android 的 UI,我们要创建一些 XML 格式的文件。从这角度来看, Android 非常强大,因为我们可以只以 XML 格式来“描述”我们的 UI 界面。而编译 App 创建 apk 文件的时候,系统将会把这些 XML 文件转化成真实的代码。我们将在后续的文章中继续这个话题,届时我们将详细描述如何应用 layout 其他的组件去编写一个真正的 Android UI。
4. 多设备支持
众所周知,Android 是一个在智能手机和平板电脑上广泛使用的操作系统。Android 被安装到如此之多的设备上,这是开发者们的一个好机会,因为这给拥有广泛受众带来了可能。另一方面,数量巨大的 Android 设备也成为开发者的一大挑战。为了提供一个好的用户体验,我们不得不考虑我们的应用能否运行于配备不同分辨率、不同物理屏幕尺寸的多种设备上。
我们必须要考虑到一种情况,就是我们的应用程序需要同时运行在智能手机和平板电脑上。即使屏幕分辨率和屏幕尺寸的差异很大,也要提供相同的易用性。应用程序必须相当灵活,以具备依据所安装的设备来适配布局和控件的功能。举个例子来讲,我们有一个应用展示了一个项目列表,当我们点击其中一个项目时,应用就展示该项目的详细信息,这是一个非常普遍的情况。如果我们的应用在一个只能手机上运行的时候,我们就需要两个屏幕——其中一个展示列表,另一个展示项目的具体信息,如图所示:
当我们的应用在平板电脑上运行时,这就应该在一个屏幕上展示,如图所示:
即使系统已经竭尽所能对我们的应用进行缩放和调整大小以使之运行在不同屏幕尺寸的设备上,我们依然需要尽力确保我们的应用支持不同的屏幕。虽然这是一个挑战,但在一些指引下我们依然可以征服。
下面是一些在我们编写我们的应用之前必须理解的关键概念:
- 屏幕尺寸:这是物理屏幕的大小,换句话说,是我们设备的实际尺寸。
- 屏幕密度:密度是指特定区域的像素数。一般我们采用“点每英寸(dpi)”。密度是屏幕质量的一个衡量标准。
- 屏幕朝向:屏幕朝向是指屏幕的方向,指横屏或者竖屏。
- 密度无关像素:这是一个 Android 新引进的像素度量单位,就叫做“dp”。一个单位“dp”等效于在 160dpi 下的一个单位像素。在我们创建 UI 的时候应该以 dp 为单位进行测量,系统在运行的时候会将其转化为实际上的像素。
从屏幕尺寸的角度,Android 把设备分成四类:“small”、“normal”、“large”以及“extra large (xlarge)”,取决于屏幕尺寸的英寸值。另一方面,我们又可以把设备从 dpi 的角度分为:“ldpi(低 dpi )”、“mdpi (中dpi)”、“hdpi(高dpi)”、 “xhdpi(超高dpi)”、以及最近新出现的“xxhdpi”。这关乎着我们使用 drawable(也就是位图),因为我们必须根据不同的屏幕分辨率创建几种大小的图片资源。
这种分类方式影响了我们的 IDE(比如 Eclipse 或者 Android Studio),所以如果我们查看 res 目录下的资源,就可以发现一个如下图所示的结构:
我们需要遵循的最佳实践方式如下:
- 不要使用以像素表示的固定尺寸,取而代之的是 dp。
- 为不同的屏幕尺寸提供不同的布局结构——我们可以通过创建不同的布局文件来实现这一功能。
- 为不同的屏幕分辨率提供不同分辨率的位图。我们可以考虑使用可拉伸的“.9.png”文件。
除此之外,Android 还提供了一个资源预选机制,有助于我们对系统选择资源进行更多的控制。通常我们使用如下的方式:
<resource_name>_<qualifier>
“resource_name”可以是位图或者布局,而“qualifier”可以是“hdpi”、“large”或者其他的屏幕分类。点击此处(https://developer.android.com/guide/practices/screens_support.html)以获取更多信息。
即使我们开发应用程序时就遵守上面的最佳实践方式以支持多种屏幕,在某些情况下依然是不够的。尤其是当我们想要同时支持智能手机和平板电脑的时候。在这种情况下,Android 推出了Fragment
概念。Fragment
自 API 11 开始提供,并且向后兼容。我们将在下篇文章中讨论这些话题。敬请关注!