天天看點

騰訊優測優分享-Android适配中兩個世界的碰撞——視覺&開發

摘要:

Android錯亂展現在很多方面,有不同的品牌、不同的機型、不同的尺寸等,騰訊優測提供專業的自動化測試适配服務,能解決大部分的android适配問題。

關鍵詞:安卓适配  UI及布局元素适配 移動研發

一個成功的産品必須具備一系列極緻的UI及布局元素,而這些最直覺展現給使用者的畫面最初源于我們的互動視覺同學的設計。

作為開發,我們的任務是盡可能地實作設計同學的需求。但因種種原因,現實往往并不那麼樂觀,作為開發同學有時根本無法實作設計需求或者對設計的了解有偏差。接下來讓我們一起來看看造成這偏差的根本原因所在。

1、客觀方面:錯亂的安卓機世界:

Android錯亂展現在很多方面,有不同的品牌、不同的機型、不同的尺寸、不同的分辨率等。android的分辨率就存在明顯的碎片化,表1給出了五種常見的分辨率等級。表中的分辨率等級是以dpi(dots per inch),即每英尺擁有的點的數量,計算公式:

騰訊優測優分享-Android适配中兩個世界的碰撞——視覺&開發

而具體的分級則以這個值的範圍來定,即dpi或densityDpi分别為120、160、240、320和480來區分5個級别。

從上面的公式可知,隻要滿足dpi=120,那麼理論上任何一組分辨率和螢幕尺寸都算作是ldpi這一級的。這也驗證了android分辨率的碎片化。表中的density是用來描述一個分辨率相對于參照mdpi(160)值而言的相對比值。

當然,表1也隻是給出了各等級的部分分辨率值,市場的遠不止這些。

騰訊優測優分享-Android适配中兩個世界的碰撞——視覺&開發

2、兩大世界的兩大法則:

對于視覺側,他們的法則比較統一,即像素px;而對于複雜錯亂的其他側,他們的法則比較複雜,如dip(dp:第一大法則),sp,px等。現在讓我們來了解下這兩界的兩大法則的具體含義:

1、px:一個最基本的顯示單元,同的裝置不同的顯示屏顯示效果是相同的。

2、dip(device independent pixels 裝置獨立像素):不同裝置有不同的顯示效果,這個和裝置硬體有關。

騰訊優測優分享-Android适配中兩個世界的碰撞——視覺&開發

圖1:兩個世界的各自法則

雖然兩大法則不同,但是他們之間存在一定聯系:

dip=pixel/density

其中density即為裝置的螢幕顯示密度相對比值,對于不同的android機型,其取值是不同的,具體參見表1所示。

針對這樣一個錯亂複雜的android适配問題,有什麼好的辦法可以幫助解決該問題?讓我們繼續往下看:

3、Android的解決辦法:

為了解決這種碎片化的适配問題,Android提供了按實際的裝置參數來加載不同的資源,如drawable、layout、values等都可以建立不同分辨率的資源檔案包:

1.圖層資源适配;drawable:drawable-xhdpi、drawable-hdpi、drawable-mdpi、drawable-ldpi、drawable-hdpi-800×480和drawable-hdpi-854×480。

2.布局檔案适配;layout:類似于drawable的命名。

3.參數适配;values:類似的命名。

精确适配:Android3.2以上版本可以設定精确适配,可以任意設定寬高的獨立像素。

drawable-w320dp-h480dp-160dpi, 其中w320dp表示螢幕寬度320dp,h480dp表示螢幕高度480dp, 160dpi表示密度。

那麼android手機是如何根據機型分辨率找到對應的資源的呢?具體流程如圖2所示:

騰訊優測優分享-Android适配中兩個世界的碰撞——視覺&開發

圖2 android系統資源加載過程(不考慮尺寸限制)

從整個流程圖可以看出,android的資源适配是根據裝置的具體分辨率進行查找的,有直接對應的分辨率,則直接從對應分辨率資源包下擷取資源;否則會根據分辨率級别來擷取資源,即根據dpi。而對于沒有找到對應級别的,則會考慮采用最适合的級别來加載資源,實驗結果顯示選擇最适合的規則如下:

1、hdpi,xhdpi或xxhdpi會在沒有對應級别的情況下去加載高一級别的資源,如果高一級也沒有,則會再去加載更高一級的,即hdpi在沒有找到對應hdpi時會加載xhdpi的資源,如果xhdpi也沒有會去加載xxhdpi下的資源(向上提級)。

2、mdpi,ldpi會在沒有對應級别的情況下去加載預設包下的資源,即drawable下資源(加載預設)。

3、如果再沒有最适合的,會去加載預設資源(即drawable、layout等沒有分辨率資訊相關字尾的資源檔案包)。

4、執行個體剖析:

對于部門産品,目前視覺設計都采用xhdpi:720p(720*1280)等作為切圖基準,并且切圖中的所有标注都是以px像素作為機關。那麼開發側在拿到這樣的切圖時會做這樣的一個換算:

dip(dp)= pix/2

經過這樣一個換算,将以px為機關的720*1280轉換成以dp為機關的360*640。如果以360*640 dp進行布局,那麼對于不同的分辨率級别,還原到像素後的情況如表2所示。

騰訊優測優分享-Android适配中兩個世界的碰撞——視覺&開發

從表2中可知:對于ldpi、mdpi及部分hdpi,按720P轉換為360 * 640的dp進行布局會出現實際的布局大小大于機型原始分辨率,進而出現實際中的一屏顯示不全或出現布局重疊(這個應該是因為以margintop和marginbottom進行的布局)的現象。

針對上述的這種問題,有3個方面可以幫助解決:

1.在布局時盡量采用相對的思想進行,如水準/垂直居中,相對居左等;

2.對不同分辨率配置不同的資源檔案包;

3.采用一個通用簡單的方式,即采用scrollview裝載所有的布局元素,避免那些由于高度不夠導緻的一屏顯示不全。這個需要綜合産品和視覺的要求來定。

文/騰訊 黃歸