Android屏幕适配总结

Px,DPI,DIP,Density,Sp等概念

Px

Pixel,像素。不同设备显示效果相同,这里的“相同”是指像素数不会变,比如指定UI长度是100px,那不管分辨率是多少UI长度都是100px。也正是因为如此才造成了UI在小分辨率设备上被放大而失真,在大分辨率上被缩小。

Screen Size

表示屏幕尺寸。一般所说的手机屏幕大小如1.6英寸、1.9英寸、2.2英寸,都是指的对角线的长度,而不是手机面积。我们可以根据勾股定理获取手机的宽和长,当然还有面积。

Resolution

表示分辨率。指手机屏幕垂直和水平方向上的像素个数。

比如分辨率480*320指设备垂直方向有480个像素点,水平方向有320个像素点。

DPI

dots per inch,像素密度,即屏幕每英寸所包含的像素数

例如QVGA(320*240)分辨率的屏幕物理尺寸是2英寸*1.5英寸,它的DPI为160dpi

Google官方指定按照下列标准对DPI进行区分:

这里写图片描述

Density

表示密度,没有没单位,就是一个比例值,也可以叫缩放系数,值为DPI/160常见取值 1, 1.5 ,2,3,4

DIP

Density-independent pixel,与设备无关的像素。Px= DIP * (DPI / 160)

使用DIP可以使不同设备上显示的物理尺存大致一样

为什么是大致一样呢?因为我们平时所说的DPI:120(low)、160(medium)、240(high)、 320(xhigh),只是一个大概值。比如实际设备的DPI可能是243dp,但是根据标准,就被归为240dp了,也就是就近取了一个标准值

Sp

Scale-independent Pixels,缩放独立像素,用于字体显示Sp其实和DIP类似。关于Sp, 官方文档的描述是这样的:

Scale-independent Pixels – This is like the dp unit, but it is also scaled by the user’s font size preference. It is recommend you use this unit when specifying font sizes, so they will be adjusted for both the screen density and the user’s preference.

大致的意思是:Sp除了受屏幕密度影响外,还受到用户的字体大小影响(我们可以进入系统设置中修改字体大小)。通常情况下,建议使用Sp来跟随用户字体大小设置。

适配方法

布局使用

尽量使用相对布局(RelativeLayout)和线性布局(LinearLayout)。

LinearLayout使用”wrap_content“,”match_parent“和”weight“已经可以构建出不错的布局。

但是LinearLayout无法准确地控制子视图之间的位置关系,只能简单的一个挨着一个地排列。如果需要精准地定位,就应该使用RelativeLayout。

根据屏幕的配置来加载相应的布局

最小宽度限定符

根据设定的不同宽度,不同的屏幕宽度加载不同的布局(Android 3.2版本之后引入的,推荐使用)。

例如:

适配手机的单面板(默认)布局:res/layout/main.xml

适配尺寸>7寸平板的双面板布局:res/layout-sw600dp/main.xml

对于最小宽度≥ 600 dp 的设备系统会自动加载 layout-sw600dp/main.xml(双面板)布局,否则系统就会选择 layout/main.xml(单面板)布局(这个选择过程是Android系统自动选择的)。

  • sw xxxdp,即small width的缩写,其不区分方向,即无论是宽度还是高度,只要大于 xxxdp,就采用次此布局。

屏幕方向限定符

根据屏幕方向进行布局的调整。

每种屏幕尺寸和屏幕方向下的布局行为方式如下所示:

  • 小屏幕,纵向:单面板,带徽标
  • 小屏幕,横向:单面板,带徽标
  • 7 英寸平板电脑,纵向:单面板,带操作栏
  • 7 英寸平板电脑,横向:双面板,宽,带操作栏
  • 10 英寸平板电脑,纵向:双面板,窄,带操作栏
  • 10 英寸平板电脑,横向:双面板,宽,带操作栏
  • 电视,横向:双面板,宽,带操作栏

