[千里之行始于足下] - Android 屏幕相关基础知识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixiao1999/article/details/81814793

概述

Android开发者在屏幕上的战斗从未停止过,一代又一代人为了更好的适配Android手机前赴后继,至今也有了相当成熟可用的方案。

我们不应该只站在巨人肩上惊叹风景如胜~

目的

  • 什么是屏幕尺寸、屏幕分辨率、屏幕像素密度?
  • 什么是dp、dip、dpi、sp、px?它们之间的关系是什么?
  • 什么是mdpi、hdpi、xdpi、xxdpi?如何计算和区分?

基本概念

  • 屏幕尺寸

    屏幕尺寸指的是屏幕对角线的长度(单位是英寸),1英寸 = 2.54厘米

  • 屏幕分辨率

    屏幕分辨率是指屏幕上的像素点(单位是px), 如 : 1960(height) * 1080(width)

  • 屏幕像素密度

    屏幕像素密度是指每英寸上的像素点(单位是dpi,是dot per inch的缩写),与屏幕尺寸以及屏幕分辨率有关

    一款设备的屏幕尺寸越小或者分辨率越高,屏幕像素密度越大,反之越小。

单位(px、dp、sp、dpi)

  • sp

    即scale independent pixels的缩写,是字体大小的御用单位

  • px

    大多数情况下,比如UI设计、Android原生API(如:获取屏幕宽高等)都会以px作为统一的计量单位

  • dp

    是density independent Pixels的缩写,翻译过来就是:密度无关像素

  • dpi

    密度有关像素,假如一英寸里面有160像素,这个屏幕的像素密度就是160dpi
    dpi = √( (width)2 + (height)2) / 屏幕尺寸(单位: inch)

density

这是一个密度概念,和dpi相关,用于dp和px之间的换算。
在Android中,规定以160dpi为基准,即 density 1 = 160dpi / 160dpi。
类推,一块每英寸有320像素的屏幕,其density为2,这就是Android系统的density密度计算公式。


  • 换算

px = density * dp

资源文件夹标识(mdpi、hdpi、xdpi、xxdpi)

这些标识用于区分不同屏幕像素密度(dpi)下的资源(drawable、values)。
Android官方标准区分:
这里写图片描述

这些标准按照 2 : 3 : 4 : 6 : 8 的density比例用于换算。

使用dp单位的缺陷

以上的一些基础知识,都是标准的、期望得到的预期。

现在:
假设有相同尺寸,分辨率不同的两块屏幕A:480*320,屏幕B:800*480。
假设计算得到屏幕A的density为1,那么屏幕B的density则为1.5。

然后来我们在两个屏幕上使用相同大小不同单位的值:
使用单位px:

320px
在分辨率800*480的手机上显示为2/3屏幕宽度
480*320手机上显示为满屏宽度。

使用单位dp:

320dp
在这两种分辨率下显示都为屏幕满屏宽度。

emmm,使用单位dp在两个屏幕上都展示一致,似乎好像没有什么问题,Android官方也建议使用dp单位。

然鹅,需要注意的是,这里有一个前提,就是设备屏幕的尺寸相同,如果尺寸不同呢?再来看:
假设有尺寸不同,分辨率不同的两块屏幕A:480*320,屏幕B:800*480。
假设计算得到屏幕A的density为1,那么屏幕B的density是多少?。
无法计算,我们假设屏幕B的density是一个完全有可能的值:1.4。

使用单位dp:

320dp
在设备屏幕A上为满屏宽度 320(dp) * 1(density) = 320px
在设备屏幕B上为320(dp) * 1.4(density) = 448px,明显小于屏幕宽度,达不到预期
假设设备屏幕B的分辨率为480*320,那么448px在该设备屏幕上还会显示不全。

结语

按照Android标准density计算方式使用下的dp单位,无法满足中国碎片化的Android生态,因为中国手机厂商根本不遵守这一标准。

参考:
[1]. 支持多种屏幕 | Android文档
[2]. 一种极低成本的Android屏幕适配方式 | 今日头条技术团队

猜你喜欢

转载自blog.csdn.net/weixiao1999/article/details/81814793
今日推荐