1. 程式人生 > 程式設計 >Android 畫中畫模式的實現示例

Android 畫中畫模式的實現示例

畫中畫支援

Android 8.0(API 級別 26)允許以畫中畫模式啟動 Activity。畫中畫是一種特殊型別的多視窗模式,最常用於視訊播放。使用該模式,使用者可以通過固定到螢幕一角的小視窗觀看視訊,同時在應用之間進行導航或瀏覽主螢幕上的內容。

畫中畫利用 Android 7.0 中的多視窗模式 API 來提供固定的視訊疊加視窗。要將畫中畫新增到您的應用中,您需要註冊支援畫中畫的 Activity、根據需要將 Activity 切換為畫中畫模式,並確保當 Activity 處於畫中畫模式時,介面元素處於隱藏狀態且視訊能夠繼續播放。

畫中畫視窗會顯示在螢幕的最上層,位於系統選擇的一角。您可以將畫中畫視窗拖動到其他位置。當您點按該視窗時,會看到兩個特殊的控制元件:全屏切換開關(位於視窗的中心)和關閉按鈕(右上角的“X”)。

您的應用會控制當前 Activity 在何時進入畫中畫模式。以下是一些示例:

  • Activity 可以在使用者點按主螢幕或最近使用的應用按鈕來選擇其他應用時,進入畫中畫模式。(這就是 Google 地圖在使用者同時執行其他 Activity 時繼續顯示方向的方式。)
  • 您的應用可以在使用者從某個視訊返回以瀏覽其他內容時,將該視訊切換到畫中畫模式。
  • 您的應用可以在使用者觀看到某集內容的結束時將視訊切換到畫中畫模式。主螢幕會顯示有關這部電視劇下一集的宣傳資訊或劇情摘要資訊。
  • 您的應用可以提供一種方式,讓使用者可以在觀看視訊時將其他內容加入播放佇列。當主螢幕顯示內容選擇 Activity 時,視訊會繼續以畫中畫模式播放。

宣告對畫中畫的支援

預設情況下,系統不會自動為應用提供畫中畫支援。要想在應用中支援畫中畫,您可以通過將 android:supportsPictureInPicture 和 android:resizeableActivity 設定為 true,在清單中註冊視訊 Activity。此外,指定您的 Activity 會處理佈局配置更改,這樣一來,在畫中畫模式轉換期間發生佈局更改時,您的 Activity 不會重新啟動。

  <activity android:name="VideoActivity"
    android:resizeableActivity="true"
    android:supportsPictureInPicture="true"
    android:configChanges=
      "screenSize|smallestScreenSize|screenLayout|orientation"
    ...

將您的 Activity 切換到畫中畫模式

要進入畫中畫模式,Activity 必須呼叫 enterPictureInPictureMode()。例如,以下程式碼會在使用者點選應用介面中的專用按鈕時,將 Activity 切換到畫中畫模式:

  @Override
  public void onActionClicked(Action action) {
    if (action.getId() == R.id.lb_control_picture_in_picture) {
      getActivity().enterPictureInPictureMode();
      return;
    }
    ...
  }

您可能需要新增將 Activity 切換到畫中畫模式(而不是進入後臺)的邏輯。例如,如果使用者在 Google 地圖正在導航時按下主螢幕或最近使用的應用按鈕,則該應用會切換到畫中畫模式。您可以通過替換 onUserLeaveHint() 來具體瞭解這種情況:

  @Override
  public void onUserLeaveHint () {
    if (iWantToBeInPipModeNow()) {
      enterPictureInPictureMode();
    }
  }

在畫中畫期間處理介面

當 Activity 進入或退出畫中畫模式時,系統會呼叫 Activity.onPictureInPictureModeChanged() 或 Fragment.onPictureInPictureModeChanged()。

您應替換這些回撥以重新繪製 Activity 的介面元素。請注意,在畫中畫模式下,您的 Activity 會在一個小視窗中顯示。在畫中畫模式下,使用者可能看不清小介面元素的詳細資訊,因此不會與這些介面元素互動。介面極簡的視訊播放 Activity 可提供出色的使用者體驗。Activity 應僅顯示視訊播放控制元件。在 Activity 進入畫中畫模式之前移除其他介面元素,並在 Activity 再次變為全屏時恢復這些元素:

  @Override
  public void onPictureInPictureModeChanged (boolean isInPictureInPictureMode,Configuration newConfig) {
    if (isInPictureInPictureMode) {
      // Hide the full-screen UI (controls,etc.) while in picture-in-picture mode.
    } else {
      // Restore the full-screen UI.
      ...
    }
  }

