昨天就沒有更新文章,在不更新就說不過去了棒动,今天是清明節(jié)的第一天糙申,我沒有出去玩,不過在我心里是這么認為的船惨,心中有風景柜裸,到哪都是旅游。不好意思粱锐,扯遠啦疙挺,收回來。
做過Android項目的人應該都知道怜浅,Android的屏幕適配問題是比較煩人的铐然,因為Android不像IOS那樣,只要那幾個分辨率恶座,反觀Android就不同搀暑,Android手機的屏幕分辨率類別太多。雖然本人也沒有做過幾個Android項目奥裸,但是今天還是想談談Anroid的屏幕適配险掀,當做是一個對自己學習的總結吧,如果有沒有涉及的地方湾宙,還請大家多多指教樟氢。
本人把Android的屏幕適配問題分為5個模塊,分別是圖片適配侠鳄、布局適配埠啃、尺寸適配、權重適配伟恶、代碼適配碴开。
前言
開發(fā)過Android的同學應該都知道,在Android的res目錄下有這樣幾個目錄博秫,分別是drawable-hdpi潦牛、drawable-ldpi、drawable-mdpi挡育、drawable-xdpi巴碗、drawable-xxhdpi。
- drawable-hdpi:高分辨率
- drawable-ldpi:低分辨率
- drawable-mdpi:中等分辨率
- drawable-xdpi:更高分辨率
- drawable-xxdpi:最高分辨率
圖片適配
在剛開始學習Android的時候即寒,只知道把圖片直接拷貝都drawable-hdpi目錄下橡淆,一開始的時候只知道這幾個目錄是用來做屏幕適配的,現(xiàn)在終于了解到了母赵,現(xiàn)在我來模擬一個場景讓大家了解什么是圖片適配逸爵。但是這種適配我們一般用的比較少。
假設一個場景凹嘲,如果一張圖片顯示在低分辨率的手機上剛好师倔,但是如果它顯示到特別高的分辨率手機上的時候,你會感覺它比較小周蹭,這個時候溯革,我們就可以讓我們的美工美眉切幾張不同大小的圖片,并它他們放到相對應的目錄下谷醉,當系統(tǒng)在加載的時候致稀,會根據(jù)手機的分辨率對應的目錄下查找需要的圖片。
布局適配
首先說一下俱尼,這個也不是很常用抖单。假設我們要專門適配480x800的屏幕,這里的數(shù)值指的都是像素遇八,可以新建一個在src/目錄下新建一個layout-800x480 目錄矛绘,然后把響應的布局拷到這個目錄下,即可刃永,說一下一個應用場景货矮。
假設我們在320x480的屏幕上顯示一個TextView,但是我們卻想讓屏幕為480x800的手機在相同的位置上顯示一個Button斯够,我們就可以這樣弄囚玫。
尺寸適配
首先說一個喧锦,這個非常常用,首先我們來了解一下dp和px(像素)的關系抓督。dp = px/設備密度 燃少,那么我們在代碼中如何獲取設備的密度。使用如下代碼即可
float density = getResources().getDisplayMetrics().density;
System.out.println("設備密度:" + density);
那么接下來我們說說設備密度值是以什么為參考的铃在,答案是一320x480的設備密度值為1阵具,那么320x240就是0.75,480x800是1.5,1280x720是2。
那么我們要怎么適配呢定铜?我們也模擬一個場景阳液。
假設我們要在屏幕上顯示一個寬度為屏幕寬度一般的TextView,怎么看出來它占一半呢揣炕?我們可以給這個TextView加一個背景帘皿。如果是在320x480的手機上,我們寫的160dp和160px效果是相同的祝沸,但是其他分辨率的手機矮烹,我們絕對不能使用px。假設我們寫對了罩锐,我們寫的是160dp奉狈,那么在480x800下效果也是正常的,我來舉一個不正常的例子涩惑,我的手機的魅族的手機仁期,屏幕分辨率是1800X1080,但是我的手機的設備密度值為2.5竭恬。如果要達到相同的效果跛蛋,我寫的應該是216dp。怎么算出來的呢痊硕?1080是我手機的寬度赊级,這個是像素哦。那么根據(jù)公式岔绸,dp = 1080 / 2 /2.5 ==>dp = 216dp理逊。如果我們使用的還是160dp,那么我的手機就顯示一小半盒揉,但是如果改成了216dp晋被,那么在低分辨率的手機上又顯示錯誤了,這個時候我們應該怎么辦呢刚盈?我們可以這樣做羡洛,在dimens.xml中定義一個<dimen name="textViewWidth">160dp</dimen>。在/res目錄下藕漱,新建一個values-1800x1080目錄欲侮,把values目錄下的dimens.xml復制過去崭闲,然后我們把它改成216dp,這樣就完成了適配锈麸,但是布局文件中我們應該要使用textViewWidth這個尺寸镀脂。
權重適配
android:weightSum="3"
這句代碼可以定義這個控件的權重值牺蹄,那么在子控件中只能分配權重為3忘伞。這樣我們就可以實現(xiàn)兩個TextView各占1/3的效果了。
代碼適配
通常我們在寫代碼的時候沙兰,不能把尺寸的像素尺寸寫死氓奈,因為我們要考慮到一個屏幕適配的問題,模擬一個場景鼎天。
假設我們在項目使用到了SlidingMenu的開源側滑菜單舀奶,我們要給側滑菜單的寬度設置為屏幕的1/3,其中有一個方法是設置菜單的寬度斋射,在這里我們就不能給寫死了育勺,因為我們寫死的值是像素值,它不是dp值罗岖,那么我們要做的事就是根據(jù)屏幕分辨率來獲取到屏幕的1/3是多少個dp值涧至,然后根據(jù)dp值和設備密度值來計算像素值,這樣才可以設置像素值桑包。下面是一個工具類南蓬,用于dp和px的轉換。
public class DensityUtil {
/**
* 根據(jù)手機的分辨率從 dip 的單位 轉成為 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根據(jù)手機的分辨率從 px(像素) 的單位 轉成為 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}