最近工作安排需要在某一项目适配两种不同的像素密度,目前的工作是需要由现在的像素密度160修改为240。
一,确认像素密度
通过以下命可以进行像素密度查询:
wm density或者通过属性方式查询到像素密度getprop ro.sf.lcd_density。
二,修改设备像素密度
已知默认像素密度由系统属性ro.sf.lcd_density定义,该属性为ro.开头。在Android中规定以该key开头的属性不能使用setprop ro.xx xx来修改ro.sf.lcd_density属性,所以必须要在root权限下将system分区挂载,修改/system/build.prop文件中的属性值来实现。将ro.sf.lcd_density修改为240之后设备进行重启。
三,确认修改点
查看到所有的应用视图均进行了一定的放大,在对应需要修改的项目中存在以下文件树:
app/src/main/res/layout/main_layout.xml
app/src/main/res/values/dimens.xml
其中main_layout.xml文件中进行了一些布局定义,而在dimens.xml中使用dp定义了对应view的尺寸,由于该项目属于已上线远古老项目,也不适合对布局进行大幅度的修改。因此需要花极小的修改成本实现两个像素密度即可。
四,了解安卓应用分辨率文件适配机制
在查阅到一些项目后发现,使用了较多的values,values-sw720dp,values-sw1080dp文件夹命名大致知道该sw**dip应该与分辨率或者像素密度有关。SW全称是Smallest Width
| 机型 | 分辨率 | sw | dpi=ro.sf.lcd_density | sw*DENSITY_DEFAULT/dpi | dp | 
|---|---|---|---|---|---|
| H7(Android5.1) | 1280*720 | 720 | 213 | 720*160/213=540.84 | sw480dp | 
| H7(Android4.4) | 1280*720 | 720 | 160 | 720*160/160=720 | sw720dp | 
| 平板A | 1920*1200 | 1200 | 320 | 1200*160/320=600 | sw600dp | 
| 平板B | 1920*1080 | 1080 | 240 | 1080*160/240=720 | sw720dp | 
| 平板C | 1920*1080 | 1080 | 160 | 1080*160/160=1080 | sw1080dp | 
| 平板D | 2000*1200 | 1200 | 320 | 1200*160/320=600 | sw600dp | 
其中常量DENSITY_DEFAULT由android.util.DisplayMetrics#DENSITY_DEFAULT定义,常见的Android源码中一般均被赋值为160
依据此表可用初步得出适配设备的分辨率为1920*1080,计算出来对应的文件夹名称分别为160=>sw1080dp和240=>sw720dp。
五,适配像素密度。
首先将app/src/main/res/layout/中的布局文件全部使用@dimen进行定义。分别在values-sw720dp,values-sw1080dp均定义对应的尺寸值,另外需要注意的是尺寸中wrap_content定义值为-2dp,fill_parent其值为-1dp