您好,登錄后才能下訂單哦!
對于從事android應用開發的朋友來說都應該知道,現在的安卓手機的屏幕類型十分繁多, 大小尺寸,長寬比例都不盡相同,同一個界面在不同分辨率的手機上可能出現布局錯亂,控件跑位的現象。做屏幕的適配不可能實現在每種屏幕上顯示出的界面 效果完全一致。只能靠平時的編程習慣和經驗是的界面在不同的屏幕尺寸在不會出現過分的走位,在可遇見范圍內控制界面在不同屏幕下的變化,并做出相應調 整。那么偶們應該如何做到屏幕的適配呢?下面我就以我的開發經驗來說說吧。
1、盡量使用線性布局(LinearLayout)和相對布局(RelativeLayout),不要使用絕對布局。
2、盡量使用dip和sp,不要使用px。
3、為不同的分辨率提供不同的布局文件和圖片。
3.1)界面布局方面
需要根據物理尺寸的大小準備5套布局,layout(放一些通用布局xml文件,比如界面中頂部和底部的布局,不會隨著屏幕大小變化,類似windos窗口的title bar),layout-small(屏幕尺寸小于3英寸左右的布局),layout-normal(屏幕尺寸小于4.5英寸左右),layout-large(4英寸-7英寸之間),layout-xlarge(7-10英寸之間)
3.2)圖片資源方面
需要根據dpi值準備5套圖片資源,drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi
Android有個自動匹配機制去選擇對應的布局和圖片資源
4.能夠使用權重的地方盡量使用權重(android:layout_weight)
5.在AndroidMainfest.xml中設置多分辨率支持。
Android屏幕適配必須要理解的一些概念:
px
是英文單詞pixel的縮寫,意為像素,屏幕上的點。我們通常所說的分辨率如480X800就是指的像素。
在設計領域中,像素是用來計算數碼影像的最小單位。計算機中顯示的圖像并非連續的線條組成,而是由許多肉眼看不見的小點組成。如果把影像放大數倍,會發現這些連續色調其實是由許多色彩相近的小點所組成,這些小點就是構成影像的最小單位“像素”。
in
表示英寸,是屏幕的物理尺寸。每英寸等于2.54厘米。例如我們經常說的手機屏幕大小有,5(英)寸、4(英)寸就是指這個單位。這些尺寸是屏幕的對角線長度。如果手機的屏幕是4英寸,表示手機的屏幕(可視區域)對角線長度是4 X 2.54 = 10.16厘米。
dpi
dpi是Dots Per Inch的縮寫, 每英寸點數,即每英寸包含像素個數。比如320X480分辨率的手機,寬2英寸,高3英寸, 每英寸包含的像素點的數量為320/2=160dpi(橫向)或480/3=160dpi(縱向),160就是這部手機的dpi,橫向和縱向的這個值都是相同的,原因是大部分手機屏幕使用正方形的像素點。
density
屏幕密度,density和dpi的關系為 density = dpi/160
dp
也即dip,設備獨立像素,device independent pixels的縮寫,Android特有的單位,在屏幕密度dpi = 160屏幕上,1dp = 1px。
sp
和dp很類似,一般用來設置字體大小,和dp的區別是它可以根據用戶的字體大小偏好來縮放。
這個屬性其實很好用,一般和android:layout_height="fill_parent"或 android:layout_width="fill_parent"一起使用,它用于描述該子元素在剩余空間中占有的大小比例。加入一行只有一個文本 框,那么它的默認值就為0,如果一行中有兩個等長的文本框,那么他們的android:layout_weight值可以是同為1。如果一行中有兩個不等 長的文本框,那么他們的android:layout_weight值分別為1和2,那么第一個文本框將占據剩余空間的三分之二,第二個文本框將占據剩余 空間中的三分之一。android:layout_weight遵循數值越小,重要度越高的原則。android屏幕如此繁多,不可能都是等比例縮放的, 所以單純使用dip來設置控件也是行不通,與layout_weight屬性靈活結合使用,增強界面的適應性。
首先:你需要在AndroidManifest.xml文件的元素如下添加子元素
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true" />
名如其意,以上是為我們的屏幕設置多分辨率支持(更準確的說是適配大、中、小三種密度)。android:anyDensity="true" ,這一句對 整個的屏幕都起著十分重要的作用,值為true,我們的應用程序當安裝在不同密度的手機上時,程序會分別加載hdpi,mdpi,ldpi文件夾中的資 源。相反,如果值設置為false,即使我們在hdpi,mdpi,ldpi文件夾下擁有同一種資源,那么應用也不會自動地去相應文件夾下尋找資源,這種 情況都是出現在高密度,以及低密度的手機上,比如說一部240×320像素的手機,如果設置 android:anyDensity="false",Android系統會將240 x 320(低密度)轉換為 320×480(中密度),這樣的 話,應用就會在小密度手機上加載mdpi文件中的資源。
細心的人會發現自 android2.0開始之后drawable文件被三個文件夾drawable-hdpi,drawable-mdpi,drawable-ldpi三 個文件夾所取代,有些編程人員為了讓應用程序默認地加載某些圖片,他們會特意地去在android2.0之后的應用程序中重新創建drawable文件 夾,其實這樣做完全沒有必要,通過第一段的分析我們得知,android:anyDensity="false",則應用會將大小密度轉變成中密度,從而 去加載mdpi中的資源。這里同樣,當android:anyDensity="false",則應用會去加載mdpi中的資源。
第一:android:anyDensity="true",系統會依據屏幕密度,自動去找對應的文件夾
第二:android:anyDensity="false",
(1)如果drawable-hdpi,drawable-mdpi,drawable-ldpi三個文件夾中有同一張圖片資源的不同密度表示,那么系統會去加載
drawable_mdpi文件夾中的資源
(2)如果drawable-hpdi中有高密度圖片,其它兩個文件夾中沒有對應圖片資源,那么系統會去加載drawable-hdpi中的資源。
(3)如果drawable-hdpi,drawable-mdpi中有圖片資源,drawable-ldpi中沒有對應的圖片資源,那么系統會加載drawable-mdpi文件夾中的資源
注意上圖各種文件夾的不同表示。
drawable-hdpi 該圖片即適用于橫屏,也適用于豎屏
drawable-land-hdpi,當屏幕為橫屏,且為高密度時,加載此文件夾中的資源
drawable-port-hdpi,當屏幕為豎屏,且為高密度時,加載此文件夾中的資源
android SDK 包的tools目錄下為偶們提供了這么一個圖片處理工具。有時候偶們需要圖片資源自適應且不失真,無論橫屏還是豎屏,高分辨率還是低分辨率,都能自動填充 滿,而且不失真等等背景問題。 Android針對這種情況,專門制作了一種.9.PNG格式來解決這個問題。draw9patch就是幫助偶們制 作.9.PNG格式資源的一個小工具。
*.9.PNG就標準的PNG格式,只是在最外面一 圈額外增加1px的邊框,這個1px的邊框就是用來定義圖片中可擴展的和靜態不變的區域。特別說明,left(左)和top(上)邊框中交叉部分是可拉伸 部分,未選中部分是靜態區域部分。right和bottom(下和右)邊框中交叉部分則是內容部分。
如上圖《也就是說,在手機里。無論上面那張圖怎么放大,四周的圓角都是不會被放大的!只有left(左)和top(上)邊框內才會伸縮!
在 Android中以9.PNG格式的圖片未背景,則能夠自定義拉伸而不失真,比如系統的Button就是一個典型的例子。其實呢,無論是left和 top,還是right和bottom都是把圖片分成9塊 (邊角四塊是不能縮放的,其他的四塊則是允許縮放的),所以叫做9.PNG。
關于draw9patch工具的使用在此不做闡述,需要的可以自己去百度一下。
有時候可能由于屏幕布局過于復雜,同一個布局文件很難適應所有的屏幕分辨率。可以像drawable資源一樣,在工程的res文件夾下建立多個相應的layout文件夾,為相應分辨率的屏幕編寫相應的layout文件。
文件夾的命名規范是這樣的:layout-分辨率
例如:layout-320x240 , layout-480x320等等。
系統就會根據運行環境的分辨率優先加載相應的文件夾下的layout布局文件。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。