Android设备尺寸

被设计师支配的恐惧

很多的入门程序猿,对于android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路。回想还是一个入门菜鸟时,每当设计提出一个比较炫酷的动画设计,都会打开百度或者github先搜索一番。可是开源控件毕竟不是量身打造,与期望的效果总是有那么多的出入。这个时候就假装一本正经的说,这个没法实现。然后战战兢兢的等待设计那一句:“为什么ios的可以实现“?


磨刀不误砍柴工

android开发最让人头疼的是什么?我想应该是适配各种机型。android不像ios般统一,2012年到2014年支持Android设备的种类就从3997增长到18796。同时各大厂商定制的屏幕尺寸也非常多。这导致有时候我们在一款机型上表现完美的自定义控件,在另外一款手机上变形严重。所以在正式开始自定义控件之前,我们先回顾一下android中的各种尺寸

什么是屏幕尺寸、屏幕分辨率、屏幕像素密度?
我的测试机是三星S5,屏幕为5.2英寸。看一下手机参数:

拿它举个栗子,代码如下

DisplayMetricsmetrics = getResources().getDisplayMetrics();
int w = metrics.widthPixels;//宽度
int h = metrics.heightPixels;//高度
int dpi = metrics.densityDpi;//每英寸所占像素 (dpi:dots per inch )
int xdpi = metrics.xdpi;//x方向上的dpi
float density = metrics.density;//密度
Log.i("dimension","宽度:"+w+"\n高度:"+h+"\nDPI:"+dpi+"\nxDPI:"+xdpi+"\n密度:"+density);

log输出

dimension:        宽度:1080
                  高度:1920
                  DPI:480
                  xDPI:422.03
                  密度:3.0

DPI每英寸点数

可以看到三星S5的宽1080px,高1920px。根据勾股定理可以算出对角线长2202.907px。
因为手机对角线尺寸为5.2英寸,我们反向推导一下:
2202.907/5.2 = 423.6
与上面的xdpi相吻合。
所以dpi的概念一目了然,即每寸的像素有多少个点。面试的时候经常有同学把dpi、dip、dp弄混了。下面我接着推。

密度density

我们首先知道,谷歌官方把android设备的参考标准定义为一寸是160px。既然谷歌的一寸是160px,为什么metrics返回的dpi是480呢?。这是因为android设备中160px每寸的密度随着用户需求的提高,渐渐无法满足日常需要。所以厂商将原本160个像素提高到480个像素(在该例中,实际为422)。在同样的空间下密度增大了三倍。所以480像素得到了解释。由此我们又得到一个概念叫密度(density)
480/160 = 3
与上面的density相吻合。

独立像素密度(密度无关像素)DIP/DP

dp可以说是我们日常开发中最常用到的长度单位了。通过上面的计算我们可以得出。
1dp = 1英寸/160

当密度(density)为1时,1dp = 1px。
当密度(density)为2时,1dp = 2px。
当密度(density)为3时,1dp = 3px。
所以计算dp与px的转换公式也十分简单:

px = dp * density
或px = dp * (dpi/160)

常用单位一览

px——屏幕上真实的像素。这是一个与像素密度有关联的单位,一px单位的物理大小取决于屏幕的像素密度。
in——屏幕上的物理英寸。这是一个与像素密度无关联的单位,一in单位的物理大小在任何像素密度的屏幕上都是一样大的。一in单位转化为多少px单位取决于屏幕的像素密度。
dp——像素密度无关联的像素单位。这是一个与像素密度无关联的单位。然而一dp单位的物理大小在不同的像素密度屏幕上只是近视的相等。大约160dp等于一in。在一dp转化为160dpi中的一个比例因子是与设备的密度级别相关联的。一dp等于多少像素取决于屏幕的像素密度和设备所属的密度级别。
sp——大小独立的像素单位,特地指定text的大小。这是一个与像素密度无关联的单位。然而一sp单位的物理大小在不同的像素密度屏幕上只是近视的相等。在一sp转化为160dpi中的一个比例因子是与设备的密度级别以及字体表现的大小相关联的。一sp等于多少像素取决于屏幕的像素密度和设备所属的密度级别。
除此之外,android还为我们提供了一些其他不常用的长度单位
mm——屏幕上的物理毫米。这是一个与像素密度无关联的单位,一mm单位的物理大小在任何像素密度的屏幕上都是一样大的。25.4mm等于一in。一mm单位转化为多少px单位取决于屏幕的像素密度。
pt——点,屏幕上普通字体大小单位。这是一个与像素密度无关联的单位,一pt单位的物理大小在任何像素密度的屏幕上都是一样大的。72pt等于一in。一pt单位转化为多少px单位取决于屏幕的像素密度。

特别注意

事实上,我们屏幕上看到的东西都是由Paint绘制而来。而Paint对象接受的参数最后都是px像素来使用的。所以无论我们使用什么单位最后都转换成了像素来处理。
所以android系统很贴心的给我们提供了TypedValue.applyDimension()方法提供单位转换。点进去可以看到:

                                       DisplayMetrics metrics)
    {
        switch (unit) {
        case COMPLEX_UNIT_PX:
            return value;
        case COMPLEX_UNIT_DIP:
            return value * metrics.density;
        case COMPLEX_UNIT_SP:
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT:
            return value * metrics.xdpi * (1.0f/72);
        case COMPLEX_UNIT_IN:
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM:
            return value * metrics.xdpi * (1.0f/25.4f);
        }
        return 0;
    }```
事实上还是```px = dp * density```公式的变形。有时候我们发现自定义View通过java代码设置尺寸就是不能适配,但是通过属性就可以。这里其实就是忘记调用TypedValue.applyDimension( unit, size, r.getDisplayMetrics())方法来把单位转换成px
### 结语
好了,虽然内容不多。但是写文章还是比我想象中困难很多。之前只是脑海里有这样一个概念。但是要组织语言写出来还是有障碍。再接再厉
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容