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);
}
}