Android适配不同的屏幕密度和DPI的方法

在Android开发中有时会遇到在不同的手机上界面不适配的问题,控件忽大忽小,而且就连两个分辨率相同的手机有时也会出现这种问题。其实出现界面适配问题的原因,并不仅仅有分辨率,还有一个更重要的因素是:屏幕密度与DPI。屏幕密度与DPI这个概念紧密相连,屏幕密度是对每个像素点的缩放比例,DPI全拼是dots-per-inch,即每英寸显示的像素点数。
有种方式可以解决上述问题,即:smallestWidth适配或sw限定符适配。这种方式是指:Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值或电视的高度值),然后根据此值自动匹配资源文件中对应限定符目录下的资源文件。

但首先要计算出待适配设备的最小宽度dp值,方法如下:
1.首先在任意的Activity中添加如下测试代码,以便得出所需的参数:(得出参数后,可以删除此测试代码)

DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels;//屏幕宽度(单位:px)
int height = metric.heightPixels;//屏幕高度(单位:px)
float density = metric.density;//屏幕密度(常见的有:1.5、2.0、3.0)
int densityDpi = metric.densityDpi;//屏幕DPI(常见的有:240、320、480)
Log.d(TAG, "width=" + width + ",height=" + height + ",density=" + density + ",densityDpi=" + densityDpi);


经测试3个不同的系统得出的结果如下:
width=1280,height=720,density=1.3312501,densityDpi=213
width=1920,height=1080,density=1.5,densityDpi=240
width=1920,height=1080,density=2.0,densityDpi=320

2.计算最小宽度dp值,方法如下:
用上述得出的width和height中的最小值,除以density就可以了。
上述3个系统的结果如下:
720/1.3312501 = 540;
1080/1.5 = 720;
1080/2.0 = 540;

注:从上述结果可知,第1个和第3个系统虽然分辨率和DPI都不同,但是最小宽度dp值是相同的,这就意味着这两个系统可以共用一套dimen值。

3.根据不同的最小宽度dp值,创建不同的values目录:
创建默认的values目录,创建dimens.xml文件,用来定义各种尺寸。通常是UI给的那一套dp换算标准。
依次创建values-sw540dp和values-sw720dp目录,创建dimens.xml文件,根据不同的dp换算标准修改所有的值。

注:如果之前已经创建了values-hdpi和values-xhdpi等方式的目录,一般可以直接转换成sw方式的目录,如果不能直接使用,请一定删除,否则系统可能会匹配到这些目录,还是会出现适配问题。
 

你可能感兴趣的:(Android相关)