Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android Wear
Code

创建Android Wear Watch Face

by
Difficulty:BeginnerLength:LongLanguages:

Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)

Android特别的功能之一就是能够自定义各个方面的用户体验。 当Android Wear首次在2014的Google I / O大会上推出时,许多开发人员和用户发现,对于智能手表而言上面那个观点并不正确,因为没有创建watch face的官方API。 鉴于自定义手表的功能是用户的关键需求之一,因此开发人员发现在Android Wear中使用没有官方文档支持的黑客技术创建自己的watch face并不奇怪。

幸运的是,Google迅速让每个人都知道官方API正在进行之中,并且在2014年12月API终于被发布给开发社区了。 在本文中,您将了解Android Wear的官方Watch Faces API,并实现一个简单的数字手表,您可以根据自己的需要进行扩展。 实现可能有点冗长,但您可以在GitHub上找到本文的示例应用程序。

1.设置IDE

需要做的第一件事是Android Studio中设置watch face。 创建项目时,请选择手机和平板电脑  ,使用最低SDK  API 18,因为Android 4.3是支持捆绑Android Wear应用程序最低版本的操作系统。 您还需要选择“Wear”  框,并选择“最低API 21”。 您可以看到“目标Android设备”  屏幕应显示如下  。

当您进入两个“添加activity”  界面时,请为两个界面选择“不添加activity ”。

一旦您单击  完成,项目环境被构建了并拥有一个mobile模块和wear模块。

2.建立wear服务

Android Wear通过使用WatchFaceService来实现watch face。 在这篇文章中,将创建一个CanvasWatchFaceService 类的继承,它实现WatchFaceService类,该类提供了绘制watch face的Canvas。 首先 在Android Studio中的Wear模块下创建一个新的Java类  CanvasWatchFaceService

创建完该类后,你需要在本文的源文件中创建一个内部类WatchFaceEngine,该类继承Engine。 这是处理系统事件的watch face引擎,例如屏幕关闭或进入环境模式。

当您的存根代码为  WatchFaceEngine ,返回到外部类并重写onCreateEngine 方法以返回您的新内部类。 这将使您的watch face服务与驱动显示器的代码相关联。

一旦将裸机服务放在一起,您就可以继续更新AndroidManifest  文件的一般内务管理任务,  以便Android Wear可以发现您的服务。 请记住,您当前的代码将不会执行任何操作。 在进行一些项目管理之后,我们将回到这个类并引导引擎。

3.更新AndroidManifest文件

 在wear模块中打开  AndroidManifest.xml文件  。 在顶端附近,您应该已经看到一行代码:

在该行下方,我们需要添加一个watch face的两个必需权限。 这些要求是:

一旦你的权限被设置,你将需要在  application 节点添加一个有BIND_WALLPAPER权限的服务节点,几组  meta-data 包含watch face参考图像的选择屏幕(在这个例子中,我们只是使用启动器图标),还有intent-filter 让系统知道您的服务是用于显示watch face。

Wear清单完成后,你需要打开mobile模块的AndroidManifest.xml文件,并在wear模块中添加我们的使用的两种权限PROVIDE_BACKGROUNDWAKE_LOCK,因为Android Wear需要这两者权限,无论是wear还是mobile模块将wear APK安装在用户手表上都需要该权限。 配置好这两个清单文件,你可以返回到  CustomWatchFaceService.java  来开始实现引擎。

4.启动引擎

与服务相关联的Engine对象是用来驱动watch face的。 它处理定时器、显示用户界面、进出环境模式以及获取关于物理手表显示的信息。 简而言之,这里是魔术发生的地方。

步骤1:定义必要的值和变量

您将要做的第一件事是在引擎中实现一组成员变量,以跟踪显示器的设备状态、定时器间隔和属性。

正如你所看到的,我们定义了  TypeFace ,它用于数字手表文字以及watch face的背景颜色和文字颜色。 Time 对象用于(您猜到它了)跟踪当前设备的时间。  mUpdateRateMs 用于控制我们需要实现的定时器,以便每秒更新一次watch face(因此mUpdateRateMs的值为1000毫秒),因为WatchFaceService标准, 所以只能以1分钟的增量跟踪时间。   一旦发动机知道手表的物理形状mXOffsetmYOffset就被定义,使得我们的watch face可以被绘制而不是太靠近屏幕的顶部或左侧或被圆角切断。 三个布尔值用于跟踪不同的设备和应用程序状态。

您需要定义的下一个对象是处理用户可能正在旅行和更改时区情况的广播接收器。 该接收器简单地清除保存的时区并重置显示时间。

在定义了接收器之后,您需要在引擎顶部创建的最终对象是Handler,用来每隔一秒更新一次watch face。 这是必要的,由于上面讨论的WatchFaceService限制。 如果你自己的watch face只需要每分钟更新一次,那么你可以放心地忽略这个部分。

