使用者介面

本文將介紹如何遵循 Glass 樣式及實作常見的 UI 最佳做法,協助您獲得最佳使用者體驗。其中包含下列 UI 元素:

主題

建議使用的 Glass 主題具有下列特性:

  • 以全螢幕模式顯示活動,但不顯示動作列。
  • 套用純黑色背景。
  • 設定色彩邊緣效果的淺色。
  • 套用白色文字顏色。

以下是 Glass 的建議主題設定:

 <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
   <item name="android:windowBackground">@android:color/black</item>
   <item name="android:colorEdgeEffect">@android:color/white</item>
   <item name="android:textColor">@android:color/white</item>
 </style>

XML 版面配置

以下是片段加載的兩種基本資訊卡版面配置:

主要版面配置

這個版面配置定義了卡片建議的標準邊框間距和頁尾。將自己的檢視畫面放入空白的 FrameLayout

中間方塊佔據畫面的內部區域,大小為 560 x 240 像素,底部有一小列,也就是 560 x 40 像素。還有四個小尺寸的 40 x 40 像素區塊,每個角落一個

以下是 XML 版面配置的範例:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <FrameLayout
      android:id="@+id/body_layout"
      android:layout_width="0dp"
      android:layout_height="0dp"
      android:layout_margin="@dimen/glass_card_margin"
      app:layout_constraintBottom_toTopOf="@id/footer"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent">

    <!-- Put your widgets inside this FrameLayout. -->

  </FrameLayout>

  <!-- The footer view will grow to fit as much content as possible while the
         timestamp view keeps its width. If the footer text is too long, it
         will be ellipsized with a 40dp margin between it and the timestamp. -->

  <TextView
      android:id="@+id/footer"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginStart="@dimen/glass_card_margin"
      android:layout_marginEnd="@dimen/glass_card_margin"
      android:layout_marginBottom="@dimen/glass_card_margin"
      android:ellipsize="end"
      android:singleLine="true"
      android:textAppearance="?android:attr/textAppearanceSmall"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toStartOf="@id/timestamp"
      app:layout_constraintStart_toStartOf="parent" />

  <TextView
      android:id="@+id/timestamp"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginEnd="@dimen/glass_card_margin"
      android:layout_marginBottom="@dimen/glass_card_margin"
      android:ellipsize="end"
      android:singleLine="true"
      android:textAlignment="viewEnd"
      android:textAppearance="?android:attr/textAppearanceSmall"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

左欄版面配置

這個版面配置定義了三分之一寬度的寬度欄和兩分之三寬度欄的格式,共分為兩個 FrameLayout 類別,可供您填入檢視畫面。請參閱下圖,查看範例。

顯示 240 x 360 像素的左欄,將主要版面配置移到上方。
          其大小擠壓至配合尺寸,主要區域為 330 x 240 像素,下方為 330 x 40 像素的小下方小列。右側角落有兩個小型 40 x 40 像素方塊,其他四則為 30 x 40 像素的方塊,左側是左欄的右下角,兩個則在主要版面配置的左側,第二個則在底部。

以下是 XML 版面配置的範例:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <FrameLayout
      android:id="@+id/left_column"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:background="#303030"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      app:layout_constraintWidth_percent=".333">

    <!-- Put widgets for the left column inside this FrameLayout. -->

  </FrameLayout>

  <FrameLayout
      android:id="@+id/right_column"
      android:layout_width="0dp"
      android:layout_height="0dp"
      android:layout_marginTop="@dimen/glass_card_two_column_margin"
      android:layout_marginStart="@dimen/glass_card_two_column_margin"
      android:layout_marginBottom="@dimen/glass_card_two_column_margin"
      android:layout_marginEnd="@dimen/glass_card_margin"
      app:layout_constraintBottom_toTopOf="@id/footer"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toEndOf="@id/left_column"
      app:layout_constraintTop_toTopOf="parent">

    <!-- Put widgets for the right column inside this FrameLayout. -->

  </FrameLayout>

  <!-- The footer view will grow to fit as much content as possible while the
         timestamp view keeps its width. If the footer text is too long, it
         will be ellipsized with a 40dp margin between it and the timestamp. -->

  <TextView
      android:id="@+id/footer"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginStart="@dimen/glass_card_margin"
      android:layout_marginEnd="@dimen/glass_card_margin"
      android:layout_marginBottom="@dimen/glass_card_margin"
      android:ellipsize="end"
      android:singleLine="true"
      android:textAppearance="?android:attr/textAppearanceSmall"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toStartOf="@id/timestamp"
      app:layout_constraintStart_toEndOf="@id/left_column" />

  <TextView
      android:id="@+id/timestamp"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginEnd="@dimen/glass_card_margin"
      android:layout_marginBottom="@dimen/glass_card_margin"
      android:ellipsize="end"
      android:singleLine="true"
      android:textAlignment="viewEnd"
      android:textAppearance="?android:attr/textAppearanceSmall"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

