Android适配自己总结的心德 & 同时适配手机和平板 & 同时适配横竖屏幕切换

5,677 阅读6分钟

前言:关于这个问题就设计到了很多单位了,什么px、pt、dp、sp,手机尺寸,ppi等等,我这里只介绍我解除过比较靠谱的。如果你有更好的屏幕适配方案,请在评论区留下链接。非常感谢

一、最小宽度 限定符(推荐)

什么是最小宽度限定符,先看看我的截图把:

没错,以values-sw360dp 这种结尾的文件夹,和你项目里的values文件处于同一级。

我简单用我的话理解下:google推荐使用的单位是dp(就像苹果推荐使用的单位是pt一样),这里的意思是屏幕密度的意思。听到密度就知道了。虽然各大android尺寸分辨率很多,但是用密度衡量的话,会显得很少。简单的话来说就是:1寸的屏幕里,像素点是一样的

1.1、感谢大神插件ScreenMatch

详细链接,感谢

当你会使用ScreenMatch插件后,我稍微讲下screenMatch.properties这个文件,是插件自动生成的:

点开的是这样的

############################################################################
#
# You need to refresh or reopen the project every time you modify the configuration,
# or you can't get the latest configuration parameters.
#
#############################################################################
#
# Base dp value for screen match. Cut the screen into [base_dp] parts.
# Data type is double. System default value is 360.
# I advise you not to modify the value, be careful !!!!!!!!! _^_  *_*
# 设计图上最小的宽度的基准值。意思就是满屏时是360dp
base_dp=360
# Also need to match the phone screen of [match_dp].
# If you have another dp values.
# System default values is 320,360,384,392.7272,400,410,411.4285,432,480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365
# 要适配的最小宽度有哪些宽度
match_dp=320,360,384,392.7272,400,410,411.4285,432,480,533,592,600,640
# If you not wanna to match dp values above. Write some above values here, append value with "," .
# For example: 811,961,1365
# 需要忽略适配的宽度有哪些
ignore_dp=662,720,768,800,811,820,960,961,1024,1280,1365
# They're not android module name. If has more,split with , Symbol.
# If you set, it will not show in SelectDialog.
# If you have, write here and append value with "," .
# For example: testLibrary,commonModule
  • base_dp=360 这里上面写的是你设计图上满屏的dp值。只要设置之后,手机上适配,控件的大小就可以温泉按照设计图走。超方便
  • match_dp=320,360,384,392.7272,400,410,411.4285,432,480,533,592,600,640 要适配的最小宽度有哪些宽度
  • ignore_dp=662,720,768,800,811,820,960,961,1024,1280,1365 需要忽略适配的宽度有哪些

1.2、同时适配 手机 & 平板

首先我们要知道一点,同时要适配手机和平板,这里应该有2套布局。做一套手机的做一套平板的。知道这个就好办了。我们都知道手机屏幕的大小一般在3英寸-5英寸之间,平板电脑的大小在7英寸-10英寸之间。所以手机会直接运行layout里的布局。我们再定义一个layout-sw600dp文件夹,与layout同一层。里面的布局就是平板布局。当然你要更精细的可以协商不同尺寸的文件夹。如下

这样的话运行在手机上,会走layout。运行在平板会走layout-sw600dp。你可以放2套不同的布局试试。但是你的layout的xml名称要保持一致哦。
我首先运行在手机上,再运行在平板上。同一个项目,看效果


1.3、同时适配横竖屏

当你会使用screenMatch插件里,是不是生成了很多最小宽度限定符swXXdp的文件夹。之前也说了最小宽度限定符,是不区分横竖屏,既最小那边是最小宽度。那么这样的话在切换横竖屏幕的时候是会混乱的。意思你再竖屏的时候设置了一个控件,占屏幕宽度一半,但切换到横屏时,却没有占一半。具体怎么做呢??
将插件生成的文件夹,前面的swXXdp的s去掉,变成wXXdp。,大致意思,当前方向就是最小宽度的方向,这里区分了横竖屏了。看下面效果(这里配置好了,我什么都没干,只是旋转了手机,看适配效果):

这里稍微提下,就不细讲了。如果你想单独为横屏或者竖屏幕适配一套,可以利用横竖限定符

  • values-sw400dp-land (最小宽度 400 dp 横向)
  • values-sw400dp-port (最小宽度 400 dp 纵向)

关于以上demo链接

二、屏幕分辨率限定符( 小心使用 )

什么是屏幕分辨率限定符?

首先感谢张鸿洋的自动生成工具

但是经过我具体细致的测试下,我发现问题大大的。首先这本身就是屏幕分辨率限定符的弊端。先看我的测试,我使用的真机测试机,

很明显我的手机是1080 x 1920的分辨率。这里我们从lay_x.xml分析就行了。首先我是以设计图里的宽度375去生成这些文件夹。 之后我在Activity里放了2个控件,一个设置成@dimen/x375,另外一个设置成@dimen/x187。但是结果并不是,一个满屏,一个半屏。之后我很奇怪所以我在Activity里打印了当前@dimen/x375的长度,和屏幕当前宽度。结果是这样的:

发现屏幕宽度确实是1080。但是@dimen/x375的值确是800。然后我那一堆values文件夹里去找,找到了values-1280x800文件夹里是800px。但是我就有点奇怪了。既然有values-1920x1080文件夹。为什么不走呢??!!我后面怒删values-1280x800文件夹。结果走的是values-1280x768。我整个人都震惊了,震惊了。我在想,我以前某些项目岂不是坑爹了。!!后面继续怒删values-1280x768文件夹。结果删了一个遍,系统一直去往上找。就是不找1920x1080。没办法继续去找资料了解这个机制。直接给链接吧

被误用的屏幕分辨率限定符
Android 屏幕适配,比较全的方案

个人建议屏幕分辨率限定符还是小心使用吧。不像screenMathch那样能经受的住考验。如果你有更好的屏幕适配方法,请在评论区留下链接。一起加油进步。3q

三、今日头条屏幕适配方案

今日头条屏幕适配方案终极版,一个极低成本的 Android 屏幕适配方案
字节跳动官方文章
小结:经过实际测试和大量虚拟机测试,今日头条是以360dp为例,且以160dpi为例。不改代码直接去试。设置了360dp后,如果属于160dpi的手机确实正常,但是不是160的dpi却不是满屏。且如果动态获取dpi:appDisplayMetrics.densityDpi。却发现还是不能实现如官网文章所说的效果。是我忽略什么了吗?而且全it平台全是以官网文章为例子,360和160。大家真的用了多种机型测试过吗。希望有比较了解的,能解决我的疑惑!!!