市場上手機種類繁多,尺寸大小與分辨率也不盡相同,因此對於android軟件開發人員來說,屏幕的適應能力成了所要解決的問題。
首先要使設計的界面適應屏幕,可多用LinearLayout和RelativeLayout,儘量不要使用絕對佈局;控件的長、寬值多使用match_parent或者wrap_content,或者在佈局中可多使用layout_weight屬性;如需要固定的長度,採用單位爲設備獨立像素(dp/dip/sp),並且將其定義在dimens資源文件中再引用,而非直接寫在layout中。
一、layout_weight屬性的使用
LinearLayout或其子類具有layout_weight屬性,使用layout_weight屬性,可以使屏幕自適應能力更強,但在使用時有些需要注意的地方,下面以LinearLayout爲例展開說明。
當LinearLayout的orientation屬性值爲horizontal時(子視圖以橫向排列),那麼使用layout_weight時應將子視圖的layout_width屬性設置爲0dp,否則layout_weight屬性不起作用;此時layout_weight表示橫向比重。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<View
android:id="@+id/view1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2" />
<View
android:id="@+id/view2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3" />
</LinearLayout>
如上代碼,表示view1與view2橫向排列,view1的寬度佔LinearLayout寬度的2/(2+3)即2/5,view2的寬度佔LinearLayout寬度的3/5。
同樣,如果LinearLayout的orientation屬性值爲vertical時,子視圖以縱向排列,那麼使用layout_weight時應將子視圖的layout_height屬性設置爲0dp,否則layout_weight屬性不起作用;此時layout_weight表示縱向比重,佔比重的算法與橫向一致。
二、圖片自適應
在編寫界面時,難免用到圖片,使圖片適應不同分辨率的手機。如果是色塊的話,最好使用在代碼中顏色值填充的方式,如不是色塊比較好的方式就是採用.9的圖片,如無法製作成.9的圖片,可以採用在res建立多個文件夾,在不同的文件夾存放不懂分辨率的圖片來達到自適應。
drawable:存放對分辨率要求不高的圖片和xml配置文件
drawable-ldpi:存放低分辨率圖片 0.75
drawable-mdpi:存放中等分辨率圖片(適應於主流分辨率手機的圖片存放位置)
1
drawable-hdpi:存放較高分辨率圖片 1.5
drawable-xhdpi:存放高分辨率圖片 2
drawable-xxhdpi:存放超高分辨率圖片 3
那麼如何製作一組圖片,然後存放在不同文件夾,使其自適應不同分辨率的手機呢?
首先可先確定出適應於主流分辨率手機的圖片,如圖片分辨率是1的話,要對應作出0.75、1、1.5、2、3這5中不同分辨率的圖片,分別放在以上文件夾。爲了防止圖片失真,一般先做超高分辨率的圖片,然後再依次縮小。如,現需要一張像素爲100*100圖片可適應於主流分辨率手機,那麼,應先做300*300的圖片存放在drawable-xxhdpi文件夾,然後將其分別縮爲200*200的存放在drawable-xhdpi文件夾,縮爲150*150存放在drawable-hdpi文件夾,縮爲100*100存放drawable-mdpi文件夾,以及縮爲75*75的存放在drawable-ldpi。
特別說明:同一組圖片的文件名稱需一致。
三、尺寸自適應
文章最前面有提到有些必須使用絕對長度時,需將其定義在dimens資源文件中再引用,而非直接寫在layout中,這是由於我們可以使用多個文件夾來存放dimens.xml,在不同文件夾下的dimens文件中定義不同的值,可達到自適應的效果。
value:存放默認值,如果沒有找到對應尺寸的value文件,則會適應此value的值。如找不到對應尺寸的value文件,在value中又沒有定義,那麼程序在運行時會出錯。
value-sw320dp:存放手機最短邊尺寸爲320dp的對應的值。如屏幕配置爲240*320 的ldpi、320*480的mdpi和480*800的hdpi設備。
value-sw480dp:存放手機最短邊尺寸爲480dp的對應值。
value-sw600dp:存放手機最短邊尺寸爲600dp的對應值。
value-sw720dp:存放手機最短邊尺寸爲720dp的對應值。
value-sw1080dp:存放手機最短邊尺寸爲1080dp的對應值。
看到這裏,也許大家已經明白,爲什麼我們在設置尺寸是要使用dp/dip/sp。和文件夾的名稱一樣,如在value-sw320dp文件夾中定義的dimen 值爲320dp,那麼在value-sw480dp文件夾中就該是480dp,其餘文件夾以此類推。
細心的猿們會發現,文件夾value-sw320dp中的320不止與手機短邊分辨率,還與其密度相關。如240*320 ldpi的時候之所以是value-sw320dp類型,是因爲240/0.75=320;320*480 mdpi爲320/1=320,;480*800 hdpi爲480/1.5=320。
特別說明:同一組圖片的文件名稱需一致。
四、佈局自適應
這種方式較少用,因爲相當於需要寫多套佈局,正常情況下同時使用二和三已經能夠滿足。
其也是使用多個文件夾的方式來實現,
layout:存放一些通用佈局xml文件,如界面頂部和底部的佈局,不會隨着屏幕大小變化的佈局。
layout-small:屏幕尺寸小於3英寸左右的佈局
layout-normal:屏幕尺寸小於4.5英寸左右的佈局
layout-large:屏幕尺寸4到7英寸之間佈局
layout-xlarge:屏幕尺寸7-10英寸之間佈局
layout-xxlarge:屏幕尺寸10英寸以上佈局
參考:
不同手機屏幕分辨率自適應:http://blog.csdn.net/xsl1990/article/details/16931709
dpi和分辨率的關係:http://blog.csdn.net/ueryueryuery/article/details/20048401
不同分辨率自適應總結:http://www.cnblogs.com/tianjian/archive/2011/11/25/2262866.html