通过沉浸式体验,您可以通过更多方式来使用用户输入和创建界面。这样,您就可以打造最个性化的体验,但涉及的工作量最大。
如果这是您第一次针对 Glass 进行开发,请改为参阅沉浸式指南。本文档将按照我们设计的最佳做法介绍如何通过沉浸式构建完整的 Glassware。
运作方式
沉浸式画面显示在时间轴之外,使您能够从 Glass 启动沉浸模式时完全控制用户体验。
您可以使用标准 Android activity、布局、界面 widget 以及 Android 平台的其余部分构建沉浸式体验。然后,您可以使用 GDK 集成到 Glass 体验中,例如集成语音指令、Glass 样式的卡片等。
沉浸感开始时,它们会显示在时间轴顶部。当用户完成沉浸式体验时,通过向下滑动返回。
适用情形
沉浸模式非常适合需要长时间关注用户的体验。 借助自适应展示广告,您可以创建不在时间轴上的专用界面,方便用户深入了解自定义体验。
如果您需要覆盖时间轴相关的功能(例如向前和向后滑动以及控制屏幕超时),也需要使用沉浸模式。
不过,请仅在必要时使用沉浸模式,因为这种模式需要更多工作才能构建完毕,并且需要更多时间进行设计。实时卡片为大多数类型的 Glassware 提供足够的特性和功能。
打造沉浸式体验
您可以使用标准 Android activity 创建沉浸式体验,但在为 Glass 编写 activity 时,请注意以下几点:
- 针对 640 × 360 像素屏幕设计界面。
- 设计在 Glass 上有意义的互动,而不是移植来自其他 Android 设备的 activity。
- 不要依赖复杂的触摸手势或界面模式。
- 向下滑动始终在 Activity 堆栈中返回,直到用户到达时间轴为止。其功能在智能手机和平板电脑上与 Android 返回按钮非常相似。
- 创建一个 50×50 像素图标,并在 Android 清单中为
<activity>
元素的android:icon
属性指定此图标。还要指定android:label
的文本。 这样,与多个 Glassware 关联的语音或触摸菜单项即可显示您 Glassware 的名称和图标。 - 为
<activity>
元素指定android:immersive="true"
,以便在屏幕休眠和唤醒后提供沉浸式焦点。
创建和显示菜单
如果您使用 activity 内的标准 Android 菜单 API 构建菜单,Glass 会显示菜单的正确样式。
如需显示 activity 的菜单,请创建菜单资源,然后在用户操作(例如 activity 获得焦点时点按)向用户显示这些资源。
创建菜单资源
创建菜单资源与在 Android 平台上创建菜单资源相同,但遵循以下准则:
- 为每个菜单项提供一个 50 × 50 像素的菜单项图标。菜单图标必须为白色,背景为透明。下载 Glass 菜单图标,以供使用或作为示例。
- 请使用简短的短语来描述操作,且采用句首字母大写形式。 祈使动词效果较好(例如“分享”或“全部回复”)。
这里有一个简单的入门步骤:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/reply_menu_item"
android:title="@string/reply" <!-- imperative verb -->
android:icon="@drawable/icons_50_reply" /> <!-- white in color on
transparent background
-->
</menu>
如需详细了解如何创建 Android 菜单,请参阅 Android SDK 文档中的菜单主题。
处理菜单回调
Activity
类包含您可以替换的回调,用于处理菜单创建、显示和拆解:
onCreateOptionsMenu()
会膨胀 XML 菜单资源。onPrepareOptionsMenu()
会根据需要显示或隐藏菜单项。例如,您可以根据用户正在执行的操作显示不同的菜单项。onOptionsItemSelected()
会处理用户选择。public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.stopwatch, menu); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { // Implement if needed } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection. Menu items typically start another // activity, start a service, or broadcast another intent. switch (item.getItemId()) { case R.id.stop: startActivity(new Intent(this, StopStopWatchActivity.class)); return true; default: return super.onOptionsItemSelected(item); } } }
显示菜单
如需显示菜单,请根据需要调用 openOptionsMenu()
,例如点按触控板。以下示例检测到对 activity 执行点按手势,然后调用 openOptionsMenu()
。
public class MainActivity extends Activity {
// ...
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
openOptionsMenu();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
菜单实用程序
您可以使用一些辅助方法来修改菜单的外观和行为。如需了解详情,请参阅 MenuUtils
。