大數據

優酷APP響應式佈局在消費場景的落地Android | 《優酷響應式佈局技術全解析》第五章

上一章:優酷APP響應式佈局在分發場景的落地 | 《優酷響應式佈局技術全解析》第四章>>>
下一章:優酷響應式在消費場景的落地 iOS | 《優酷響應式佈局技術全解析》第六章>>>

作者| 阿里巴巴文娛技術 吉歐

一、背景

隨著時代的發展,硬件設備的類型也是百花齊放,出現了各種各樣的大屏設備(pad、摺疊屏、車機)及屏幕模式(多屏、分屏),所以對於大屏下響應式的適配很有必要,視頻播放場景的適配在整體適配中屬於比較特殊的一塊,既要兼顧播放渲染,又要照顧橫豎屏切換對適配的影響,同時還要處理各種播放內容展示的處理。本文介紹一下優酷播放場景在響應式適配的一些困難及實現方案。

二、業務介紹

播放頁作為用戶視頻消費場景的落地頁,主要提供包括視頻播放、內容介紹、互動、推薦等。頁面類別及頁面元素都比較複雜,頁面類別有:劇集、電影、綜藝、少兒、體育、新知等;其元素主要有:組件、半屏、tab等。
常見的幾種頁面類別及元素如下圖所示:
image.png

播放頁首屏

image.png

討論tab

image.png
tab展示

image.png

綜藝播放頁

三、播放場景的特殊性

雖然響應式sdk提供了響應式的Activity和Fragment,兩者都通過onResponsiveLayout來回調響應式的變化,從而根據回調的響應式狀態可以判斷是否分屏展示,同時響應式sdk提供了響應式寬度計算及組件間距計算等,可以複用在播放頁,但是對於播放頁的特殊性還是需要單獨處理。
響應式在播放頁,相對於其他場景的特殊性:

1、播放比例適配

需要考慮播放頁在一定屏幕寬度下的展示效果,不能直接按手機上一樣展示,這樣會很寬,並且播放比例也會有問題,所以需要考慮在屏幕寬度達到一定寬度時,分為兩部分的模式以及半屏如何打開;

2、多設配、多模式適配

響應式包含很多的模式,比如華為平行視界、多應用分屏(可拖動),也包含不同的設備,比如摺疊屏、pad(橫豎切換),都需要考慮不同場景下如何適配,尤其在橫豎轉屏之後的處理,尤為複雜。對於不同組件在半屏以及首屏個數、寬度的展示也需要處理;

3、橫豎進入適配

設備可以橫著進入播放頁也可以豎著進入播放頁,對於兩種不同進入方式,以及退出後臺之後切換進入方式以後,狀態保存的處理,也需要適配。

四、適配架構

基於以上三點,如何去解決這些特殊問題以及更好的用戶體驗,整體適配主要依賴於以下的架構來實現。

image.png

播放頁響應式是在統一架構及響應式SDK基礎上實現的,繼承於響應式的Activity或Fragment,從而可以通過響應式回調來處理一些佈局及邏輯展示問題。

在整個上層,實現一套響應式管理類,統一處理響應式下分屏狀態,頁面尺寸及組件根據不同尺寸適配的個數,大小等。最上層則是具體的組件,半屏及分屏策略的實現。

五、適配具體方案

播放頁整體頁面繼承自對應的響應式頁面Activity,從而可以收到響應式變化回調onResponsiveLayout(),達到對整個響應式回調的監聽,對於不同的頁面區域採用Fragment管理的方式。

1、頁面適配:分屏實現

為了解決提到的特殊性播放比例適配的問題,採用在橫屏模式下,播放頁採用左右分屏的模式,將評論移到了右側屏部分,這樣可以讓用戶觀看更多的有趣評論,以增加內容互動性;播放頁橫屏下展示效果如下圖:

image.png

同時半屏也從會在右側打開,既不影響播放,也不會覆蓋左側區域。比如簡介半屏,效果如下:

image.png

具體實現方案:
1)根據適配比例及內容分配,建議將左右兩邊分別拆分成6:4的大小,左邊佔整個屏幕的60%,右側評論部分佔整個屏幕的40%,來方便適配內容展示達到最佳的影片播放效果,通過Guideline來進行分割。

<android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.6"/>

然後兩側採用不同的Fragment來加載,在收到頁面響應式變化回調之後,處理是否展示右側部分邏輯

    @Override
    public void onResponsiveLayout(Configuration configuration, final int responsiveLayoutState, boolean responsiveLayoutStateChanged) {
        //響應式狀態有變化
        if (responsiveLayoutStateChanged) {
            //大屏狀態展示右側區域
           if (responsiveLayoutState == RESPONSIVE_LARGE_LAYOUT) {
               //展開右側區域
        showExpandScreen();
           }else{
        //隱藏右側區域
                hideExpandScreen();
           }
        } else {
            //響應式沒發生變化不做展開右側處理
        }
    }

