開發應用程式

以下資源適用於應用程式開發人員。

如要讓應用程式支援旋轉功能,您必須「必須」符合下列要求:

  1. FocusParkingView 放入對應的活動版面配置中。
  2. 確認可 (或無法) 聚焦的檢視畫面。
  3. 使用 FocusArea 納入所有可聚焦檢視畫面,但 FocusParkingView

以下詳細說明各個工作設定完的環境後, 開發支援旋轉功能的應用程式。

設定旋轉控制器

你必須使用旋轉控制器,才能開始開發支援旋轉控制器的應用程式 或獨立屬性您可以選擇下列做法。

模擬器

source build/envsetup.sh && lunch car_x86_64-userdebug
m -j
emulator -wipe-data -no-snapshot -writable-system

您也可以使用 aosp_car_x86_64-userdebug

如何存取模擬的旋轉控制器:

  1. 輕觸工具列底部的三點圖示:

    存取模擬的旋轉控制器
    圖 1.存取模擬旋轉控制器
  2. 在擴充控制項視窗中選取「汽車旋轉」

    選取汽車旋轉
    圖 2.選取「汽車旋轉」

USB 鍵盤

  • 將 USB 鍵盤插入搭載 Android Automotive OS (AAOS) 的裝置。在某些情況下, 如此一來,螢幕小鍵盤就不會顯示。
  • 使用 userdebugeng 版本。
  • 啟用重要事件篩選功能:
    adb shell settings put secure android.car.ROTARY_KEY_EVENT_FILTER 1
    
  • 請參閱下表瞭解各動作的對應按鍵:
    旋轉動作
    Q 逆時針旋轉
    E 順時針旋轉
    A 左推
    D 右推
    W 上推
    S 下推
    F 或半形逗號 中間按鈕
    R 或 Esc 「返回」按鈕

ADB 指令

您可以使用 car_service 指令來插入旋轉輸入事件。這些指令 可在搭載 Android Automotive OS (AAOS) 的裝置或模擬器上執行。

car_service 指令 旋轉輸入
adb shell cmd car_service inject-rotary 逆時針旋轉
adb shell cmd car_service inject-rotary -c true 順時針旋轉
adb shell cmd car_service inject-rotary -dt 100 50 逆時針旋轉多次 (100 毫秒前和 50 毫秒前)
adb shell cmd car_service inject-key 282 左推
adb shell cmd car_service inject-key 283 右推
adb shell cmd car_service inject-key 280 上推
adb shell cmd car_service inject-key 281 下推
adb shell cmd car_service inject-key 23 按下中間的按鈕
adb shell input keyevent inject-key 4 點選「返回」按鈕

原始設備製造商 (OEM) 旋轉控制器

當旋轉控制器硬體開始運作時,這是 實際可行的選擇特別適合用於測試快速旋轉。

FocusParkingView

FocusParkingViewCar UI 程式庫 (car-ui-library)RotaryService 會使用此符號來支援旋轉控制器導覽功能。 FocusParkingView必須是第一個可聚焦的檢視畫面 版面配置其必須放在所有 FocusArea 之外。每個視窗都必須 FocusParkingView。如果您已使用 Car-ui-library 基礎版面配置 (包含 FocusParkingView) 中,您不需要另外新增 FocusParkingView。以下為 FocusParkingView 範例 RotaryPlayground

<FrameLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
   <com.android.car.ui.FocusParkingView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
   <FrameLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent"/>
</FrameLayout>

