1. 手机屏幕要素
手机: M2
分辨率:1080X1920 (手机宽度和长度的像素数)
屏幕尺寸:手机屏幕对角线长度 8寸
屏幕密度:dpi 屏幕每英寸的像素数
计算公式:(1080平方+1920平方)再开平方/8寸 = 275.36 dpi
density : 密度()
android中规定 160px/英寸,就是每英寸为160px; 意味着160dpi屏幕密度: 1dp = 1px
所以此手机的密度为: 275.36dpi/160= 1.72 倍; 意味着160dpi屏幕密度: 1dp = 1.72px
综上所述:当我们android开发者需要做适配时,可以获取分辨率和屏幕尺寸计算出屏幕密度,再计算出密度(即当前手机的1dp=XXpx),再根据UI给的px尺寸去给出dp值; 当UI标注高为30px时,我们用30/1.72;
getResources().getDisplayMetrics().densityDpi 就是屏幕密度。
getResources().getDisplayMetrics().density 就是密度, 也可以理解为1dip相当于多少个px啦。
2. 图片尺寸的适配
上述1中获取的是屏幕真实的密度,下列是系统标准密度,不可能针对每个真实密度去做一套配图,所以以系统标准密度为准,去作图适配;特殊的尺寸时,再做特殊适配;
屏幕密度 标准 密度 分辨率
120 dpi、 ldpi 0.75倍 240X320
160 dpi(基准) mdpi 1倍 320X480
240 dpi hdpi 1.5倍 480X800
320 dpi xhdpi 2倍 720X1280
480dpi xxhdpi 3倍 1080X1920
建议在xhdpi中作图(或者xxhdpi也可以),鉴于apk的大小,一般在xhdpi中放入图片就可以,计算的简单,就是1dp=2px啊,放进drawable-xhdpi的资源文件夹中。 图片的大小就通过dp去控制,这样就可以适配各种手机了;
3.屏幕的宽高差异
分辨率 320X480 480X800 720X1280与1080X1920
屏幕宽度 320dp 320dp 360dp
屏幕宽高比 2:3 3:5 9:16
如果想消除这些比例差异,可以通过添加布局文件来实现。一般情况下,布局文件放在layout文件夹中,如果要单独对360dp的屏幕进行调整,你可以单做做一个布局文件放在layout-w360dp中;如果你想对某个特殊的分辨率进行调整,那么你可以将布局文件放在标有分辨率的文件夹中,如 layout-854×480。
android Mainfest中添加,支持大屏比差;做华为mate9的适配时,图片和UI匹配不上,最后发现是屏幕宽高比原因:
<meta-data android:name="android.max_aspect" android:value="2.1"/>
Android的屏幕适配一直以来都在折磨着我们Android开发者,越来越多的手机厂商趋向于全面屏设计,比如今年出厂的 18.5:9 屏幕比例的三星 Galaxy S8 手机,前两天刚发布 18:9 屏幕比例的 OnePlus 5T 手机, 屏幕比例均超过过去常见的 16:9 比例。超大屏幕比例的设计对于 Android App 来说,存在一个屏幕适配的问题。
我们需要在 Manifest 清单文件中定义一个更大值的 android.max_aspect 属性,保证我们的 App 能够充分利用多余的屏幕空间。
注意:如果你没有使用 meta-data 标签设置 max_aspect 属性,同时 android:resizeableActivity 属性值为 true 的话,App 默认使用的最大 aspect 默认值为 1.8(大约 16:9 的样子)。max_aspect 属性表示 App 能够支持的最大屏幕比例,官方建议我们将该值设置为 2.1 或者更高的值。
备注: resizeableActivity 属性在 targetSDKVersion 小于 24 的应用中值为 false,其他为 true。
4.几个资源的文件夹
在720×1280中做了图片,要让开发人员放到drawable-xhdpi的资源文件夹中,这样才可以显示正确。个人认为仅提供一套素材就可以 了,可以测试一下应用在低端手机上运行是否流畅,如果比较卡顿,可以根据需要提供部分mdpi的图片素材,因为xhdpi中的图片运行在mdpi的手机上 会比较占内存。
以应用图标为例,xhdpi中的图标大小是96px,如果要单独给mdpi提供图标,那么这个图标大小是48px,放到drawable-mdpi 的资源文件夹中。各个资源文件夹中的图片尺寸同样符合ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12的规律。
如果你把一个高2px的分割线素材做成了9.png图片,你想让细线在不同密度中都是2px,而不被安卓根据密度进行缩放,怎么办?你可以把这个分 割线素材放到drawable-nodpi中,这个资源文件夹中的图片,将按照实际像素大小进行显示,而不会被安卓根据密度进行缩放。即在mdpi中细线 是2px(2dp),在xhdpi中细线是2px(1dp)。
5.屏幕适配命名
layout
layout-land
layout-port
values-port-xhdpi
drawable-land-xxhdpi
values-sw600dp
6.注: 计算出实际的dpi屏幕像素,做android的屏幕适配还是要匹配android官方标准的dp去适配的,
例:计算出的实际dpi为401dpi,我们在android适配时以以上标准为基础,就是xxhdpi, 3倍的,1dp=3px去做屏幕适配