天天看點

一個APP如何适配多個Android終端?

一個APP如何适配多個Android終端?

Android響應式方案

一個APP如何适配多個Android終端?

響應式的核心是拉通多終端的适配規則,開發一套界面,一個APP相容多尺寸終端裝置的顯示,能夠根據使用者的行為以及裝置的環境(螢幕尺寸、螢幕方向、是否分屏等)進行相應的頁面布局以及容器尺寸的調整,為使用者提供更加舒适的界面和更好的使用者體驗。

一個APP如何适配多個Android終端?

1 響應式SDK

App的每個頁面支援響應式,開發成本是很高的。

響應式SDK,就是為了解決App在不同尺寸裝置下的适配問題,把裝置的螢幕資訊、容器布局規則(列數、尺寸)、業務資料二次加工等行為進行統一管理,以适應新的螢幕尺寸。

一個APP如何适配多個Android終端?

2 加載流程設計

一個APP如何适配多個Android終端?

通用的頁面加載流程,通常都是從資料傳回開始,資料解析完成後,進行頁面布局渲染以及容器布局渲染。響應式在通用加載流程的基礎上,加入了響應式狀态變化通知、響應式資料剪裁、響應式頁面布局、響應式容器布局等流程。

具體加載的流程分為兩種情況:

  • 使用者請求資料
  • 螢幕尺寸發生變化

3 架構設計

優酷各個業務開發團隊,使用了統一的業務架構,我們在統一架構的基礎上進行響應式适配,提供了響應式SDK,拉通各個業務方不同頁面的适配規則,確定了适配效果的一緻性,同時提供了基礎的響應式控件,降低業務方的接入成本,那麼響應式架構具體是怎麼實作的呢?

一個APP如何适配多個Android終端?

從結構上看,響應式由優酷統一架構、響應式SDK、響應式頁面布局、響應式容器布局四部分互相配合完成。在這些基礎上支撐了首頁、頻道頁、播放頁、會員頁、搜尋、個人中心等衆多的業務場景。

優酷統一架構和響應式SDK,提供響應式架構能力。

響應式頁面布局、響應式容器布局,提供響應式參考實作。

4 資料二次加工

響應式并不是簡單的将現有Phone端的業務資料,投放到Pad、折疊屏上,單純的進行UI頁面适配。想要在不同尺寸裝置上都能獲得良好的适配效果,需要對Phone端的業務資料二次加工,進行資料過濾、資料映射、資料合并、資料補全等操作,才能更好的适配Pad和折疊屏。

響應式SDK隻是負責把資料二次加工的協定規則定下來,具體的資料二次加工邏輯需要業務方自己實作。優酷的統一架構提供了資料切面的能力,在切面上增加資料二次處理的邏輯,實作了統一的資料處理。

資料過濾

大尺寸裝置上,總會遇到一些複雜的,适配不了的,也不重要的元件,這部分元件可以根據具體情況過濾處理,例如:下圖中的weex元件,在Pad上直接過濾掉,不顯示。

一個APP如何适配多個Android終端?

資料映射

存在一些帶互動的複雜元件或者Pad上适配效果較差的元件,可以直接映射成其他已适配的元件。例如:下圖中的帶視訊預覽的預約元件映射成普通的預約元件。

一個APP如何适配多個Android終端?

資料合并

相鄰的兩個元件,其中有一個元件無法很好的适配大尺寸Pad,可以嘗試将其資料合并到其他元件内。

例如:下圖中第1個元件寬度鋪滿頁面寬度,在大尺寸上無法适配,第2個元件通過修改列數、尺寸就可以适配。Pad豎屏下,将第一個元件插入到第二個元件的首位,進行資料合并,按照第二個元件的進行适配,顯示為3列2行,達到很好的适配效果。

一個APP如何适配多個Android終端?

資料補全

在橫豎屏切換過程中,部分元件會遇到元件的數量,無法鋪滿螢幕的寬度,導緻出現留白的問題。

例如:把手機上的6條資料,直接投放到Pad橫屏下,就會出現下圖的留白問題:

一個APP如何适配多個Android終端?

為了解決這一類資料缺失的問題,我們選擇的解法是服務端多下發一部分業務資料,用戶端根據具體的螢幕尺寸,動态調整顯示的個數,確定顯示效果。

例如:下圖中手機上顯示2列3行,共6條資料,到了Pad豎屏上顯示3列2行,共6條資料,到了Pad橫屏上會補全2條資料,顯示4列2行,共8條資料。

一個APP如何适配多個Android終端?

5 頁面響應式

響應式狀态

響應式狀态是頁面響應式最基礎也是最重要的一個能力,像橫豎屏切換、分屏模式、折疊屏折疊打開,都會導緻頁面的寬高發生變化,産生不同的響應式狀态,頁面内的内容會進行重新布局以及元件尺寸調整,以适應頁面尺寸的變化,鋪滿螢幕,達到更好的顯示效果。

橫豎屏切換:

一個APP如何适配多個Android終端?

分屏模式:

一個APP如何适配多個Android終端?

折疊屏:

一個APP如何适配多個Android終端?

響應式狀态管理

響應式狀态與Activity頁面的生命周期保持一緻,不同頁面響應式狀态可能不一緻。響應式SDK提供了ResponsiveActivity、ResponsiveFragment兩個基類,ResponsiveActivity統一封裝了響應式的狀态變化。當螢幕尺寸發生改變時,ResponsiveActivity和ResponsiveFragment會回調onResponsiveLayout方法,業務方接到onResponsiveLayout的通知,主動周遊目前頁面内的所有容器,根據響應式狀态,動态修改容器的布局、布局列數、尺寸等,重新渲染目前頁面。