以下是需要 FocusParkingView 的原因:

  1. 當焦點位於其他視窗時,Android 不會自動清除焦點。如果發生以下情況: 嘗試清除上一個視窗的焦點,Android 將重新對焦該視窗的檢視畫面 會導致兩個視窗同時聚焦。新增 FocusParkingView 每個視窗都可修正此問題這個檢視畫面是透明的,其預設焦點項目 因此無論焦點是否聚焦,使用者都無法看到這類內容。 此項目可對焦,讓 RotaryService 能夠停車焦點 即可移除焦點醒目顯示內容
  2. 如果目前視窗中只有一個 FocusArea,請旋轉控制器 在FocusArea中,RotaryService 移動焦點 從右側檢視畫面到左側的檢視畫面 (反之亦然)。正在新增此檢視 問題。當 RotaryService 決定焦點時 目標是為 FocusParkingView,以判斷繞行即將結束 發生這種問題時,系統不會移動焦點,避免迴轉到周圍。
  3. 旋轉控制項啟動應用程式時,Android 會聚焦在第一個可聚焦的檢視畫面。 而一律為 FocusParkingViewFocusParkingView 判斷要聚焦的最佳檢視畫面,然後再套用焦點

可聚焦的檢視畫面

RotaryService 是以 Android 架構的 現有 檢視焦點的概念,回溯到手機配有實體鍵盤和 D-Pad 的時間。 現有的 android:nextFocusForward 屬性已用於旋轉 (請參閱「FocusArea 自訂」一節),但 android:nextFocusLeftandroid:nextFocusRightandroid:nextFocusUpandroid:nextFocusDown 不是。

RotaryService 只著重在值得關注的檢視畫面。部分觀看次數 例如 Button 通常是可聚焦的其他,例如 TextViewViewGroup 通常是不會有的可自動聚焦的檢視畫面會自動聚焦 設有點擊事件監聽器時可以點擊如果這項自動邏輯產生了 可聚焦性,您不需要明確設定檢視畫面的可聚焦性。如果自動邏輯 要呈現想要的可聚焦性,請將 android:focusable 屬性設為 truefalse,或透過程式輔助方式設定檢視區塊的可聚焦性 View.setFocusable(boolean)。「RotaryService」必須聚焦檢視畫面,才能將焦點放在這個地方 須符合下列條件:

  • 可聚焦
  • 已啟用
  • 顯示
  • 寬度和高度的值不得為零

如果檢視畫面不符合所有規定,例如某個可聚焦但已停用的按鈕, 使用者就無法透過旋轉控制項聚焦焦點。如要聚焦在停用的檢視畫面 考慮使用自訂狀態 (而不是 android:state_enabled) 來控制 就會出現,但不會指出 Android 應將其視為停用。您的應用程式可以根據 使用者輕觸時,檢視畫面停用的原因。我們將在下一節說明操作方式。

自訂狀態

如何新增自訂狀態:

  1. 如何新增自訂屬性 。例如,若要將 state_rotary_enabled 自訂狀態新增至 CustomView 檢視畫面類別,請使用:
    <declare-styleable name="CustomView">
        <attr name="state_rotary_enabled" format="boolean" />
    </declare-styleable>
    
  2. 如要追蹤這個狀態,請在檢視畫面中新增例項變數,以及存取子方法:
    private boolean mRotaryEnabled;
    public boolean getRotaryEnabled() { return mRotaryEnabled; }
    public void setRotaryEnabled(boolean rotaryEnabled) {
        mRotaryEnabled = rotaryEnabled;
    }
    
  3. 如何在建立檢視畫面時讀取屬性值:
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
    mRotaryEnabled = a.getBoolean(R.styleable.CustomView_state_rotary_enabled);
    
  4. 在檢視區塊類別中覆寫 onCreateDrawableState() 方法,然後 並視情況新增自訂狀態例如:
    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        if (mRotaryEnabled) extraSpace++;
        int[] drawableState = super.onCreateDrawableState(extraSpace);
        if (mRotaryEnabled) {
            mergeDrawableStates(drawableState, { R.attr.state_rotary_enabled });
        }
        return drawableState;
    }
    
  5. 根據檢視狀態,讓檢視畫面的點擊處理常式以不同方式執行。舉例來說, 點擊處理常式可能不會執行任何動作,或者可能會在 mRotaryEnabledfalse
  6. 如要停用按鈕顯示功能,請在檢視畫面的背景可繪項目中使用 app:state_rotary_enabled 取代 android:state_enabled。 如果您還沒有,請視需要新增:
    xmlns:app="http://schemas.android.com/apk/res-auto"
    
  7. 如果有任何版面配置的檢視畫面遭到停用,請將 android:enabled="false" 替換為 app:state_rotary_enabled="false",然後新增 app 命名空間 。
  8. 如果檢視畫面以程式輔助方式停用,請替換對 setEnabled() 的呼叫 呼叫 setRotaryEnabled()

