养成良好的开发习惯: 多用dp,sp,不用px; 多用线性布局和相对布局, 不用绝对布局; 代码中如果必须设置像素的话, 将dp转为px进行设置
图片适配
手机分辨率 密度
ldpi: 240*320 0.75 高分辨率
mdpi: 320*240 1 低分辨率
hdpi: 480*800 1.5 中分辨率
xhdpi: 1280*720 2 超高分辨率
xxhdpi: 1920*1080 3 超超高分辨率
常规做法: 做一套图 1280*720 切图, 放在hdpi或xhdpi下. 如果某个屏幕出了问题, 再针对该屏幕, 对相关出问题的图片进行替换.
布局适配
在res下创建对应的分辨率文件夹然后再写对应的xml布局(注意:xml文件名不能变)
layout-800x480:专门针对480*800屏幕适配的布局文件, 一般只调整位置和大小, 不建议对控件类型和个数进行调整
尺寸适配 (常用)
在布局文件中使用dp为什么不使用px。因为px是像素,而dp是根据不同的手机屏幕分辨率和密度来计算出来的数值。
//dp 和 px的关系
//dp = px/设备密度
//实际显示的px=dp*设备密度
获取当前手机屏幕设备密度:
getResources().getDisplayMetrics().density
//values-1280x720/dimens.xml
在一些手机上横屏过来也可能显示的不一样,可以在res下创建values-对应的分辨率,然后创建dimens.xml。最后在布局文件中使用@dimens/XXX
权重适配
android:weightSum=" "总共分成几份
android:weight=" " 控件占几份
代码适配
在一些java代码中有可能要对控件的宽度高度或者边距进行设置,而进行设置的时候需要的是一个px。所以这样在不同的手机屏幕上会出现不同的效果。所以需要用代码进行适配,在对控件进行操作的时候使用工具类来把dp转换成px
获取当前手机屏幕设备密度:
getResources().getDisplayMetrics().density
public class DensityUtils {
//dp转换成px
public static int dip2px(float dip, Context ctx) {
float density = ctx.getResources().getDisplayMetrics().density;
int px = (int) (dip * density + 0.5f);// 4.9->4, 4.1->4, 四舍五入
return px;
}
//px转换成dp
public static float px2dip(int px, Context ctx) {
float density = ctx.getResources().getDisplayMetrics().density;
float dp = px / density;
return dp;
}
}