关键点:设计图与App界面的转换,分辨率是核心问题
dp适配:
官方提供工具,后续的解决方案也是以此为基础;
公式:px = dp(dpi/160)
dpi是像素密度,软件概念上的值,但可能不同尺寸的相同分辨率手机会有不一样的值,这也导致了这套方案会有少部分手机适配不了
宽高限定符适配
穷举市面所有手机宽高像素值
设定基准分辨率(一般是设计稿尺寸),并在其他尺寸编写对应dimens文件
致命问题:必须精准命中,容错差
sw限定符适配
根据横向dp值寻找对应资源文件
该方案关键在于系统在查询不到对应dp文件夹时,会自动向下寻找最近的dp文件夹
相比起下面的方案,这套方案更加可控,扩展也方便,比较适合提供独立服务的项目使用
配置限定符
常用限定符
- 语言和区域:en, fr, en-rUS 等等
- smallestWidth:sw<N>dp 如:sw320dp, sw600dp, sw720dp 等等,屏幕可用高度和宽度的最小尺寸,屏幕的“最小可能尺寸”。
- 屏幕方向:port 设备处于纵向(垂直),land 设备处于横向(水平)
- 屏幕像素密度:ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi, nodpi, tvdpi
注:这些限定符必须遵循上面列出的顺序,所以上面的列表是有顺序的。例如:错误:drawable-hdpi-port/,正确:drawable-port-hdpi/
mipmap和drawable
mipmap 文件夹下,仅仅建议放启动图标 (app launcher icons),也就是应用安装后,会显示在桌面的那个图标,而其他的图片资源等,还是按照以前方式,放在 drawable 文件夹下。
在应用安装时 Android 资源优化会把 drawable 文件夹下不需要的分辨率资源删除掉;Android 会保证 mipmap 下的资源不会因为资源优化而被删除,确保大尺寸的 Launcher Icon 可以找到更合适分辨率的 Icon。
今日头条适配方案
通过修改density值,强行把所有不同尺寸分辨率的手机的宽度dp值改成一个统一的值,这样就解决了所有的适配问题,缺点在于如果是提供独立服务,会直接影响到使用服务的应用,老业务的修改成本也会很大
比如,设计稿宽度是360px,那么开发这边就会把目标dp值设为360dp,在不同的设备中,动态修改density值,从而保证(手机像素宽度)px/density这个值始终是360dp,这样的话,就能保证UI在不同的设备上表现一致了。
这个方案侵入性很低,而且也没有涉及私有API,应该也是极不错的方案,我暂时也想不到强行修改density是否会有其他影响,既然有今日头条的大厂在用,稳定性应当是有保证的。