重點領域

使用 FocusAreas 將可聚焦的檢視畫面分割為區塊,以便進行導覽 以便與其他應用程式一致舉例來說,如果應用程式有工具列,工具列 應位於與應用程式其餘部分的 FocusArea 中。分頁列和 也應將其他導覽元素與應用程式的其餘部分區隔開來。大型清單 通常應有自己的 FocusArea。否則,使用者必須 來變更整份清單

FocusArea 是 car-ui-library 中 LinearLayout 的子類別。 啟用此功能後,FocusArea 會在任一處繪製醒目顯示文字 並聚焦於子系詳情請參閱: 將焦點移至自訂功能

在版面配置檔案中建立導覽區塊時,如果您想使用 做為該區塊的容器,請改用 LinearLayout,請改用 FocusArea。 否則,請將區塊納入 FocusArea 中。

「請勿」在其他 FocusArea 中建立巢狀結構的 FocusArea。 這麼做會導致未定義的導覽行為。確認所有可聚焦的檢視區塊 巢狀結構在 FocusArea 中。

以下應用程式的 FocusArea 範例: RotaryPlayground 顯示如下:

<com.android.car.ui.FocusArea
       android:layout_margin="16dp"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical">
       <EditText
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:singleLine="true">
       </EditText>
   </com.android.car.ui.FocusArea>

FocusArea 的運作方式如下:

  1. 處理旋轉和自動提醒動作時,RotaryService 會尋找執行個體 FocusArea)。
  2. 收到旋轉事件時,RotaryService 會將焦點移至其他 可查看同一 FocusArea 中可聚焦的檢視畫面。
  3. 收到自動提醒事件時,RotaryService 將焦點移至其他檢視畫面 能聚焦另一個 (通常是相鄰) FocusArea 的 Pod

如果未在版面配置中加入任何 FocusAreas,則系統會將根層級檢視畫面視為 做為隱含的重點領域無法提醒使用者在應用程式中瀏覽。而是 這些檢視區塊會旋轉所有可聚焦的檢視區塊,或許適合用於對話方塊。

FocusArea 自訂

下列兩個標準檢視屬性可用於自訂旋轉導覽:

  • android:nextFocusForward 可讓應用程式開發人員指定 在重點區域中排序這個屬性是用來控制 。請勿使用這個屬性建立迴圈。 請改用 app:wrapAround (請見下文) 建立迴圈。
  • android:focusedByDefault 可讓應用程式開發人員指定 視窗中的預設焦點檢視畫面請不要使用這項屬性和 在同一個 FocusArea 中的 app:defaultFocus (請見下方說明)。

