首先在开发者我们要养成一个良好的开发习惯,遵循一些好的屏幕适配原则:
开发前部分阶段:比如尽量不用AbsoluteLayout(绝对布局),多用线性布局与相对布局,设置宽高边距等尺寸用dp(dip),不要用px。开发调试选择主流屏幕(1280*720)
开发后阶段:在不同分辨率手机(主流的手机分辨率和当前市场主流手机)上测试,没有大问题(不影响使用,比如不同分辨率相差一两个像素这样,当然,如果公司要求较 高就必须处理了)就可以发布上线使用。
出现问题解决方法:
1、图片适配
该方法不常用,当图片在不同屏幕手机上出现偏差、失侦等情况,很简单,让UI给你多切几套图,放在res目录下的drawable-hdpi、drawable-mdpi、drawable- xhdpi、drawable-xxhdpi、drawable-xxxhdpi,这几个目录分别对应不同的屏幕,当不同屏幕启动App时候会优先去访问其对应的目录下的图片 资源,如果对应下面没有才回去访问其他的目录。
2、布局适配
该方法也不常用,其原理和图片适配差不多,就是当不同屏幕上同一个布局文件不能满足需求,比如大屏幕需要做特殊显示这种,此时就在res目录下新建一个文件夹 layout-800x480(适配480*800的屏幕,其他屏幕同样方法新建即可),然后在里面去对进行指定的设置布局文件了。
3、尺寸适配
这里先介绍一个概率:设备密度(dp和px的转换关系,dp=px/设备密度);320*240(0.75), 480*320(1),480*800(1.5),1280*720(2)这是主流几大屏幕对应的设备密 度。
一般在开发者,美工UI给我们的都是PX,我们在设置的时候就不能还自己把PX缓存DP这么简单了,比如说,美工在1280*720上面切了一套图,给出的某个控件宽100px,那么此时我们在布局文件设置就应该设置为50dp(100/设备密度);在一些需求中,不同屏幕需要设置不同的尺寸,此时可以新建一个values-(分辨率)这样的目录,在其下面有一个dimens文件(在原values下的dimens也要设置),在里面进行尺寸设置然后再布局里面调用即可,同样的道理,手机访问App当调用values里面的文件时会优先调优和自己对应的文件。
还有一点就是我们在代码中设置尺寸适合java代码默认为px,我们需要用一个工具类进行转换
dp与px直接转换的工具类:
public class ScreenSizeAdapter {
/**
* dip转为 px
*/
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
/**
* px 转为 dip
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
4、权重适配
线性布局才能够设置权重。在LinearLayout属性设置里面可以设置总权重android:weightSum;然后在里面的空间去分配权重,这样不管在什么手机,都是按照权重比例来进行显示的。
5、代码适配
代码适配类似于权重适配,权重适配可以用代码适配来实习,但是代码适配就不一定能够用权重适配来实现,比如相对布局不能用权重,就可以代码来控制。实现原理是:计算屏幕宽高,动态的来设置空间宽高。一般根据比例去计算,比如侧滑菜单和主界面分别的比例,此时就可以这样动态去计算
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
int whdth = dm.widthPixels;//获取屏幕宽度
int height = dm.heightPixels;//获取屏幕高度