被设计师支配的恐惧

很多的入门程序猿,对于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

### 结语

好了,虽然内容不多。但是写文章还是比我想象中困难很多。之前只是脑海里有这样一个概念。但是要组织语言写出来还是有障碍。再接再厉

android 常用机型尺寸_Android设备尺寸相关推荐

  1. android 常用机型尺寸_Android中图片大小与各种hdpi

    前言 大家都知道开发android会涉及到UI的涉及,一般都是给到通用的分辨率进行设计,但是具体适配是需要代码控制的,由于网上分辨率dp的文章实在太多,对这些不了解的朋友可以去自行百度,这里主要是对U ...

  2. android 常用机型尺寸_Android中获取手机屏幕大小的方法

    本文为大家解析Android中如何获取手机屏幕大小,提供一个解决方法,分享给大家供大家参考,具体内容如下 运行效果图: 运行程序后,当我们点击Button按钮时,可以看到下面的效果图: 具体代码: 我 ...

  3. IOS 图标尺寸以及设备尺寸详解

    一.应用图片 标准iOS控件里的图片资源,苹果已经做了相应的升级,我们需要操心的是应用自己的图片资源.就像当初为了支持iPhone 4而制作的@2x高分辨率版本(译者:以下简称高分)图片一样,我们要为 ...

  4. 如何让一套代码适配所有iOS设备尺寸?

    简介:随着移动互联网设备和技术的发展,各种移动设备屏幕尺寸层出不穷,折叠屏.分屏.悬浮窗等等,面对越来越多样的屏幕,如果为每种尺寸单独进行适配,不仅费时费力,还会增加端侧代码的开发与维护压力.如何让一 ...

  5. 响应式布局技术:App如何适配不同尺寸的设备

    作者 | 阿里巴巴文娱技术 叮东 头图 |  CSDN 下载自东方IC 背景 近年来,大屏手机.安卓Pad.iPad.折叠屏手机.车机大屏等大尺寸设备发展迅猛.尤其是2020年二季度中国平板市场出货量 ...

  6. 7.0窗口改变大小 axure rp_用axurerp7.0设计android界面原型时怎么设置尺寸

    展开全部 若要解释清楚像素和分辨率需要的篇幅比较长,请大家参考62616964757a686964616fe58685e5aeb931333337386536百度百科. 这里金乌直接给大家提供一个常用 ...

  7. android自定义相机预览尺寸,相机在Android中,如何获得最佳尺寸,预览尺寸,图片尺寸,视图尺寸,图像扭曲...

    混合来自OpenGL和 Android相机的视图时图像失真,以便在使用takepicture方法时获取两者的图像.我查了一下,发现相机图片设置为640X480,openGL视图和相机预览都设置为128 ...

  8. Apple 设备尺寸

    Apple 设备尺寸 iPhone 设备 设备名 (推出年份) 对角线尺寸 (英寸) 分辨率 (像素) PPI Asset 点 状态栏高度 (点) 虚拟Home键高度 (点) iPhone 11 Pr ...

  9. pc端常用电脑屏幕 媒体查询尺寸

    pc端常用电脑屏幕 ((响应式PC端媒体查询)电脑屏幕分辨率尺寸大全) PC端************ 按屏幕宽度大小排序(主流的用橙色标明) 分辨率   比例 | 设备尺寸 1024*500 (8. ...

最新文章

  1. Linux的文件系统
  2. SingleR包注释单细胞数据
  3. 相对最完整的软件测试工具手册
  4. 如何调用华为云api_postman调用华为云接口添加资源
  5. redis 基本类型和命令(一)
  6. linux权限最小化分级,vim可视化Linux系统安全最小化原则 su sudo
  7. Kotlin学习笔记 第二章 类与对象 第二节属性
  8. apache中怎么配置网站的默认首页
  9. java web 开发环境布置学习笔记1
  10. 官方下载:slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar
  11. Shortest Prefixes(poj 2001)
  12. 解决vue项目更新版本后浏览器的缓存问题
  13. 通过TXT文件批量制作ITF-14条码
  14. 网络安全笔记-网络设备专场(路由器、交换机、防火墙)
  15. 周星驰vs韩寒vs宁浩…Python告诉你春节该看哪部电影
  16. Tabbed Postman下载地址
  17. JavaScript 中的BOM对象
  18. DNS_PROBE_FINISHED_NXDOMAIN完美解决办法
  19. Pinyin4j使用手册
  20. 【实例间对比】ICE: Inter-instance Contrastive Encoding for Unsupervised Person Re-identification论文笔记

热门文章

  1. iamsujie.com活了一年了
  2. 席位预定中,第二届世界物联网安全峰会5.30-5.31
  3. 计算机网络日志查询,如何查看电脑浏览记录 通过电脑日志查看浏览记录方法...
  4. 什么叫做石英表_石英表是什么意思?
  5. 至爱最不能承受之痛!
  6. Carla release与ros-bridge
  7. 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化
  8. 搜索引擎Solr环境搭建详解
  9. SeleniumLibrary4.5.0 关键字详解(十)
  10. WBO第一届世界区块链高峰论坛在香港国际亚洲博览馆正隆重举行