实现Handler是非常简单的。 它首先检查消息ID。 如果匹配MSG_UPDATE_TIME_ID,它将继续使当前的重绘视图无效。 视图无效后,Handler 检查屏幕是否可见并且不是环境模式。 如果它是可见的,它再次发送重复请求。 我们只是在手表可见并且不是环境模式的时候在Handler中重复执行这个操作,因为每秒钟保持更新会更耗电。 如果用户没有看到屏幕,我们只是回到每分钟更新的WatchFaceService

步骤2:初始化引擎

现在您的变量和对象被声明了,现在是开始初始化watch face的时候了。 EngineonCreate 方法用于创建可花费大量时间和电池的对象和其他任务。 您还将要为WatchFaceStyle设置几个标志来控制当watch face处于活动状态时系统与用户的交互。

对于示例应用程序,您将用setWatchFaceStyle来设置通知卡的背景,以简要显示卡类型是否设置为中断。 您还将设置窥视模式以便通知卡只占用必要的空间。

最后,要告诉系统不显示默认时间,因为您将自己显示它。 虽然这些只是可用的几个选项,您可以在WatchFaceStyle.Builder对象的官方文档中找到更多信息。

WatchFaceStyle设置完成后,可以将mDisplayTime初始化为新Time 对象。

initBackgroundinitDisplayText 分配两个Paint对象,它们是在在引擎顶部定义的。 然后设置背景和文本的颜色设置、文本的字体和字体大小设置。

步骤3:处理设备状态

接下来,您需要从Engine类中实现由设备状态更改触发的各种方法。 我们先从  onVisibilityChanged 方法开始,当用户隐藏或显示watch face时,该方法被调用。

当调用此方法时,它会检查看watch是否可见。 如果watch face可见,则会查看在Engine顶部定义的BroadcastReceiver是否已注册。 如果不是,该方法将创建一个IntentFilterACTION_TIMEZONE_CHANGED的行动并注册BroadcastReceiver监听它。

如果watch face不可见,此方法将检查是否可以取消注册BroadcastReceiver。 一旦BroadcastReceiver被处理,updateTimer 被调用来触发使得watch face无效和重绘watch face。 updateTimer 停止任何Handler待处理的操作并检查是否应发送另一个。

步骤4:与可穿戴硬件合作

当您的服务与Android Wear相关联时,onApplyWindowInsets 被调用。 这用于确定您的watch face正在运行的设备是圆形还是方形。 这可以让您更改您的watch face以配合硬件。

在示例应用中调用此方法时,该方法将简单地检查设备形状并更改用于绘制watch face的x偏移量,以确保您的watch face在设备上可见。

您需要重写的下一个方法是  onPropertiesChanged。 例如,如果设备支持老化保护或低位环境模式,则在确定Wear设备的硬件属性时调用此方法。

在这该方法中,检查这些属性是否适用于运行watch face的设备,并将其保存在Engine顶部定义的成员变量中。

步骤5:在环境和静音模式下节省电池

处理初始设备状态后,需要实现  onAmbientModeChanged 和  onInterruptionFilterChanged。 顾名思义, 当设备移入或移出环境模式时调用onAmbientModeChanged

如果设备处于环境模式,您将需要将手表的颜色更改为黑色和白色以便注意用户的电池。 当设备从环境模式返回时,您可以重置手表的颜色。 您还需要注意要求低位环境支持的设备的anti-aliasing。 在所有标志变量设置完毕后,您可以使表面无效并重绘,然后检查是否应启动一秒计时器。


当用户手动更改穿戴设备的中断设置时,onInterruptionFilterChanged将被调用。 发生这种情况时,您需要检查设备是否静音,然后相应地更改用户界面。 在这种情况下,您将更改您的watch face的透明度,将Handler设置为仅在设备静音时每分钟更新,然后重绘watch face。

当您的设备处于环境模式时,Handler定时器将被禁用。 Watch face仍然可以每一分钟更新当前时间,通过使用内置的onTimeTick 方法来使Canvas无效。

步骤6:绘制watch face

考虑完上面所有的情况后,是时候最终画出watch face了。  CanvasWatchFaceService采用了标准的Canvas对象,所以你需要添加onDraw 到Engine并且手动绘制出watch face。

在本教程中,我们只需要绘制一段时间的文字表示,尽管您可以更改onDraw 以轻松支持模拟的watch face。 在该方法中,需要通过更新Time 对象来验证是否显示正确的时间,然后可以开始应用watch face了。

drawBackground 设置Wear设备背景使用纯色。

然而,drawTimeText将在几个辅助方法的帮助下创建要显示的时间文本,然后将其应用于onApplyWindowInsets定义的x和y偏移点的画布。

结论

一旦你实现了绘制watch face的方法,你应该具备出门所需的基本知识并制作自己的watch face。 Android Wear watch face的好处是,这只可能刮伤表面。

您可以在手表或手机上添加配置activity,将基于watch face的Canvas替换为OpenGL实现,或者根据需要从WatchFaceService派生自己的类 。

可以从用户手机访问其他API或信息,可能性似乎无止境。 获得关于watch face的创意然后去享受吧。

关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.