做了半年android,遇到不少適配問題。
適配問題分兩種,一種是各個版本間適配,一種是屏幕分辨率適配。
下面我們就針對這兩種適配分別進行說明。作爲一個菜鳥,很多理解可能不到位,請大家指正。
關於各個版本間適配:
android 在不斷更新版本,但是由於一些原因,很大一部分android手機的系統並不能隨之進行升級。所以當我們在做產品時,往往需要考慮手機端應用的向下兼容性。
我們可以使用高版本的sdk進行開發,在程序運行時,對版本進行判斷,高版本使用高版本的API,低版本使用低版本的API
Android爲我們提供了一個常量類Build,其中最主要是Build中的兩個內部類VERSION和VERSION_CODES,
VERSION表示當前系統版本的信息,其中就包括SDK的版本信息,用於成員SDK_INT表示;
對於VERSION_CODES在SDK開發文檔中時這樣描述的,Enumeration of the currently known SDK version codes. These are the values that can be found in SDK
.
Version numbers increment monotonically with each official platform release.
其成員就是一些從最早版本開始到當前運行的系統的一些版本號常量。
在我們自己開發應用過程中,常常使用如下的代碼形式判斷運行新API還是舊的API:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
// 包含新API的代碼塊
}
else
{
// 包含舊的API的代碼塊
}
但是上面的並不能完全解決問題,因爲部分手機比如小米,會對現有的android系統進行改造,這也會造成一定的問題,要解決這種問題就需要
(1)相關更改文檔(2)你的經驗。
屏幕分辨率適配:
(1)使用webview
在使用webview時你需要確定是由前端同學使用css來控制字體大小還是由你來控制。
如果是你來控制,那麼你可以通過以下函數進行判斷並進行適配:
//適配不同密度問題
int screenDensity = getResources().getDisplayMetrics(). densityDpi ;
WebSettings.ZoomDensity zoomDensity = WebSettings.ZoomDensity. MEDIUM ;
switch (screenDensity){
case DisplayMetrics.DENSITY_LOW :
zoomDensity = WebSettings.ZoomDensity.CLOSE;
break ;
case DisplayMetrics.DENSITY_MEDIUM :
zoomDensity = WebSettings.ZoomDensity.MEDIUM;
break ;
case DisplayMetrics.DENSITY_HIGH :
zoomDensity = WebSettings.ZoomDensity.FAR;
break ;
}
newsInfoWebview .getSettings().setDefaultZoom(zoomDensity) ;
(2)不使用webview
1、分辨率無關
(1)使用密度無關的像素。
由於android設備屏幕尺寸和分辨率的不同,基於屏幕的DPI可以使仙童數量的像素對應不同設備上的不同物理尺寸。因此我們使用dp來指定尺寸使用sp來指定文本大小。
(2)像素密度的資源限定符
位圖圖像的縮放會導致圖像細節的損失(縮小)和圖像的模糊(放大)。巍峨使應用程序的界面清晰,最好爲不同像素的密度提供多個圖像資源。
res/drawable-ldpi 爲120dip左右的尺寸提供低密度資源
res/drawable-mdpi 爲160dip左右的尺寸提供中等密度的資源
res/drawable-tvdip 爲213dip左右的尺寸提供中高密度資源;這是在API版本13中爲了優化面向電視的應用程序而引入的。
res/deawable-hdpi 爲240dpi左右的屏幕提供高密度資源
res/drawable-xhdpi 爲320dpi左右的屏幕提供超高密度的資源
res/drawable-nodpi 用於不管宿主屏幕密度如何都不進行縮放的資源
2、爲不同的屏幕大小提供支持和優化
沒有必要爲每個特定屏幕創建不同的絕對佈局,最好使用下面的方法:
(1)保證所有的佈局都能在一個合理的範圍內進行縮放。(比如使用wrap_content或者fill_parent)
(2)創建一組範圍重疊的備選佈局來滿足所有可能的屏幕配置。
android使用long和notlong修飾符來爲正常的寬屏顯示提供有化佈局
res/layout-long-land/ //爲寬屏橫屏模式提供佈局
res/layout-notlong-port/ //爲非寬屏豎屏模式提供佈局
更多的修飾符請查詢官網文檔。
3、創建可縮放的圖形資源
(1)使用純色
(2)使用<shape>標籤製作形狀
(3)使用NinePatch圖像
.9.png圖像左側和上側用於標識拉伸區域,右側的下側用於標識內容區域
4、靈活使用佈局layout。
比如當需要三個按鈕均勻的分佈在一行時,我們可以使用linearlayout 並設置權重都爲1。如果使用relativelayout就沒有這麼方便了。
如果上面讓你覺得複雜,你可以讓適配最小的屏幕,然後在所有的屏幕上都只顯示那麼大的部分,但是這樣用戶體驗也相應的下降很多。