android屏幕適配的整體思路
- 開發前,選取一款主流屏幕進行開發,比如現在的1280*720;
- 開發過程中,遵循一些原則:不用AbsoluteLayout(絕對佈局), 多用相對佈局&線性佈局(權重), 要用dp,不用px
dp和px的關係:dp = px/設備密度
320*480的設備密度爲1.0, 480*800的設備密度爲1.5, 1280*720的設備密度爲2.0。
// 獲取設備密度
float density = getResources().getDisplayMetrics().density;
System.out.println("設備密度:" + density);
- 開發後期,再在不同的屏幕上測試(480*800 、1920*1080)。
具體主要有如下幾種適配
- 圖片適配(不是很常用)
- 在不同的drawable文件夾下,放置幾套不同大小的圖片。
- 缺點:會導致apk體積過大。
- 如果圖片非常重要,比如app的logo,這時可以在不同的drawable下放置幾張不同大小的logo圖片
- 佈局適配(不是很常用)
- 在res目錄下,創建不同佈局的layout文件夾。比如要適配480*800的屏幕,就建立layout-800x480的文件夾
- 缺點:不利於後期維護,一旦佈局需要改動一丁點,將是一個浩大的工程。
- 尺寸適配(很常用)
- 在res目錄下,創建不同的values文件夾。比如要適配1280*720的屏幕,就建立values-1280x720文件夾,在該文件夾下,創建dimens.xml文件,在文件裏面設置尺寸。
- 權重適配(很常用)
- android:weightSum=”3” android:weight=”1”
- 在要平均分配屏幕寬度或高度時常用權重,比如一般app的底部標籤的佈局。
- 代碼適配
- int width = getWindowManager().getDefaultDisplay().getWidth();
int height = getWindowManager().getDefaultDisplay().getHeight();
- 拿到屏幕的寬高,就可以進行相關適配了。
屏幕適配的工具類
public class DisplayUtil {
/**
* 將px值轉換爲dip或dp值,保證尺寸大小不變
*
* @param pxValue
* @param scale
* (DisplayMetrics類中屬性density)
* @return
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 將dip或dp值轉換爲px值,保證尺寸大小不變
*
* @param dipValue
* @param scale
* (DisplayMetrics類中屬性density)
* @return
*/
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
/**
* 將px值轉換爲sp值,保證文字大小不變
*
* @param pxValue
* @param fontScale
* (DisplayMetrics類中屬性scaledDensity)
* @return
*/
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
/**
* 將sp值轉換爲px值,保證文字大小不變
*
* @param spValue
* @param fontScale
* (DisplayMetrics類中屬性scaledDensity)
* @return
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}