Android中图片资源适配

一、首先明确概念

Ø  屏幕尺寸(screen size):实际的物理尺寸,屏幕的对角线测量。为了方便,Android把所有的屏幕尺寸分为了4个广义的大小:小、正常、大、更大。

Ø  屏幕密度dpi(screen density):屏幕占据的物理区域所含像素的个数,通常被称为dpi(dots per inch)即每英寸的像素点数。

Ø  分辨率(resolution):屏幕上物理像素的点数。例如,有一个240px*400px的屏幕,可以理解为在这个屏幕上横着有400条线,每条线上有240个像素点。

Ø  像素(px):屏幕上的点。

Ø  dip(dp):Density-independent pixel--->与密度无关的像素(下面将详细讲解)

dip = (dpi值/160)*px值

px长度单位,以具体像素为单位

dp长度单位,与具体屏幕密度无关,显示的时候根据具体平台屏幕密度的不同最终转换为相应的像素长度,具体转换规则是: 1dp = (目标屏幕密度/标准密度)*px,标准密度为160dpi,例如,1dp长度在密度为160dpi的平台表示一个像素的长度,而在240dpi的平台则表示1.5个像素的长度

屏幕尺寸:屏幕的大小,通常用屏幕对角线的长度表示


屏幕密度计算

以宽为例:

1.比如分辨率为320 × 480,则长宽比为1:1.5

2.比如屏幕尺寸为3.6英寸,则根据勾股定理得出,

宽 = (12.96/3.25)1/2 = 1.9969英寸

3.宽为320px,分布在1.9969英寸上,因此密度为320/ 1.9969 = 160.2467

4.因此此密度约为mdpi的密度


决定屏幕清晰度的是什么?

 

常见的位图的最小组成单位是像素,那么单位物理长度内的像素数越多,图像就会越清晰。很多人都说跟屏幕大小没直接关系,因为还有分辨率,可是如果一个屏幕的分辨率很大,但屏幕也非常的大,那么单位长度内的像素数不一定很大。所以决定屏幕清晰度的是单位物理长度的像素数,也就是上面所说的屏幕密度

 

Android设备屏幕尺寸分布

 

首先看一下各种屏幕的尺寸和屏幕密度划分,下图是各种屏幕尺寸对应的范围:

图1:

从上图可以看出,对应normal尺寸的屏幕范围集中在常见的3到5寸屏之间,large尺寸对应的就主要是5到7寸的nottpad之类的设备,例如三星的Note和Nexus7平板等,再网上走就是平板电脑了。接下来是屏幕密度(dpi),需要说明的是,平时所说的屏幕分辨率其实不能作为屏幕适配的依据,应该依据屏幕密度和屏幕尺寸来换算,屏幕密度是指每英寸屏幕内容纳的像素数,屏幕密度从ldpi到xhdpi分别对应为120dpi、160dpi、240dpi、320dpi,屏幕密度越高、分辨率越高、屏幕尺寸越小就产生了视网膜屏幕。

u  dip单位详解

Android规定一个dip的大小相当于160dpi屏幕上的一个像素,它是系统为“中等的”密度屏设定的基准密度,在不同dpi屏幕上dp对应的像素数是不同的。需要时,基于当前屏的实际密度,系统会透明地放缩dip单。dip单位根据公式像素值 = [dip*(dpi/160)](px)(其中px是单位)转化为屏幕像素。根据此公式可以计算出一个dip分别在120dpi、160dpi、240dpi、320dpi屏幕中对应的像素数分别为0.75、1、1.5、2.0,比例为3:4:6:8,如下图。因此,在不同屏幕密度上,以mdpi作为基准,对位图进行3:4:6:8比例的放缩会达到适配的效果。

图2:



dip与一般的px不太一样,它是独立于屏幕密度的。什么是独立于密度?

先来说下一般的px,如果将一个相同长宽像素的图片放在不同屏幕密度大小的屏幕中,那么,在低密度屏幕中图片会显示的很大,在高密度屏幕中则会显示的很小;但是,如果使用dip为单位的图片显示的效果则是,屏幕密度越大的手机,图片显示的像素也相应增大,这样在屏幕密度大的手机和屏幕密度小的手机上,图片看上去大小基本相同。有了上文对dip的讲解,是否对这个现象有所理解呢?

       举个例子来说一下:

现在有三个物理长宽分别为3寸、4寸,屏幕密度分别为120dpi、160dpi、240dpi的手机,则三个屏幕的分辨率分别为360px*480px、480px*640px、




将三个手机屏幕的宽分为三等份,则根据dpi的定义,三个屏幕中每等份分别容纳120px、160px、240px。现在假设有一个控件imageview 它的长宽分别为160px、160px,还有一个160px*160px的图片资源,当程序运行时,该图片在三个屏幕上会呈现以下效果:



                       在这三个屏幕上,图片占据的都是160px*160px的大小范围


如果将imageview的长宽分别改为160dip、160dip,图片将在三个屏幕上呈现以下效果:


上文提到在这三种屏幕密度下一个dip分别对应0.75px、1px、1.5px,所以在三种屏幕上该图片占据120px、160px、240px,各自占屏幕的三分之一,所以看起来是一样大的。

drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:

  (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)

  (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)

  (3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)

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

  在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。


 


 

由上文可总结出Android在适配不同屏幕密度时,可以用dip作为控件的单位,视情况放缩dip单位。

当应用没有指出图片对应的控件的大小,Android是如何让图片适配不同屏幕的呢?

 


 

举个例子:现在有一个ldpi的手机屏幕,有一个应用在其上运行(假如只有ldpi、mdpi、hdpi还有drawable四个存放图片的文件夹),并需要调用一个图片a.png(在下文中用a来代替a.png)。Android系统会经历以下流程:



注:

将hdpi中的图片大小缩小为原来的一半相比将mdpi中的图片大小缩小为原来的3/4,计算机要省力,只需进行简单地右移一位操作。所以系统在ldpi下找不到a的时候会首先去hdpi下去找。当存在xhdpi、xxhdpi时,系统会按相同的规则去调用资源。

       Drawable-ldpi 3、Drawable-mdpi  4、Drawable-hdpi  6中的3、4、6指的是同一个图片在三个文件夹下的大小之比。

 

 

参考网址:http://blog.csdn.net/chinalwb/article/details/18843101

                http://blog.csdn.net/coodi8/article/details/7881941




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值