沉浸感

通过沉浸式体验,您可以通过更多方式来使用用户输入和创建界面。这样,您就可以打造最个性化的体验,但涉及的工作量最大。

如果这是您第一次针对 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 类包含您可以替换的回调,用于处理菜单创建、显示和拆解:

  1. onCreateOptionsMenu() 会膨胀 XML 菜单资源。
  2. onPrepareOptionsMenu() 会根据需要显示或隐藏菜单项。例如,您可以根据用户正在执行的操作显示不同的菜单项。
  3. 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