標準尺寸

將以下內容與先前的版面配置或自己的版面配置搭配使用,以建立符合 Glass' 標準檔案的檔案。在 Android 專案中建立 res/values/dimens.xml 這個檔案。

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <!-- The recommended margin for the top, left, and right edges of a card. -->
  <dimen name="glass_card_margin">40dp</dimen>

  <!-- The recommended margin between the bottom of the card and the footer. -->
  <dimen name="glass_card_footer_margin">50dp</dimen>

  <!-- The recommended margin for the left column of the two-column card. -->
  <dimen name="glass_card_two_column_margin">30dp</dimen>

</resources>

建議您使用 RecyclerView 建立選單。應該以 Android Studio 專案資源的標準 Android 選單檔案為基礎。Android 可讓您覆寫標準選單建立作業,並替換為實作項目。步驟如下:

  1. 使用 RecyclerView 建立版面配置,並將其設為 Activity 的檢視畫面。
  2. 設定 RecyclerView 及其轉接程式,以使用新建立的選單項目集合。
  3. 覆寫 onCreateOptionsMenu 方法。
    1. 加載選單,並將新元素加入每個選單項目的集合。
    2. 呼叫轉接程式上的 notifyDataSetChanged 方法。

    Kotlin

        override fun onCreateOptionsMenu(menu: Menu): Boolean {
            val menuResource = intent
                .getIntExtra(EXTRA_MENU_KEY, EXTRA_MENU_ITEM_DEFAULT_VALUE)
            if (menuResource != EXTRA_MENU_ITEM_DEFAULT_VALUE) {
                menuInflater.inflate(menuResource, menu)
                for (i in 0 until menu.size()) {
                    val menuItem = menu.getItem(i)
                    menuItems.add(
                        GlassMenuItem(
                            menuItem.itemId, menuItem.icon,
                            menuItem.title.toString()
                        )
                    )
                    adapter.notifyDataSetChanged()
                }
            }
            return super.onCreateOptionsMenu(menu)
        }
        

    Java

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
          final int menuResource = getIntent()
              .getIntExtra(EXTRA_MENU_KEY, EXTRA_MENU_ITEM_DEFAULT_VALUE);
          if (menuResource != EXTRA_MENU_ITEM_DEFAULT_VALUE) {
            final MenuInflater inflater = getMenuInflater();
            inflater.inflate(menuResource, menu);
    
            for (int i = 0; i < menu.size(); i++) {
              final MenuItem menuItem = menu.getItem(i);
              menuItems.add(
                  new GlassMenuItem(menuItem.getItemId(), menuItem.getIcon(),
                      menuItem.getTitle().toString()));
              adapter.notifyDataSetChanged();
            }
          }
          return super.onCreateOptionsMenu(menu);
        }
        
  4. 搭配使用 OnScrollListenerLayoutManagerSnapHelper,藉此判斷已選取的選項。
  5. 監聽 TAP 手勢以處理選單項目選取事件。
  6. 使用已選取的選單項目建立 Intent
  7. 為這個活動設定一個結果並完成設定。
  8. 從您要建立選單的片段或活動呼叫 startActivityForResult。為此,請使用 TAP 手勢。
  9. 覆寫呼叫片段或活動中的 onActivityResult,以處理所選選單項目。

指南規範

以下清單提供設定選單版面配置的建議:

以下是自訂選單版面配置的範例:

這個簡單的圖片顯示了一個背景為黑色背景,其中包含「&#39;MENU 版面配置&#39」字樣,並以螢幕中央為中心,旁邊有電話符號。

請參閱 Card 範例應用程式瞭解實作詳情。

滑動頁面

Glass 螢幕和觸控板可搭配運作,方便您顯示滑動式卡片。您可以使用標準 Android ViewPager API 在活動中建構可滑動的網頁。

進一步瞭解如何使用螢幕投影片訓練說明文件,瞭解如何使用 Android ViewPager 捲動資訊卡或螢幕。