FocusArea 也會定義一些屬性,以自訂旋轉導覽。 您無法透過這些屬性自訂隱含的重點區域。

  1. (Android 11 QPR3、Android 11 汽車、 Android 12)
    app:defaultFocus 可用於 指定可聚焦子系檢視畫面的 ID,當使用者執行這個動作時 就會前往這個 FocusArea
  2. (Android 11 QPR3、Android 11 汽車、 Android 12)
    app:defaultFocusOverridesHistory 可設為 true,讓上方指定的檢視畫面即使在 記錄顯示這個FocusArea中的另一個檢視畫面。
  3. (Android 12)。
    使用 app:nudgeLeftShortcutapp:nudgeRightShortcutapp:nudgeUpShortcutapp:nudgeDownShortcut 指定可聚焦子系檢視畫面的 ID,且應聚焦於 但提示使用者自動按照指定方向進行提醒如需更多資訊,請參閱 自動提醒快速鍵

    (Android 11 QPR3、Android 11 汽車、 已於 Android 12 淘汰) app:nudgeShortcutapp:nudgeShortcutDirection 僅支援一個提醒捷徑。

  4. (Android 11 QPR3、Android 11 汽車、 Android 12)
    如要啟用旋轉功能以包裝在這個 FocusArea 中,app:wrapAround 可設為 true。這通常用在將視圖編排為 圓形或橢圓形。
  5. (Android 11 QPR3、Android 11 汽車、 Android 12)
    如何調整醒目顯示的邊框間距 此FocusArea,使用 app:highlightPaddingStartapp:highlightPaddingEndapp:highlightPaddingTopapp:highlightPaddingBottomapp:highlightPaddingHorizontal、 和 app:highlightPaddingVertical
  6. (Android 11 QPR3、Android 11 汽車、 Android 12)
    如要調整這個 FocusArea 的感知邊界,以便找出微調目標, 使用 app:startBoundOffsetapp:endBoundOffsetapp:topBoundOffsetapp:bottomBoundOffsetapp:horizontalBoundOffsetapp:verticalBoundOffset
  7. (Android 11 QPR3、Android 11 汽車、 Android 12)
    如要明確指定 相鄰的 FocusArea (或區域),請使用 app:nudgeLeftapp:nudgeRightapp:nudgeUpapp:nudgeDown。預設使用的幾何圖形搜尋方式 找不到需要的目標

自動提醒通常會在 FocusAreas 之間導覽。但有了自動提醒捷徑 自動提醒功能有時會先在 FocusArea 內瀏覽,因此使用者可能需要 輕按兩下即可前往下一個 FocusArea。自動提醒快速鍵非常實用 如果 FocusArea 包含長清單,後面接著 a 懸浮動作按鈕、 如以下範例所示:

提醒捷徑
圖 3. 自動提醒捷徑

如果不設定提醒捷徑,使用者就必須旋轉整份清單才能找到 懸浮動作按鈕 (FAB)

自訂醒目顯示重點自訂功能

如上所述,RotaryService 以 Android 架構現有的概念為基礎 檢視焦點當使用者旋轉和微調時,RotaryService 會移動焦點。 然後取消焦點在 Android 中,聚焦於檢視畫面時,如果檢視區塊:

  • 已指定專屬的焦點醒目顯示內容,Android 會繪製檢視畫面的焦點醒目顯示內容。
  • 未指定焦點醒目顯示,且未停用預設焦點醒目顯示功能。Android 為檢視畫面繪製預設的焦點醒目顯示。

專為觸控設計的應用程式通常不會指定適當的焦點醒目顯示。

預設的焦點醒目顯示功能是由 Android 架構提供,可覆寫 。應用程式開發人員收到所使用的主題源自於 Theme.DeviceDefault

為提供一致的使用者體驗,請盡可能使用預設的焦點醒目顯示功能。 如果需要自訂焦點 (例如圓形或枕頭),或者: 使用不是衍生自 Theme.DeviceDefault 的主題,請使用 car-ui-library 為每個檢視畫面指定您專屬的焦點醒目顯示內容。

