Android屏幕适配(头条方案)与在线.9图制作的冲突
承接上篇 Android屏幕适配—以指定宽高确认dp⬅➡px转换(头条方案) 带来了极其方便的UI开发便携,但是有些地方还是需要注意下的。
需求:网络图片的.9实现
我们代码实现一个图片的.9功能往往是下载图片(bitmap)->根据与UI协定转为NinePatchDrawable最后使用。当面对如下要求的时候
宽度需要严丝合缝,高度下边需要拉伸,图片裁切是以1080P为标准。
问题
开发流程是首先下载bitmap->根据分辨率进行原图等比例缩放->NinePatchDrawable。
我们下载原图后 bitmap.getWidth()==960px,以P40PRO手机为例分辨率是(2640*1200),于是我们根据比例将bitmap等比例放大到1066.6667,
结果未使用分辨率适配方案情况下是正常的,但是使用分辨率适配方案后出现异常,宽度并没有被严丝合缝 反而X轴有被压扁。
排查
猜测是bitmap的宽高出现了问题 于是我们打印出来
原图宽度960px->缩放后是1066.66667px->转为NinePatchDrawable发现宽度变成了1073,看来问题出现在这里,由于我们修改过DisplayMetrics的参数,于是我们发现他们1073/1066 = displayMetrics.density调整后/ displayMetrics.density调整前
解决
尝试方案:
我们将bitmap缩小(displayMetrics.density调整后/ displayMetrics.density调整前),再转成NinePatchDrawable是不是就正常了呢?
测试后发现确实部分机型是成功的,但是低于1080P的手机下以及虚拟机中并没有成功,由于我们使用分辨率适配方案其中之一目标是解决部分手机的宽度dp与标准的宽度dp不一致的问题,是不是我们去判断非标准dp则需要去预先调整呢,测试后发现并不理想,标准dp判断没有很好的方案。
最终解决
我们发现bitmap中具备density属性,于是我们通过debug发现在bitmap中的density是530,NinePatchDrawable中density是533,略微不同(小米8上差异则特别大),于是我们可以确认这里才是关键点,分辨率适配方案调整后NinePatchDrawable中density是对的,530是修改之前的,我们发现Bitmap默认的density= getDefaultDensity() =DisplayMetrics.DENSITY_DEVICE =SystemProperties.getInt("qemu.sf.lcd_density",SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT))
我们尝试给bitmap设置density为displayMetrics.density(分辨率适配调整后的),完美解决。