Android屏幕适配

来源:互联网 发布:学知不足 教然后知困 编辑:程序博客网 时间:2024/06/06 13:17

Android屏幕适配

Android屏幕适配是一个Android开发中很重要的一环,为了让程序有更好的适配能力,在指定控件和布局大小的时候最好使用match_parent和wrap-content,尽量避免将控件的宽和高设定为一个固定的值。不过在有些情况下,仅仅使用这两个属性值无法满足我们的需要。这就需要我们给控件的高或宽指定一个固定的值。要想搞懂屏幕适配,我们先来了解一下一些基本概念。

基本概念

  • px(pixel的缩写,屏幕中可以显示的最小元素单元) :意为像素,指的是屏幕上的点,我们通常所说的的分辨率800x400就是指的分辨率。
    在设计领域中,像素是用来计算数码影像的最小单位。计算机中显示的图像并非连续的线条组成,而是由许多肉眼看不见的小点组成。如果把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小点所组成,这些小点就是构成影像的最小单位“像素”。由于是最小的独立显示单位,px均为整数,不会出现0.5px的情况。
  • pt(磅):全称为point,但中文不叫“点”,查英语字典可以看到,确切的说法是一个专用的印刷单位“磅”,大小为1/72英寸。所以它是一个自然界标准的长度单位,也称为“绝对长度”。

在过去的PC上使用px和pt的时候可以说是得心应手,能把程序打扮的漂漂亮亮的。但是在手机上,因为手机的分辨率各不相同,一个200px宽的按钮在低分辨率手机上可能将近满屏,而到了高分辨率的手机上可能只占据屏幕的一半。

  • in (手机屏幕大小的尺寸指的是对角线的长度): 表示英寸,是屏幕的物理尺寸。每英寸等于2.54厘米。例如我们经常说的手机屏幕大小有,5(英)寸、4(英)寸就是指这个单位。这些尺寸是屏幕的对角线长度。如果手机的屏幕是4英寸,表示手机的屏幕(可视区域)对角线长度是4 X 2.54 = 10.16厘米。
  • dp 也即dip,设备独立像素,device independent pixels的缩写,Android特有的单位,在屏幕密度dpi = 160屏幕上,1dp = 1px。
  • dpi : 是Dots Per Inch的缩写, 每英寸点数,即每英寸包含像素个数。比如320X480分辨率的手机,宽2英寸,高3英寸, 每英寸包含的像素点的数量为320/2=160dpi(横向)或480/3=160dpi(纵向),160就是这部手机的dpi,横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。
  • density : 屏幕密度,density和dpi的关系为 density = dpi/160。
  • sp:可伸缩像素,它采用了和dp相同的设计理念,解决了文字大小适配的问题。

Android Drawable

当我们新建一个Android项目的时候,我们会看到很多android-drawable文件夹,分别对应着不同的dpi:

  • drawable-ldpi (dpi=120, density=0.75,320x240)

  • drawable-mdpi (dpi=160, density=1 , 480x320)

  • drawable-hdpi (dpi=240, density=1.5, 800x480)

  • drawable-xhdpi (dpi=320, density=2 ,1280x720)

  • drawable-xxhdpi (dpi=480, density=3 , 1920x1280)
    这里写图片描述

一些大公司可能会为每种dpi都切一套图,去适配每种dpi的屏幕。但是这样不仅会为美工或者设计增加工作量,同时也会使apk包变得很大。如何同时兼顾屏幕适配和最小占用设计资源呢?

首先必须清楚一个自动渲染的概念,Android SDK会自动屏幕尺寸选择对应的资源文件进行渲染,如SDK检测到你手机dpi是160的话会优先到drawable-mdpi文件夹下找对应的图片资源,注意只是优先,假设你手机dpi是160,但是你只在xhpdi文件夹下有对应的图片资源文件,程序一样可以正常运行。所以理论上来说只需要提供一种规格的图片资源就ok了,如果只提供ldpi规格的图片,对于大分辨率的手机如果把图片放大就会不清晰,所以需要提供一套你需要支持的最大dpi的图片,这样即使用户的手机分辨率很小,这样图片缩小依然很清晰。也就是说,如果手机对应的像素密度文件夹下没有图片,就会去加载高一个级别的图片。

像素密度:当前每一英寸分布的像素点的数目(ppi或者dpi)

比如:1280 * 720的手机(5英寸手机):

  • 手机的高度上面分布了1280个像素点
  • 手机的宽度上面分布了720个像素点

斜边上分布的像素点(Math.sqrt(1280 * 1280 + 720 * 720 )) =1468.6个像素

斜边上分布的像素点/手机的英寸数(斜边的长度)= 293dpi/ppi

比如我的nubiaz7mini手机:
这里写图片描述
高度1920px ,宽度1080px,5英寸:

像素密度计算方式就是Math.sqrt(1920* 1920 +1080*1080) / 5 = 441dpi。

通常来说,一般的大厂商800 * 480分辨率的手机会3.7-4寸
1920 * 1080会生产5寸-5.7寸的手机


适配方式

  • 图片适配(不同的像素密度的手机,加载不同资源文件夹下的图片)
  • dimens.xml适配(当前手机的像素密度属于哪个范围内,dp和px的转化关系去达到适配。利用values-1280x720文件夹去适配属于这个范围内的手机屏幕)
  • 布局适配(当前手机的像素密度属于哪个范围内,加载不同资源布局,layout-1280x720布局文件)
  • Java代码适配(获取屏幕的宽高,然后将宽高设置在当前控件的父布局上,然后将宽高设置在当前。控件的父布局上,作用在当前控件上)
  • weight适配(线性布局上使用 width = 0dp height =0dp)

dp能够完全适配么?

即dp相同的情况下,显示的效果相同。我们来做个实验:

结论:dp不能做到完全适配。

0 0