由于優酷使用了統一架構,根據響應式狀态動态修改頁面内所有容器的邏輯,統一在架構内部處理,避免了業務方的修改,降低了接入成本。

/**  
 *響應式狀态回調  
 *  
 * @param newConfig                   配置資訊  
 * @param responsiveLayoutState       目前響應式狀态  
 * @param responsiveLayoutStateChanged響應式狀态是否已發生改變 
 */
protectedvoidonResponsiveLayout(ConfigurationnewConfig,intresponsiveLayoutState,booleanresponsiveLayoutStateChanged) {

}           

擷取響應式狀态

響應式狀态的定義,需要有一個具體計算的規則,在所有尺寸的裝置上都按照統一的規則進行狀态區分,那麼不同的響應式狀态是如何區分的呢?

首先定義标準手機螢幕的實體寬度為400dp(經過大量手機裝置調試采樣之後獲得的手機标準實體尺寸經驗值),那麼響應式狀态的變化,由兩個比例門檻值決定,一個是頁面實體寬度與标準實體寬度的比例門檻值1.67倍(實體寬度 = 像素寬度÷螢幕密度),另一個是頁面高度與頁面寬度的比例門檻值1.25倍。那麼這兩個比例門檻值是如何得來的呢?

(1)1.67倍是怎麼來的呢?

一個APP如何适配多個Android終端?

在播放頁的适配過程中,需要适配左右分欄的顯示,我們認為左側播放器的寬度是标準實體寬度,那麼整個頁面的寬度就是标準實體寬度的1.67倍,這樣左側播放器有足夠的空間保障視訊播放的體驗,右側的也有足夠的空間保障評論的顯示效果。

(2)1.25倍是怎麼來的呢?

一個APP如何适配多個Android終端?

上圖列舉了豎屏華為Pad上,頁面高度是頁面寬度的1.6倍,播放器下方的視訊内容操作區,顯示的視訊内容是足夠多的。如果頁面高度小于頁面寬度的1.25倍,就會擠壓視訊内容操作區的高度,導緻顯示出來的視訊内容過少,影響使用者體驗。

當頁面實體寬度大于标準實體寬度的1.67倍,同時頁面高度小于等于頁面寬度的1.25倍,即為大屏狀态,其他情況則為小屏狀态。

不同的響應式狀态

目前支援了小屏布局和大屏布局兩種狀态。

(1)小屏布局狀态

折疊屏折疊、折疊屏分屏、Pad豎屏:

一個APP如何适配多個Android終端?
一個APP如何适配多個Android終端?
一個APP如何适配多個Android終端?

(2)大屏布局狀态

折疊屏打開、Pad橫屏:

一個APP如何适配多個Android終端?

6 容器響應式

容器響應式,主要解決在頁面尺寸發生變化時,動态調整容器布局的列數以及坑位的尺寸,優酷統一架構提供了常用的響應式容器布局:輪播布局、網格布局、橫劃布局、瀑布流布局。業務方可以快速實作響應式的效果。

容器适配列數、尺寸的效果

一個APP如何适配多個Android終端?

列數适配

同一個容器,在不同的尺寸頁面下,會根據頁面的實體寬度動态适配,顯示為不同的列數。

網絡布局、橫劃布局、瀑布流布局都采用這一套列數适配的規則:

響應式适配後的列數 = 目前螢幕寬度÷(标準螢幕寬度÷标準螢幕寬度下的元件列數 )

響應式适配後的列數,并不能解決Pad橫屏上部分元件列數過多,顯示過密的問題,為了解決這類問題,提供了列數二次适配的能力。

如下圖所示,左側是直接根據規則算出來的Pad橫屏下的列數8列,過于密集,顯示效果不好,右側是列數二次調整後,顯示為6列。

一個APP如何适配多個Android終端?

适配效果:

一個APP如何适配多個Android終端?

控件尺寸适配

由于不同螢幕尺寸下,容器内部會動态調整顯示不同的列數,導緻控件的尺寸也會發生變化,那麼如何适配控件尺寸的動态變化呢,響應式基礎控件能夠很好的解決這一類問題。

響應式基礎控件,内部封裝了響應式容器尺寸的适配規則,通過ratioType來定義不同适配規則下控件寬高的計算邏輯,業務方隻需要修改最外層的布局控件,通過設定ratioType就可以快速搞定寬高适配,降低業務方的适配成本。

提供了ResponsiveConstraintLayout、ResponsiveFrameLayout、ResponsiveLinearLayout、ResponsiveRelativeLayout、ResponsiveRecyclerView等基礎響應式容器。

ratioType的寬度計算規則示例(頁面左右邊距和橫間距不變):

響應式控件寬度 = (目前頁面的寬度 - 左右邊距 - 控件之間的間距總和)÷響應式适配後的列數

總結

随着折疊屏技術的進一步發展,折疊屏手機會越來越普及,越來越多的App需要适配到折疊屏手機上,響應式可以很好的解決折疊屏的适配問題。希望未來更多的APP能夠适配響應式,做到一套代碼,運作到不同尺寸的裝置上,節約開發成本,提升開發效能,為不同尺寸的裝置帶來與手機版本一緻的使用者體驗。

繼續閱讀