安卓手机屏幕相关

常用概念

  • 屏幕尺寸

    指的是屏幕对角线的长度,单位用英寸(inch)来表示。1英寸=2.54厘米

  • 屏幕分辨率

    指的是屏幕上横向的像素点个数*纵向的像素点个数,如1920*1080,1280*720等等。

  • 像素密度

    单位长度内像素点的个数,单位用PPI(pixels per inch)来表示,如一英寸内有160个像素,则像素密度就是160PPI。 可用于表示显示器的清晰程度。有时也可以用DPI(dots per inch)来表示。

    dpi和ppi的联系和区别:

    在将数码产品的屏幕时,我们可以认为这两个东西是一样的。

  • dpi是一个印刷上的概念,表示一英寸内可以打印的点数的个数,可用于表示设备显示或打印的精细程度。如普通的文字打印机的dpi可能是600dpi,但是用于打印照片的打印机的dpi却可能是1200dpi甚至更高,任何的图像或者文字都是由一个一个不同颜色的点来组成的,自然dpi越高打印出来的东西越精细,显示效果越高。
  • PPI是一个专门用于显示器上的说法,表示单位英寸内像素点的个数,在显示器上我们通常认为PPI和DPI是一样的。所以你可以说一个屏幕是300DPI,也可以说它是300PPI。


    举个栗子:(目前常见的像素点都是方形的,不考虑像素点形状是特殊图形的情况)

    1. 某台式机显示器的尺寸是23.8英寸,屏幕分辨率是1920*1080。则对角线上的像素数约为2203,据此算得它的PPI是2203/23.8=92.56.
    2. 某笔记本电脑的显示器尺寸是14英寸,屏幕分辨率是1366*768。则对角线上的像素数约为1567,据此算得他的PPI是1567/14=112.
    3. 某品牌手机的显示屏尺寸是5.99英寸,屏幕分辨率是1080*2160。则对角线上的像素数约为2415,据此算得他的PPI是2415/5.99=403.
    4. 13.3英寸的mac的分辨率是2560*1600,其PPI达到了227。很显然这比普通的笔记本电脑分辨率要高出不少。
    5. 户外常见的商家用的LED走字广告牌的LED灯间距较大,其PPI值大概在3-10之间,内部的LED灯肉眼清晰可见。
      由此可见
      很显然台式机和笔记本电脑的显示器像素密度都比较低,这也就是为什么你甚至能在显示器上看到很清楚的颗粒感的原因,就是因为像素密度太低了,而手机上的显示器看东西就很清楚。(实际上人眼对清晰度的判定时是考虑两个像素点对眼睛形成的夹角。这里只比较几项之间PPI的大小关系是不严谨的,真实情况下我们还不得不考虑屏幕距离眼睛的距离。因为台式机屏幕距离人眼通常更加远,这也正是造成1366*768的笔记本显示器真实显示效果要比1920*1080的台式机显示器的颗粒感更加严重的原因)
  • 密度无关像素(Density Independent pixel)

    安卓为了适配不同分辨率的手机而创造的一个单位,

    1dp=1160inch 1 d p = 1 160 i n c h
    .在不同的手机上显示的长度都是一样的,只是像素密度更高的手机1dp所代表的px数越多,但是由于像素密度越高的手机1px所占用的长度也越短,所以,1dp在不同的手机上展示的长度都一致。

安卓对于分辨率与dpi已经基准比例做了这样的一个对照:

gdfgdf

22ldpimdpihdpixhdpixxhdpi
分辨率240×320320×480480×800720×12801080×1920
系统dpi120160240320480
density(1dp所代表的px的数目)0.7511.523
横向dp数320320320360360

从表中可以看到安卓并没有对设备的实际尺寸做对应,对于1920*1080的屏幕,不管你是4.5inch还是5英寸还是5.5英寸都一律认为将density设置为3.

来对照我手里的几款手机看一下实际情况:

gffdg

22分辨率尺寸dpidensityreal Density
华为G71920*1085.540332.52
荣耀91920*10805.242232.64
小米61920*10805.1542832.68