2)分屏半屏處理
半屏即播放頁可以更多內容展示的一個容器,會覆蓋在原來的視頻播放頁部分。在橫屏下半屏展示在右側區域(如上圖),在豎屏下,半屏在播放器下部分展示(如下圖),所以對於半屏其實有三種狀態展示,小屏下半屏,大屏橫屏下半屏,大屏豎屏下半屏;

在半屏適配時,採用不同view加載的方式,小屏下展示半屏:由於小屏下是一個單獨的Fragment,所以只考慮在內部計算半屏的容器即可以實現播放器下部展示;

對於大屏下,是另一個Fragment,需要考慮在橫屏及豎屏下有不同的展示,所以採用兩個view的方式,不同的展開狀態會有不同的半屏view,在這個不同的view上add半屏的fragment,這個時候需要注意view的管理,不能出現佈局加載錯亂的問題,導致addview的時候出現NPE的問題。

 //響應式半屏處理
if (DetailUtil.isSurportResponsive(getActivity())) {
    //有右側展開區域,則採用右側區域view
    if (ResponseLayoutManager.getHasGuideLine()){
        mContainerLayout = mRootView.getRootView().findViewById(R.id.responsive_half_screen_land_container);
    } else {
        //沒有右側展開區域,直接調用豎直方向view
        mContainerLayout = mRootView.getRootView().findViewById(R.id.responsive_half_screen_portrait_container);
    }

    mContainerLayout.setVisibility(View.VISIBLE);
} else {
    //非響應式採用直接fragment的veiw
    mContainerLayout = mRootView.findViewById(R.id.half_screen_container);
}

image.png

半屏效果

2、組件適配

播放頁有近20+個組件,不可能每個組件都適配一次,所以最重要的是如何利用統一架構實現最小邏輯處理。基於此目標,將組件分為三類適配:

1) 帶有半屏組件統一處理
即該組件可以打開半屏,因為之前已經提到過在大屏橫屏下半屏會在右側展開區域展示,而右側區域的大小隨著設備,大屏模式的不同,寬度會不同,根據響應式sdk提供的容器寬度計算組件列數的方法(可參考響應式sdk的列數適配),處理後效果如下,左邊屏幕選集展示9個,但是在右側部分因為容器較小,展示6個,其他組件類似。在屏幕變化時,佈局個數會做出相應的變化以適配不同的屏幕。

image.png

2)組件個數根據屏幕大小適配
比如相關雙列(手機屏默認展示2列),banner(默認展示2個),這類組件之前已經寫死了個數,所以在處理的時候,需要根據屏幕的變化來更改展示的個數,比如相關雙列,會隨著屏幕的變化在2列和3列之間變化(多屏下可以拖動改變屏幕比例)其他類似,效果如下:

image.png

三列

image.png

雙列

在手機上會顯示2列,在大屏下會根據計算,適配成3列。

3、全屏承接頁適配

image.png

全屏展示

全屏適配主要問題在於橫屏下分兩個區域時候會出現問題:由於橫屏下分兩個Fragment來處理,所以在這種狀態下直接在Fragment上打開另外一個view,會出現這個view只展示在一側。比如下載按鈕會打開一個新的Fragment,而此時下載是在左側區域的Fragment中,如果直接打開則打開的頁面只在左側區域展示下載列表,右側還是評論,這樣不符合預期。

因此,在這種模式下,需要增加一個全屏的view,用這個view來加載打開的Fragment,而如果在橫屏或者小屏下,還用左側區域fragment的view來加載。
這個處理同樣要管理好view的使用,防止NPE的錯誤,所以在架構圖中的響應式管理類尤為必要,只有通過這個響應式管理類才能知道目前頁面狀態以及相關的操作。

4、播放器適配

播放器部分的適配相對比較簡單,因為之前已經做過相關尺寸的處理,具體存在的問題有:

1) pad很多都是在屏幕上的挖孔屏,所以適配時要留出挖孔位置,同時注意要處理兩個部分,因為屏幕是可以旋轉的左上角及右下角的位置都應該注意處理;

2) 播放view渲染的處理,在響應式下,屏幕的大小會隨時修改的,所以要能順暢播放,需要做到播放view可以支持根據父view的大小,隨時渲染視頻的大小。

六、總結

以上列出了播放頁在適配的時候遇到的一些主要問題及解決方案,響應式適配的細節處理尤為重要,下面總結一些適配經驗:

1、 尺寸實時計算:要根據一套尺寸計算算法能夠適配多種場景,並且是實時的計算適配。不能根據設備來判斷處理,而是要根據尺寸來判斷處理邏輯;

2、 統一管理:一套完善的管理類來管理狀態及記錄當前屏幕狀態,這樣才能更好的支持上游邏輯。避免造成各種狀態錯亂問題;

3、 提煉共性,組件化思維:對於具有共性的模塊或者業務比如組件,需要思考從中找出共性,儘可能做到一個計算處理就能達到整個模塊的處理,避免每個都進行修改處理,增加維護成本;

4、 未來,大屏的右半屏將“大有可為”:在大屏上右半屏可以做更多的事,讓用戶看到更多想看的內容,提供更多的內容曝光及選擇。

Leave a Reply

Your email address will not be published. Required fields are marked *