如要為檢視區塊指定自訂焦點醒目顯示,請變更背景或前景可繪項目 當焦點移至檢視區塊時,可繪項目就會變為不同的可繪項目。通常,您應該 背景工作。下列可繪項目 (如果用作正方形檢視畫面的背景) 會產生圓形焦點亮點:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_focused="true" android:state_pressed="true">
      <shape android:shape="oval">
         <solid android:color="@color/car_ui_rotary_focus_pressed_fill_color"/>
         <stroke
            android:width="@dimen/car_ui_rotary_focus_pressed_stroke_width"
            android:color="@color/car_ui_rotary_focus_pressed_stroke_color"/>
      </shape>
   </item>
   <item android:state_focused="true">
      <shape android:shape="oval">
         <solid android:color="@color/car_ui_rotary_focus_fill_color"/>
         <stroke
            android:width="@dimen/car_ui_rotary_focus_stroke_width"
            android:color="@color/car_ui_rotary_focus_stroke_color"/>
      </shape>
   </item>
   <item>
      <ripple...>
         ...
      </ripple>
   </item>
</selector>

(Android 11 QPR3、Android 11 汽車、 Android 12) 粗體資源參照 上方列出 Car-ui-library 定義的資源原始設備製造商 (OEM) 會覆寫這些屬性,以便保持一致 以它們指定的預設焦點醒目顯示內容這可確保焦點醒目顯示顏色 筆劃寬度等等,使用者透過自訂焦點在檢視畫面之間導覽時不會改變 並醒目顯示具有預設焦點的檢視畫面最後一個項目是用於輕觸的漣漪。 粗體資源使用的預設值如下:

粗體資源的預設值
圖 4. 粗體資源的預設值

此外,如果按鈕為純色,系統就會呼叫自訂焦點醒目顯示功能 背景顏色,以吸引使用者的注意力,如下例所示。這樣一來 難以辨識焦點醒目顯示內容。在這種情況下,請使用 Secondary 顏色:

純色背景顏色
  • (Android 11 QPR3、Android 11 汽車、 Android 12)

    car_ui_rotary_focus_fill_secondary_color car_ui_rotary_focus_stroke_secondary_color
  • (Android 12)。

    car_ui_rotary_focus_pressed_fill_secondary_color car_ui_rotary_focus_pressed_stroke_secondary_color

例如:

已聚焦,未按下 專注、已按下
專注,未按下 專注、已按下

旋轉捲動

如果您的應用程式使用 RecyclerView,則應使用 CarUiRecyclerView。這可確保 UI 能與 其他的原因是 OEM 自訂內容適用於所有 CarUiRecyclerView

如果清單中的元素都是可聚焦的元素,就不需採取其他動作。 旋轉導覽功能可移動焦點來瀏覽清單中的元素,同時捲動清單 即可看到新聚焦的元素

(Android 11 QPR3、Android 11 汽車、 Android 12)
如果同時出現無法聚焦和無法聚焦的情況 元素;或者如果所有元素都無法聚焦,您可以啟用旋轉捲動功能, 使用者可以使用旋轉控制器逐步捲動清單而不需略過 未聚焦的項目。如要啟用旋轉捲動功能,請設定 app:rotaryScrollEnabled 屬性設為 true

(Android 11 QPR3、Android 11 汽車、 Android 12)
你可以啟用任何的旋轉功能 可捲動檢視畫面,包括 avCarUiRecyclerView,並使用 CarUiUtils 中的 setRotaryScrollEnabled() 方法。這麼一來 請完成下列操作:

  • 將可捲動的檢視畫面設為可聚焦,這樣在沒有任何元素時就會聚焦 可聚焦子系檢視畫面
  • 呼叫以下方法,在可捲動檢視畫面上停用預設的焦點醒目顯示功能: setDefaultFocusHighlightEnabled(false) 會讓可捲動的檢視畫面 似乎未專心
  • 呼叫 setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS)
  • 使用 SOURCE_ROTARY_ENCODERAXIS_VSCROLLAXIS_HSCROLL 表示捲動的距離 (透過符號輸入)。

CarUiRecyclerView 上啟用旋轉捲動功能,且使用者旋轉時 在沒有可聚焦檢視畫面的區域時,捲軸會從灰色變成藍色 表示已聚焦捲軸。您也可以視需要實作類似的效果。

