屏幕适配

谷歌官方提供屏幕兼容性指南,可以参考如👇

https://developer.android.google.cn/guide/practices/screens_support

术语与概念

  • 屏幕尺寸:Android中的所有实际的屏幕R寸分为四个广义大小:小,正常,大,和超大。(small, normal, large, and extra-large)
  • 屏幕像素密度:即屏幕的物理区域内的像素的数量,通常被称为dpi (每英寸点数)

Android中的所有实际的屏幕密度分为六个广义密度:低,中,高,超高,超超高,超超超高。

(low, medium, high, extra-high, extra-extra-high, and extra-extra-extra-high)

小、正常、大、超大

ldpi(low) ——120dpi、mldpi(medium) ——160dpi、hldpi(high) ——240dpi、xhldpi(extra-high) ——320dpi、xxhldpi(extra-extra-high) ——480dpi、xxxhldpi(extra-extra-extra-high) ——640dpi

 

 

  • 方向:从用户的角度看到的屏幕方向。一般为横向或纵向,即屏幕的宽高比。
  • 分辨率:在屏幕上的物理像素的总数。
  • 密度无关像素(DP) :虚拟像素单元。在定义U布局的时候,你应当使用与密度无关的方式来表示布局尺寸或者位置。
  • 屏幕支持的范围:Android把实际的屏幕尺寸的密度分成一组(四个)广义大小和一组(六种)广义密度。

解决图片适配问题

android中图片适配是一件很棘手的事情,比如一张同样大小的图片在不同屏幕上显示的大小是不一样的。

ppi(pixel per inch)名词,就是每英寸的距离像素点的个数。
例如:HVGA屏320*480,一般是3.5寸,计算点密度为√根号(3202+4802)/3.5=164,约等于160。

ppi越低图片显示越大,ppi越高图片显示越小,如下图所示

要想达到在不同屏幕上图片显示的大小一样,如下图所示,我们应该为不同ppi的设备提供不同的图片,Android系统会自动去匹配相应的图片

创建用于不同密度可代替的位图,你应该遵循3:4:6:8:12:16缩放比例六广义密度之间。

例如,如果你有一个位图drawable的中等密度屏幕4848像素,所有不同大小应:

  • 超大屏幕是至少960dp720dp
  • 大屏幕是至少640dp480dp
  • 正常屏幕是至少470dp320dp
  • 小屏幕是至少426dp*320dp

获取屏幕宽和高 

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        //获取屏幕宽高
        int heightPixels = displayMetrics.heightPixels;
        int widthPixels = displayMetrics.widthPixels;

获取DPI和DENSITY

基于👆

        float density = displayMetrics.density;
        int dpi = displayMetrics.densityDpi;

解决布局适配问题

可以参考https://developer.android.google.cn/training/multiscreen/screensizes.html#flexible-layout

我们已经解决了资源图片的适配问题,但是图片的大小不同势必会造成布局的差异,如果使用一个统一的布局文件,可能会造成资源图片无法完整显示在屏幕内,所以对于这种问题,解决方法是建立不同的layout文件夹, 对于不同屏幕的分辨率,书写其专用的.xml文件。
多个layout文件夹在命名上有相应规则,以分辨率480x854为例, 需要建立480x854像素的layout文件夹,命名: layout-854x480
有两点需要注意:

  1. 大数(854) 必须在前,否则会报错;
  2. 两个数字之间的符号是小写英文字母"x", 不是乘号。

系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的布局文件。

小结

为每个drawable目录都生成对应的图片版本,图片较多的话会无形增加应用的大小。

假设我们在drawable-hdpi (对应的ppi为160ppi)目录下存放了一个100X100的图片,那么当图片需要在320ppi的android设备上进行显示时,android系统将会自动的对图片进行处理,并生成一个200X200的图片显示到设备上。

那么他们占用的空间大小分别为100/160 =3/5 inch和200/320 = 3/5 inch

可以看出他们占用的长和宽都是一样的。

  • 这种自动缩放的优点是只需要一张图片就能适应各种ppi类型的屏幕。
  • 缺点是当对100X100的图片进行变换成200X200的图片时肯能会造成图片的不清晰。

建议是将比较重要的图片资源提供多个版本

(当android设备和自己的ppi相对应的drawable下找到想要的资源时,就不会再到其他目录需找资源)。

不是很重要的图片资源存储一个版本,让系统根据自己的ppi自己对图片进行适当的缩放显示。