Android屏幕适配(头条方案)与在线.9图制作的冲突

本文探讨了Android开发中使用头条屏幕适配方案与在线.9图制作时遇到的问题。当需要实现宽度严丝合缝、高度可拉伸的.9图时,由于分辨率适配导致 NinePatchDrawable 宽度异常。通过分析发现,问题出在 bitmap 的 density 上。最终解决方案是设置 bitmap 的 density 为 DisplayMetrics 的 density,确保与适配方案一致,从而解决了图片显示异常的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(分辨率适配调整后的),完美解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值