上一章: 優酷APP響應式布局技術概述 | 《優酷響應式布局技術全解析》第一章>>> 下一章: 優酷APP響應式布局技術之iOS篇 | 《優酷響應式布局技術全解析》第三章>>> 作者| 阿裡巴巴文娛技術 叮東
一、背景
傳統的多終端适配方案,是為大尺寸Pad開發一個特定的HD版本。但是目前支援Android系統的裝置類型越來越豐富,不同類型的裝置尺寸也越來越多樣化,特定的HD版本并不能解決所有裝置尺寸上的适配問題,同時開發團隊也難以保持多端相同的開發人力投入,App如何在這麼多尺寸的裝置上,為使用者提供較為一緻的浏覽體驗,是多終端适配的難點。

為了解決多終端适配的問題,優酷應用中心技術團隊開啟了響應式的技術預研,在8月份版本中,全面上線了響應式。經過實際的資料對比,效果達到預期。本文将分享優酷響應式的技術實作和落地方法,希望對所有APP的開發同學有所啟發。
二、Android響應式方案
響應式的核心是拉通多終端的适配規則,開發一套界面,一個APP相容多尺寸終端裝置的顯示,能夠根據使用者的行為以及裝置的環境(螢幕尺寸、螢幕方向、是否分屏等)進行相應的頁面布局以及容器尺寸的調整,為使用者提供更加舒适的界面和更好的使用者體驗。
1、響應式SDK
App的每個頁面支援響應式,開發成本是很高的。
響應式SDK,就是為了解決App在不同尺寸裝置下的适配問題,把裝置的螢幕資訊、容器布局規則(列數、尺寸)、業務資料二次加工等行為進行統一管理,以适應新的螢幕尺寸。
2、加載流程設計
通用的頁面加載流程,通常都是從資料傳回開始,資料解析完成後,進行頁面布局渲染以及容器布局渲染。響應式在通用加載流程的基礎上,加入了響應式狀态變化通知、響應式資料剪裁、響應式頁面布局、響應式容器布局等流程。
具體加載的流程分為兩種情況:
1)使用者請求資料;
2)螢幕尺寸發生變化;
3、架構設計
優酷各個業務開發團隊,使用了統一的業務架構,我們在統一架構的基礎上進行響應式适配,提供了響應式SDK,拉通各個業務方不同頁面的适配規則,確定了适配效果的一緻性,同時提供了基礎的響應式控件,降低業務方的接入成本,那麼響應式架構具體是怎麼實作的呢?
從結構上看,響應式由優酷統一架構、響應式SDK、響應式頁面布局、響應式容器布局四部分互相配合完成。在這些基礎上支撐了首頁、頻道頁、播放頁、會員頁、搜尋、個人中心等衆多的業務場景。
優酷統一架構和響應式SDK,提供響應式架構能力。
響應式頁面布局、響應式容器布局,提供響應式參考實作。
4、資料二次加工
響應式并不是簡單的将現有Phone端的業務資料,投放到Pad、折疊屏上,單純的進行UI頁面适配。想要在不同尺寸裝置上都能獲得良好的适配效果,需要對Phone端的業務資料二次加工,進行資料過濾、資料映射、資料合并、資料補全等操作,才能更好的适配Pad和折疊屏。
響應式SDK隻是負責把資料二次加工的協定規則定下來,具體的資料二次加工邏輯需要業務方自己實作。優酷的統一架構提供了資料切面的能力,在切面上增加資料二次處理的邏輯,實作了統一的資料處理。
4.1、資料過濾
大尺寸裝置上,總會遇到一些複雜的,适配不了的,也不重要的元件,這部分元件可以根據具體情況過濾處理,例如:下圖中的weex元件,在Pad上直接過濾掉,不顯示。
4.2、資料映射
存在一些帶互動的複雜元件或者Pad上适配效果較差的元件,可以直接映射成其他已适配的元件。例如:下圖中的帶視訊預覽的預約元件映射成普通的預約元件。
4.3、資料合并
相鄰的兩個元件,其中有一個元件無法很好的适配大尺寸Pad,可以嘗試将其資料合并到其他元件内。
例如:下圖中第1個元件寬度鋪滿頁面寬度,在大尺寸上無法适配,第2個元件通過修改列數、尺寸就可以适配。Pad豎屏下,将第一個元件插入到第二個元件的首位,進行資料合并,按照第二個元件的進行适配,顯示為3列2行,達到很好的适配效果。
4.4、資料補全
在橫豎屏切換過程中,部分元件會遇到元件的數量,無法鋪滿螢幕的寬度,導緻出現留白的問題。
例如:把手機上的6條資料,直接投放到Pad橫屏下,就會出現下圖的留白問題。
為了解決這一類資料缺失的問題,我們選擇的解法是服務端多下發一部分業務資料,用戶端根據具體的螢幕尺寸,動态調整顯示的個數,確定顯示效果。
例如:下圖中手機上顯示2列3行,共6條資料,到了Pad豎屏上顯示3列2行,共6條資料,到了Pad橫屏上會補全2條資料,顯示4列2行,共8條資料。
5、頁面響應式
5.1、響應式狀态
響應式狀态是頁面響應式最基礎也是最重要的一個能力,像橫豎屏切換、分屏模式、折疊屏折疊打開,都會導緻頁面的寬高發生變化,産生不同的響應式狀态,頁面内的内容會進行重新布局以及元件尺寸調整,以适應頁面尺寸的變化,鋪滿螢幕,達到更好的顯示效果。
橫豎屏切換
分屏模式
折疊屏
5.2、響應式狀态管理
響應式狀态與Activity頁面的生命周期保持一緻,不同頁面響應式狀态可能不一緻。響應式SDK提供了ResponsiveActivity、ResponsiveFragment兩個基類,ResponsiveActivity統一封裝了響應式的狀态變化。當螢幕尺寸發生改變時,ResponsiveActivity和ResponsiveFragment會回調onResponsiveLayout方法,業務方接到onResponsiveLayout的通知,主動周遊目前頁面内的所有容器,根據響應式狀态,動态修改容器的布局、布局列數、尺寸等,重新渲染目前頁面。
由于優酷使用了統一架構,根據響應式狀态動态修改頁面内所有容器的邏輯,統一在架構内部處理,避免了業務方的修改,降低了接入成本。
/**
* 響應式狀态回調
*
* @param newConfig 配置資訊
* @param responsiveLayoutState 目前響應式狀态
* @param responsiveLayoutStateChanged 響應式狀态是否已發生改變
*/
protected void onResponsiveLayout(Configuration newConfig, int responsiveLayoutState, boolean responsiveLayoutStateChanged) {
}
5.3、擷取響應式狀态
響應式狀态的定義,需要有一個具體計算的規則,在所有尺寸的裝置上都按照統一的規則進行狀态區分,那麼不同的響應式狀态是如何區分的呢?
首先定義标準手機螢幕的實體寬度為400dp(經過大量手機裝置調試采樣之後獲得的手機标準實體尺寸經驗值),那麼響應式狀态的變化,由兩個比例門檻值決定,一個是頁面實體寬度與标準實體寬度的比例門檻值1.67倍(實體寬度 = 像素寬度 ➗ 螢幕密度),另一個是頁面高度與頁面寬度的比例門檻值1.25倍。那麼這兩個比例門檻值是如何得來的呢?
1.67倍是怎麼來的呢?
在播放頁的适配過程中,需要适配左右分欄的顯示,我們認為左側播放器的寬度是标準實體寬度,那麼整個頁面的寬度就是标準實體寬度的1.67倍,這樣左側播放器有足夠的空間保障視訊播放的體驗,右側的也有足夠的空間保障評論的顯示效果。
1.25倍是怎麼來的呢?
上圖列舉了豎屏華為Pad上,頁面高度是頁面寬度的1.6倍,播放器下方的視訊内容操作區,顯示的視訊内容是足夠多的。如果頁面高度小于頁面寬度的1.25倍,就會擠壓視訊内容操作區的高度,導緻顯示出來的視訊内容過少,影響使用者體驗。
當頁面實體寬度大于标準實體寬度的1.67倍,同時頁面高度小于等于頁面寬度的1.25倍,即為大屏狀态,其他情況則為小屏狀态;
5.4、不同的響應式狀态
目前支援了小屏布局和大屏布局兩種狀态。
小屏布局狀态
大屏布局狀态
6、容器響應式
容器響應式,主要解決在頁面尺寸發生變化時,動态調整容器布局的列數以及坑位的尺寸,優酷統一架構提供了常用的響應式容器布局:輪播布局、網格布局、橫劃布局、瀑布流布局。業務方可以快速實作響應式的效果。
6.1、容器适配列數、尺寸的效果
6.2、列數适配
同一個容器,在不同的尺寸頁面下,會根據頁面的實體寬度動态适配,顯示為不同的列數。
網絡布局、橫劃布局、瀑布流布局都采用這一套列數适配的規則
響應式适配後的列數 = 目前螢幕寬度 ➗ (标準螢幕寬度 ➗ 标準螢幕寬度下的元件列數 )
響應式适配後的列數,并不能解決Pad橫屏上部分元件列數過多,顯示過密的問題,為了解決這類問題,提供了列數二次适配的能力。
如下圖所示,左側是直接根據規則算出來的Pad橫屏下的列數8列,過于密集,顯示效果不好,右側是列數二次調整後,顯示為6列。
6.3、控件尺寸适配
由于不同螢幕尺寸下,容器内部會動态調整顯示不同的列數,導緻控件的尺寸也會發生變化,那麼如何适配控件尺寸的動态變化呢,響應式基礎控件能夠很好的解決這一類問題。
響應式基礎控件,内部封裝了響應式容器尺寸的适配規則,通過ratioType來定義不同适配規則下控件寬高的計算邏輯,業務方隻需要修改最外層的布局控件,通過設定ratioType就可以快速搞定寬高适配,降低業務方的适配成本。
提供了ResponsiveConstraintLayout、ResponsiveFrameLayout、ResponsiveLinearLayout、ResponsiveRelativeLayout、ResponsiveRecyclerView等基礎響應式容器
ratioType的寬度計算規則示例(頁面左右邊距和橫間距不變):
響應式控件寬度 = (目前頁面的寬度 - 左右邊距 - 控件之間的間距總和) ➗ 響應式适配後的列數;
三、效果示範
1、折疊屏
折疊屏.mov2、Pad
Pad.mov四、總結
随着折疊屏技術的進一步發展,折疊屏手機會越來越普及,越來越多的App需要适配到折疊屏手機上,響應式可以很好的解決折疊屏的适配問題。 希望未來更多的APP能夠适配響應式,做到一套代碼,運作到不同尺寸的裝置上,節約開發成本,提升開發效能,為不同尺寸的裝置帶來與手機版本一緻的使用者體驗。