适配像素密度

最近工作安排需要在某一项目适配两种不同的像素密度,目前的工作是需要由现在的像素密度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_DEFAULTandroid.util.DisplayMetrics#DENSITY_DEFAULT定义,常见的Android源码中一般均被赋值为160
依据此表可用初步得出适配设备的分辨率为1920*1080,计算出来对应的文件夹名称分别为160=>sw1080dp240=>sw720dp

五,适配像素密度。
首先将app/src/main/res/layout/中的布局文件全部使用@dimen进行定义。分别在values-sw720dp,values-sw1080dp均定义对应的尺寸值,另外需要注意的是尺寸中wrap_content定义值为-2dp,fill_parent其值为-1dp

发表回复

CAPTCHAis initialing...