从上一个表里我们知道理论上density=3时

1inch=160dp=480px 1 i n c h = 160 d p = 480 p x
,然而从这个表里看到对于华为G7而言 1inch = 403px,对于小米6而言1inch=428px,这看起来似乎很矛盾。华为G7中160dp=480px=1.19inch,小米6中160dp=480px=1.12inch.
我们可以理解为安卓为了统一各种各样的屏幕尺寸做的一个妥协,即对于相同分辨率的手机允许160dp显示的长度不一样,然而其实我们也看的出来其实差的也不会太多,视觉上可能不是很能感受的到,得到的一个好处就是对于开发而言屏幕更加统一了。

手机厂商修改density的情况

红米5plus,分辨率1080*2160,手机尺寸5.99英寸,使用勾股定理算得dpi=403,与华为G7的屏幕密度相当(真实的density=2.52),但是在该设备中获得的设备density=2.75。
这种情况就是厂商修改了density,这也会给APP的适配带来一些问题:通常情况下对于目前常见1920*1080和1280*720的屏幕,横向上有360dp的宽度可用于展示信息,对于APP而言这种适配就比较简单和方便(虽然1dp所代表的的实际长度略有差异,也就是显示大小略有差异,但是为了更好适配,必须做出取舍,这种差异也就是可以接受的)。

dp单位的由来

我们通常说为了适配不同屏幕要使用dp或者sp作为开发中使用的单位,但是需要明确的一点是使用dp也只能保证在相同尺寸不同分辨率的手机上展示的效果一致(从上面的介绍中可以看出来,这也只是在某种程度上一样,并不是完全一致),对于不同尺寸的手机显示效果是无法保证显示效果一致的。
我们可以这样来理解创造这个单位的过程:

  1. 为了让用户在不同的手机上感觉到显示的效果一致(对于一个图片而言,就是显示的大小是一样的),大小一致就是在不同的手机上展示的长度都一致,要想在不同的手机上保证长度是一致的,我们就需要程序员在开发的时候使用inch做单位,这样用户看到的大小就肯定是一致的了。
  2. 然而这里会有一个问题,通常的手机也就三五英寸大小,难道要每次写这个图片的长度是0.625inch,宽度是0.5inch,距离左边0.1inch,距离右边0.1inch,距离上边0.05inch,距离下边0.05inch。这里似乎也还不错的,虽然写起来不是很方便,但是也不是完全不能接受,但是对于字体而言呢,我们通常用的字体12sp,14sp,16sp,18sp,换算成inch分别是多少呢?12sp=0.075inch,14sp=0.0875inch,16sp=0.1inch,18sp=0.1125inch,这个我真的无法接受!
  3. 于是,很容易想到把inch放大,用另外一个单位来代替不就可以了吗,比如方法一百倍1inch=100fh(fh是我自己瞎创造的一个单位),字体用1inch=100rh(rh也是我瞎想的),那么上面的单位就好看多了图片宽是62.5fh,高是50fh,距离上下左右分别是5fh,5fh,10fh,10fh。字体也就分别是7.5rh,8.75rh,10rh和11.25rh。只是Android使用了dp和sp作为单位而不是我瞎写的这个而已(单位也只是一个名称,大家都认同,单位是什么都无所谓)
  4. 那么安卓为什么选择
    160dp=1inch 160 d p = 1 i n c h
    这个放大倍数呢?任意放大倍数似乎都是可以的,但是我们还必须要考虑的一点就是需要很容易的从放大的单位转换到px上,这样才有利于手机对视图进行绘制。真正的原因在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。
  5. 如此一来我们是不是就很容易理解dp单位的由来,以及为什么默认情况下的1inch=160dp了呢。

屏幕适配

Android屏幕的碎片化:
- 分辨率的碎片化
- 尺寸的碎片化

屏幕适配要达到的目的:

对于分辨率的碎片化,我们可以使用dp作为布局单位来进行避免,但是尺寸的碎片化,这个目前没有解决办法,只能是在
到目前为止我了解过三种屏幕适配的方案:

  1. 根据不同屏幕的分辨率进行适配,布局时使用尺寸资源。(基于屏幕分辨率)
  2. 使用dp作为布局时使用的单位,由系统根据当前设备的density进行自适应。
  3. 使用今日头条技术团队的方案,修改设备density的值,对布局进行拉伸或者缩放来进行适配。
    下面先简单介绍一下三种方式的基本操作:

1. 根据不同屏幕的分辨率进行适配,布局时使用尺寸资源。(基于屏幕分辨率)

这种适配方式的基本原理是根据分辨率的不同,所使用的资源文件不一样,所以某个尺寸资源的值也不一样,以此来进行适配。
缺点:当有新的分辨率的机型上市时都需要发布新版本来对该机型进行适配。
该方法主要操作如下:

  1. 在res目录下简历values-2560*1440,values-1920*1080,values-1280*720等等的资源文件夹
  2. 在各自的资源文件夹中建立dimen文件
  3. 如果设计图示基于1280*720的,显示头像的控件的宽和高都是160px,则:

    <!-- 计算方式就是按比例进行换算 -->
    <!--1280*720中添加-->
    <dimen name="x160">160px</dimen>
    <dimen name="y160">160px</dimen>
    
    <!--1920*1080中添加-->
    <dimen name="x160">240px</dimen>
    <dimen name="y160">240px</dimen>
    
    <!--2160*1440中添加-->
    <dimen name="x160">240px</dimen>
    <dimen name="y160">270px</dimen>
    
    <!--2560*1440中添加-->
    <dimen name="x160">320px</dimen>
    <dimen name="y160">320px</dimen>
    

    添加一个1280*720的,其他文件夹下的也可以使用工具生成

  4. 循环步骤3,添加所有需要的尺寸资源(包括文字尺寸)
  5. 当有新机型时,我们又必须添加新的文件夹以及适配该机型的尺寸文件,然后发布新版本。

2. 使用dp作为布局时使用的单位,由系统根据当前设备的density进行自适应。

这种方式就是目前大家都在用的,通过以下三种方式来满足适配需求,基本可以满足大多数情况下的需求。这种方式的问题在于如果不希望页面左右或者上下滑动时适配比较麻烦,其他时候我觉得都OK。
1. 对于固定尺寸使用dp作为单位,由系统进行适配
2. 对于需要满足某种比例的尺寸使用weight属性、代码进行计算或者使用约束布局的方式
3. 在横向或者竖向有可能超出屏幕宽度的情况使用滑动控件来进行布局

3. 使用今日头条技术团队的方案,修改设备density的值,对布局进行拉伸或者缩放来进行适配。

先奉上今日头条技术团队的(一种极低成本的Android屏幕适配方式)的文章链接。
相信很多朋友也已经读过了,简单的回顾下:
基本思想:就是把所有的手机屏幕的宽都强制设置成设计图给的dp值,如涉及图宽是按360dp进行设计的,就把所有手机的宽都设成360dp。
做法:通过修改DisplayMeterics类中的density和scaledDensity值。如原来的屏幕是1080px、392dp、density=2.75、,然后修改屏幕density=1080/360=3,自然宽就是也是360dp了,所以可以按照设计图直接进行布局。对于用于文字大小的scaledDensity,使用类似的方法计算然后修改系统值。
优劣:这样做起来对开发而言肯定是很爽的。有一个潜在的问题就是控件和文字都被压缩或者放大了,原本的大屏(特指大于360dp)手机本来一行可以显示30个字,但是由于对字体进行了放大,字体看起来会稍微大一点,一行可能也就只能显示25个字了。对于小屏(特指小于360dp)手机原来只能显示20个字,现在要人家显示25个字,字肯定会变小的。这是否合理,是否有必要还有待论证。这并不是diss这个方法,这是觉得我们应该慎重,不能为了一时爽。慎重吧。

下面是2018年6月份百度统计的数据:

分辨率占比%
1920*108051.371
1280*72032.06
540*9603.94
1440*25602.37
480*8542.17
480*8000.63
其他7.459
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值