布局的具体命名规范,详见Android屏幕适配全攻略(最权威的官方适配指导)

尺寸限定符

根据不同的屏幕尺寸加载不同的布局(这种方式只适合Android 3.2版本之前)。

自动拉伸位图,nine-patch图

对于图片在不同屏幕密度上显示相同的像素效果,使用nine-patch图,即后缀为.9的格式。

使用百分比适配

我们假设手机屏幕的宽度都是320某单位,那么我们将一个屏幕宽度的总像素数平均分成320份,每一份对应具体的像素就可以了。

下面是生成的一个320*480分辨率的文件,因为宽高分割之后总分数和像素数相同,所以x1就是1px,以此类推:

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="x1">1.0px</dimen>
<dimen name="x2">2.0px</dimen>
<dimen name="x3">3.0px</dimen>
...
<dimen name="x319">319.0px</dimen>
<dimen name="x320">320px</dimen>
</resources>

那么1080*1960分辨率下是什么样子呢?

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="x1">3.37px</dimen>
<dimen name="x2">6.75px</dimen>
<dimen name="x3">10.12px</dimen>
...
<dimen name="x319">1076.62px</dimen>
<dimen name="x320">1080px</dimen>
</resources>

我们可以看下,由于1080和320是3.37倍的关系,所以x1=3.37px

无论在什么分辨率下,x320都是代表屏幕宽度,y480都是代表屏幕高度

然后我们要把生成的所有values文件夹放到res目录下:

这里写图片描述

但是手机屏幕的分辨率太多了,我们会漏掉对应分辨率的values文件夹。倘若没有对应的values文件夹,就会使用默认的values文件夹。如果默认的values文件夹没有(即没有对应的分辨率、没有对应dimen)就会报错,从而无法进行屏幕适配。

所以我只能在默认的values文件夹里面也创建对应文件,但是里面的数据却不好处理,因为不知道分辨率,我只好默认为x1=1dp保证尽量兼容。这也是这个解决方案的几个弊端,对于没有生成对应分辨率文件的手机,会使用默认values文件夹。

提供备用位图

由于 Android 可在具有各种屏幕密度的设备上运行,因此我们提供的位图资源应始终可以满足各类普遍密度范围的要求:低密度、中等密度、高密度以及超高密度。这将有助于我们的图片在所有屏幕密度上都能得到出色的质量和效果。

要生成这些图片,我们应先提取矢量格式的原始资源,然后根据以下尺寸范围针对各密度生成相应的图片:

  • xxxhdpi:4.0
  • xxhdpi:3.0
  • xhdpi:2.0
  • hdpi:1.5
  • mdpi:1.0(最低要求)

也就是说,如果我们为xhdpi设备生成了200x200px尺寸的图片,就应该使用同一资源为xxxhdpi、xxhdpi、hdpi和mdpi设备分别生成400x400、300x300 、150x150和75x75尺寸的图片

然后,将生成的图片文件放在res/下的相应子目录中(mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi),系统就会根据运行您应用的设备的屏幕密度自动选择合适的图片。关于系统如何加载资源图片的策略,请移步Android屏幕适配经验谈

  • 如果是.9图或者是不需要多个分辨率的图片,放在drawable文件夹即可。

  • 对应分辨率的图片要正确的放在合适的文件夹,否则会造成图片拉伸等问题。

使用一套图

考虑到多套图片资源占内存过大,可以只用一套图。

Google官方给出的设计图尺寸有两种方案,一种是以mdpi设计,然后对应放大得到更高分辨率的图片,另外一种则是以高分辨率作为设计大小,然后按照倍数对应缩小到小分辨率的图片

使用第一种方法,如果把图片放大有可能会不清晰,建议使用第二种方法。

分辨率可以以1280*720或者是1960*1080作为主要分辨率进行设计

参考:
1.谷歌官方文档–支持多种屏幕
2.Android屏幕适配全攻略(最权威的官方适配指导)
3.Android 屏幕适配方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章