1. 程式人生 > >Android就業面試技巧系列-技術篇3(螢幕適配)

Android就業面試技巧系列-技術篇3(螢幕適配)

Android就業面試技巧系列-技術篇(螢幕適配) 答題技巧 螢幕適配是目前安卓開發大部分程式設計師都會遇到的問題,回答時候,面試官會直接問你對螢幕適配如何看待,此問題需要循序漸進,點滴從經驗作答,最終闡述清楚原理。具體可分如下步驟: 1、開發中遇到的機型以及解析度 2、開發中用到的螢幕適配方案,以及科學的螢幕適配共有幾種 3、根據自己經驗,哪種適配適合什麼場合使用 4、螢幕適配原因以及適配原理如何 5、自己對螢幕適配的感覺以及未來發展方向的評估 回答要點 1、 為什麼要進行螢幕適配。 2、 螢幕適配原理如何。 3、 日常開發中針對不同機型以及不同情況使用到的螢幕適配方案。 要點一:為什麼要進行螢幕適配。
安卓手機的多樣化如今越來越顯現出來,各大廠商都開始開發屬於自己的系統以及機型,解析度也是千變萬化,適應了自己的需求。 要點二:螢幕適配原理如何。 說完為何要螢幕適配,緊接著我們就進入我們的重點,螢幕適配該怎麼做,首先我們要明白幾個概念,螢幕尺寸,螢幕解析度以及螢幕畫素密度。 螢幕尺寸指的是螢幕的對角線長度,以手機為例,目前我們常見的尺寸有4.2、5.0、5.5等,螢幕解析度是指在橫縱向上的畫素點數,單位是px,1px=1個畫素點。一般以縱向畫素*橫向畫素,如1960*1080。螢幕畫素密度是指每英寸上的畫素點數,單位是dpi,即“dot per inch”的縮寫。螢幕畫素密度與螢幕尺寸和螢幕解析度有關,在單一變化條件下,螢幕尺寸越小、解析度越高,畫素密度越大,反之越小。
說完基本的概念之後,我們就會引出幾個基本的單位,dp、dip、dpi、sp、px。 1、首先我們說明,px即畫素,一個畫素則表明在螢幕上的一個點,一個顯示單位。 2、dp和dip是一個意思,全稱是密度無關畫素,在Android中,規定以160dpi為基準,           1dip=1px如果密度是320dpi,則1dip=2px,以此類推。 3、dip和dp我們明白了,那麼dpi呢,dpi即Diagonal pixel,代表每英寸畫素數,表示對           角線的畫素值  ,我們以WVGA(800*480)解析度,3.7英寸的密度           為例(圖2),dpi = 933/3.7=252
,即我們此機型的dpi252 當我們拿到一部需要適配的手機的時候,如果知道了它的dpi,此時我們就可以做適配了。在安卓裝置中,我們目前可以分為mdpi、hdpi、xdpi、xxdpi等幾種情況,ldpi已經不太常見,針對這幾種dpi,我們可以按照圖3所示,來判定我們需要適配的裝置位於哪個範圍。從而根據此不同的dpi進行不同的處理,來實現我們的適配目的。 要點三:日常開發中針對不同機型以及不同情況使用到的螢幕適配方案。 目前我們開發中能使用到的螢幕適配方法,有以下幾種: 1、使用不同套圖適配 a) 使用套圖適配,目前來說是針對圖片適配的最好適配方法,可以防止圖片的失真以及變形,但針對不同手機進行不同的套圖適配,會對UI人員施加過大的工作壓力以及對我們app本身也會造成冗餘的影響,我們都知道,圖片資源是使我們app變的臃腫罪魁禍首。 b) 優點:完美適配,不會失真 c) 缺點:不易達到,app臃腫 2、9path適配 a) 9path圖片作為特殊的png圖片,可以在特定的情況下對不同機型進行適配,而達到圖片不失真的情況。 b) 優點:①省精力和時間、②省記憶體、③減少程式碼量 c) 缺點:需要每張圖片進行製作處理,單一,圖片中部分割槽域不會隨整圖改變而改變,從而不能完全適合所有圖片適配 3、佈局適配 a) 使用權重適配 i. 由圖4可以看出,在格局比較明朗的頁面中,如果我們能少用具體大小dp值,多用權重,可以在不同的解析度下都能做到完美適配。但此種適配僅僅侷限於格局比較明朗的介面中,如果在一個介面中,有各種巢狀和各種複雜佈局,則就顯得力不從心了。
4、使用dimens適配 根據不同values下的dimens進行適配,android專案會自動找尋相適應的dimens,我們可以在多種不同的values下建立dimens檔案如圖  
在使用dimens的時候,我們可以在dimens檔案中,用px為單位,這樣就能達到完美適配。如圖 5、程式碼適配 a) 我們也可以在java檔案中,使用java程式碼進行適配,相比較xml的話,此種適配方法更迅捷。 b) 通過獲取View的引數並結合dimens進行適配 i. LinearLayout.LayoutParams p = newLinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT) ii. getResources().getDimension(R.dimen.dimen_1_dip);