MotionEvents 與滑鼠滾輪產生的相同。 但來源除外

直接操控模式

一般來說,使用提醒和旋轉功能可瀏覽使用者介面,而按下中央按鈕 採取行動,但並非一定的情況。舉例來說,如果使用者想調整 鬧鐘音量時,他們可能會使用旋轉控制器前往音量滑桿、按下 中間按鈕,旋轉控制器以調整鬧鐘音量,然後按下「返回」按鈕 即可返回導航。這就是所謂的「直接操縱 (DM)」模式。在本 模式時,旋轉控制器可直接與檢視畫面互動,而不是進行導覽。

你可以透過下列兩種方式導入即時訊息。如果您只想處理旋轉和需要的檢視畫面 來操控對 ACTION_SCROLL_FORWARD 的回應 ACTION_SCROLL_BACKWARD AccessibilityEvent 正確,請使用 簡單機制。否則,請使用進階機制。

簡單的機制是系統視窗中唯一的選項;應用程式可以使用任一機制。

簡單的機制

(Android 11 QPR3、Android 11 汽車、 Android 12)
應用程式應呼叫 DirectManipulationHelper.setSupportsRotateDirectly(View view, boolean enable)RotaryService 可辨識使用者是否處於即時訊息模式,並在使用者進入即時訊息模式時啟用 聚焦檢視畫面時,按下中間按鈕。在即時訊息模式下,旋轉會執行 ACTION_SCROLL_FORWARDACTION_SCROLL_BACKWARD,離開即時訊息模式 當使用者按下返回按鈕時。簡單的機制會切換 顯示使用者進入及離開即時訊息模式的畫面。

為提供使用者處於即時訊息模式的視覺提示,請分別顯示不同的檢視畫面 物件例如在何時變更背景 android:state_selectedtrue

進階機制

應用程式可決定RotaryService何時進入及結束即時訊息模式。以一致的方式 使用者體驗時,如果將焦點移至即時訊息檢視畫面,按下中間按鈕就能進入即時訊息模式 和「返回」按鈕就會離開即時訊息模式。如果未使用中央按鈕和/或自動提醒 他們可以以其他方式退出即時訊息模式。在應用程式 (例如 Google 地圖) 中, 即時訊息可用來進入即時訊息模式。

如要支援進階即時訊息模式,資料檢視:

  1. (Android 11 QPR3、Android 11 汽車、 Android 12)) 必須監聽 KEYCODE_DPAD_CENTER 事件,藉此進入即時訊息模式,並監聽 KEYCODE_BACK 事件來退出即時訊息模式。 在每個案例中呼叫 DirectManipulationHelper.enableDirectManipulationMode() 如要監聽這些事件,請執行下列任一操作:
    • 註冊 OnKeyListener
    • 或者
    • 擴充檢視畫面,然後覆寫其 dispatchKeyEvent() 方法。
  2. 應監聽自動提醒事件 (KEYCODE_DPAD_UPKEYCODE_DPAD_DOWNKEYCODE_DPAD_LEFTKEYCODE_DPAD_RIGHT) 表示檢視區塊應該 處理自動提醒的功能
  3. 應聆聽 MotionEvent 的音訊並取得 AXIS_SCROLL的旋轉次數資料 。您可以透過下列方式證明自己的身分:
    1. 註冊 OnGenericMotionListener
    2. 擴充檢視畫面,並覆寫其 dispatchTouchEvent() 方法。
  4. 為避免卡在即時訊息模式中,在「片段」或「活動」檢視畫面時,「必須」退出 DM 模式 屬於 不具互動性質。
  5. 應提供視覺提示,說明目前的檢視畫面為即時訊息模式。

以下提供使用 DM 模式來平移與縮放地圖的自訂檢視範例:

/** Whether this view is in DM mode. */
private boolean mInDirectManipulationMode;