新增控制元件

畫中畫視窗會在使用者開啟視窗選單(通過點按移動裝置上的視窗或使用電視遙控器選擇選單)時顯示控制元件。

如果應用有一個活躍的媒體會話,則視窗會顯示播放、暫停、下一個和上一個控制元件。

您還可以通過在進入畫中畫模式之前構建 PictureInPictureParams(使用 PictureInPictureParams.Builder.setActions())來明確指定自定義操作,並使用 enterPictureInPictureMode(android.app.PictureInPictureParams) 或 setPictureInPictureParams(android.app.PictureInPictureParams) 在進入畫中畫模式時傳遞這些引數。請注意,如果您嘗試新增的控制元件數量超過 getMaxNumPictureInPictureActions(),則系統只會新增上限數量的控制元件。

在畫中畫模式下繼續播放視訊

當您的 Activity 切換到畫中畫模式時,系統會將該 Activity 置於暫停狀態並呼叫 Activity 的 onPause() 方法。如果該 Activity 在畫中畫模式下暫停,則視訊播放不得暫停,而應繼續播放。

在 Android 7.0 及更高版本中,當系統呼叫 Activity 的 onStop() 時,您應暫停視訊播放;當系統呼叫 Activity 的 onStart() 時,您應恢復視訊播放。這樣一來,您就無需在 onPause() 中檢查應用是否處於畫中畫模式,只需繼續播放視訊即可。

如果您必須在 onPause() 實現中暫停播放,請通過呼叫 isInPictureInPictureMode() 檢查畫中畫模式並相應地處理播放情況,例如:

  @Override
  public void onPause() {
    // If called while in PIP mode,do not pause playback
    if (isInPictureInPictureMode()) {
      // Continue playback
      ...
    } else {
      // Use existing playback logic for paused Activity behavior.
      ...
    }
  }

當您的 Activity 從畫中畫模式切換回全屏模式時,系統會恢復您的 Activity 並呼叫 onResume() 方法。

對單個播放 Activity 使用畫中畫模式

在您的應用中,使用者可能會在主螢幕上瀏覽內容時選擇新的視訊,同時還有一個視訊播放 Activity 正處於畫中畫模式。應以全屏模式在現有的播放 Activity 中播放新的視訊,而不是啟動可能會令使用者感到困惑的新 Activity。

要確保將單個 Activity 用於視訊播放請求並根據需要進入或退出畫中畫模式,請在清單中將 Activity 的 android:launchMode 設定為 singleTask:

  <activity android:name="VideoActivity"
    ...
    android:supportsPictureInPicture="true"
    android:launchMode="singleTask"
    ...

在您的 Activity 中,替換 onNewIntent() 並處理新的視訊,從而根據需要停止任何現有的視訊播放。

最佳做法

低記憶體裝置可能無法使用畫中畫模式。在應用使用畫中畫之前,請務必通過呼叫 hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) 進行檢查以確保可以使用畫中畫。

畫中畫旨在用於播放全屏視訊的 Activity。將 Activity 切換到畫中畫模式時,請避免顯示視訊內容以外的任何內容。跟蹤您的 Activity 何時進入畫中畫模式及隱藏介面元素,如在畫中畫期間處理介面中所述。

由於畫中畫視窗在螢幕的一角顯示為浮動視窗,因此您應避免在主螢幕中可能被畫中畫視窗遮蓋的任何區域內顯示重要資訊。

當 Activity 進入畫中畫模式後,它預設沒有獲得輸入焦點。要在畫中畫模式下接收輸入事件,請使用 MediaSession.setCallback()。如需詳細瞭解如何使用 setCallback(),請參閱顯示“正在播放”卡片。

當您的應用處於畫中畫模式時,畫中畫視窗中的視訊播放可能會對其他應用(例如,音樂播放器應用或語音搜尋應用)造成音訊干擾。為避免出現此問題,請在開始播放視訊時請求音訊焦點,並處理音訊焦點更改通知,如管理音訊焦點中所述。如果您在處於畫中畫模式時收到音訊焦點丟失通知,請暫停或停止視訊播放。

到此這篇關於Android 畫中畫模式的實現示例的文章就介紹到這了,更多相關Android 畫中畫內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!