最近工作安排需要在某一项目适配两种不同的像素密度,目前的工作是需要由现在的像素密度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