/** Initializes the view. Called by the constructors. */ private void init() { setOnKeyListener((view, keyCode, keyEvent) -> { boolean isActionUp = keyEvent.getAction() == KeyEvent.ACTION_UP; switch (keyCode) { // Always consume KEYCODE_DPAD_CENTER and KEYCODE_BACK events. case KeyEvent.KEYCODE_DPAD_CENTER: if (!mInDirectManipulationMode && isActionUp) { mInDirectManipulationMode = true; DirectManipulationHelper.enableDirectManipulationMode(this, true); setSelected(true); // visually indicate DM mode } return true; case KeyEvent.KEYCODE_BACK: if (mInDirectManipulationMode && isActionUp) { mInDirectManipulationMode = false; DirectManipulationHelper.enableDirectManipulationMode(this, false); setSelected(false); } return true; // Consume controller nudge events only when in DM mode. // When in DM mode, nudges pan the map. case KeyEvent.KEYCODE_DPAD_UP: if (!mInDirectManipulationMode) return false; if (isActionUp) pan(0f, -10f); return true; case KeyEvent.KEYCODE_DPAD_DOWN: if (!mInDirectManipulationMode) return false; if (isActionUp) pan(0f, 10f); return true; case KeyEvent.KEYCODE_DPAD_LEFT: if (!mInDirectManipulationMode) return false; if (isActionUp) pan(-10f, 0f); return true; case KeyEvent.KEYCODE_DPAD_RIGHT: if (!mInDirectManipulationMode) return false; if (isActionUp) pan(10f, 0f); return true; // Don't consume other key events. default: return false; } });
// When in DM mode, rotation zooms the map. setOnGenericMotionListener(((view, motionEvent) -> { if (!mInDirectManipulationMode) return false; float scroll = motionEvent.getAxisValue(MotionEvent.AXIS_SCROLL); zoom(10 * scroll); return true; })); }
@Override public void onPause() { if (mInDirectManipulationMode) { // To ensure that the user doesn't get stuck in DM mode, disable DM mode // when the fragment is not interactive (e.g., a dialog shows up). mInDirectManipulationMode = false; DirectManipulationHelper.enableDirectManipulationMode(this, false); } super.onPause(); }

如需更多範例,請前往 RotaryPlayground 項專案。

活動檢視畫面

使用 ActivityView 時:

  • ActivityView 不應設為可聚焦。
  • (Android 11 QPR3、Android 11 汽車、 已於 Android 11 淘汰)
    ActivityView的內容「必須」包含 FocusParkingView 做為第一個可聚焦檢視畫面,而其 app:shouldRestoreFocus 屬性必須設為 false
  • ActivityView 的內容不應 android:focusByDefault 次觀看。

對使用者而言,除了聚焦焦點,ActivityView 不應對導覽產生任何影響 區域不能橫跨 ActivityView換句話說,不能只有一個重點領域 在 ActivityView 內部 之外的內容。如果您不新增 任何 FocusAreas 至 ActivityView,此為檢視區塊階層的根層級 系統會將 ActivityView 視為隱含的焦點區域。

按住時可使用的按鈕

大多數按鈕會在點選時帶來某些動作。部分按鈕在按住時仍可運作。 例如,「快轉」和「倒轉」按鈕通常在按住時通常可以運作。為了 按鈕支援旋轉,監聽 KEYCODE_DPAD_CENTER KeyEvents 如下所示:

mButton.setOnKeyListener((v, keyCode, event) ->
{
    if (keyCode != KEYCODE_DPAD_CENTER) {
        return false;
    }
    if (event.getAction() == ACTION_DOWN) {
        mButton.setPressed(true);
        mHandler.post(mRunnable);
    } else {
        mButton.setPressed(false);
        mHandler.removeCallbacks(mRunnable);
    }
    return true;
});

以下情況是 mRunnable 採取動作 (例如倒轉) 並排程自行執行 執行特定工作

觸控模式

使用者可以使用旋轉控制器,以兩種方式與車用車用運算主機互動。 使用旋轉控制器或輕觸螢幕。使用旋轉控制器時 其中一個可聚焦的檢視畫面會醒目顯示輕觸螢幕時,將焦點不聚焦 出現。使用者隨時可以切換下列輸入模式:

  • 旋轉 → 輕觸。當使用者輕觸螢幕,焦點醒目顯示便會消失。
  • 輕觸 → 旋轉。當使用者微調、旋轉或按下中央按鈕時, 畫面上隨即顯示焦點醒目顯示。

「返回」和「主畫面」按鈕不會對輸入模式造成任何影響。

Android 現有的 觸控模式。 別擔心!您可以使用 View.isInTouchMode() 以決定使用者所用的輸入模式。別擔心!您可以使用 OnTouchModeChangeListener 監聽變更。雖然可用來自訂目前使用者介面的 輸入模式,避免任何重大變更,以免造成混淆。

疑難排解

在專為觸控設計的應用程式中,通常會有巢狀可聚焦檢視畫面。 例如 ImageButton 周圍的 FrameLayout 兩者都可聚焦這樣做不會對觸控造成損害,但可能導致品質不佳 因為使用者必須旋轉控制器兩次才能移動到旋轉畫面 下個單元將介紹為了提供良好的使用者體驗,Google 建議您採取以下其中一種做法: 可聚焦的外層或內部檢視畫面,但兩者只能擇一。

按下旋轉控制器時,如果按鈕或開關失去焦點, 可能適用的條件如下:

  • 有些原因造成按鈕或切換按鈕停用 (短暫或無限期) 按鈕已按下。不論是哪一種情況,你都可以透過兩種方式來解決問題:
    • android:enabled 狀態保留為 true,並使用自訂 切換為灰色狀態, 自訂狀態
    • 使用容器圍繞按鈕或切換開關,讓容器可聚焦 而非按鈕或切換按鈕(點擊事件監聽器必須位於容器上)。
  • 我們即將替換按鈕或切換按鈕。例如按鈕後採取的動作 按下切換按鈕或切換鈕可能會觸發系統重新整理可用的動作 新按鈕取代現有按鈕。解決方法有兩種:
    • 您不必建立新的按鈕或切換按鈕,而是設定 現有按鈕或切換按鈕
    • 如上所述,在按鈕或切換鈕周圍新增可聚焦的容器。

旋轉遊樂場

RotaryPlayground 是旋轉功能的參考應用程式。使用這項工具即可瞭解如何整合 將旋轉功能導入應用程式RotaryPlayground 包含在模擬器版本中, 建構適用於搭載 Android Automotive OS (AAOS) 的裝置。

  • RotaryPlayground 存放區:packages/apps/Car/tests/RotaryPlayground/
  • 版本:Android 11 QPR3、Android 11 車、 與 Android 12

RotaryPlayground 應用程式左側會顯示下列分頁:

  • 資訊卡:測試在重點區域上的導覽情形,並略過無法聚焦的元素 輸入文字
  • 直接操控。測試支援簡易與進階的小工具 直接操縱模式這個分頁專門用於直接操控 應用程式視窗。
  • Sys UI 操縱:測試支援直接操控的小工具 系統視窗中僅支援簡易直接操作模式。
  • 網格。測試包含捲動的 Z 模式旋轉導覽。
  • 通知。測試抬頭通知的自動提醒功能。
  • 捲動。測試捲動瀏覽可聚焦和無法聚焦的組合 內容。
  • WebView:測試在 WebView 中透過連結進行導覽的情形。
  • 自訂 FocusArea測試 FocusArea 自訂功能:
    • 總結。
    • android:focusedByDefaultapp:defaultFocus
    • ,直接在 Google Cloud 控制台實際操作。
    • 明確的提醒目標。
    • 自動提醒捷徑。
    • FocusArea,沒有可聚焦的檢視畫面。