像素密度计算

像素密度计算为解决Android设备碎片化,引入一个概念density,也就是密度.它指的是在一定尺寸的物理屏幕上显示像素的数量,一般使用dpi(dotsperinch,每英寸像素数)作为单位.比如设备分辨率为240×320,屏幕物理尺寸为1.5英寸x2英寸(对角线为2.5),它的密度可以用分辨率/尺寸表示:240/1.5或者即320/2,密度为160dpi。算对角线也是一样的,长的平方+宽的平…

大家好,又见面了,我是你们的朋友全栈君。

为解决Android设备碎片化,引入一个概念density,也就是密度.它指的是在一定尺寸的物理屏幕上显示像素的数量,一般使用dpi(dots per inch,每英寸像素数)作为单位.
比如设备分辨率为240×320,屏幕物理尺寸为1.5英寸x2英寸(对角线为2.5), 它的密度可以用分辨率/尺寸表示:240/1.5或者即320/2,密度为160dpi。 算对角线也是一样的,
长的平方+宽的平方=160000,开方后=400.可知400/2.5=160.
对于用户来说,密度越大的屏幕显示效果越精细,因为每英寸显示的像素数量更多。  
 以上的描述就是一个蓝本(此蓝本对应于mdpi). 按照此蓝本一个dp相当于160dpi屏幕中的一个px.同理在,在320dpi的屏幕中,一个dp相当于2个px.   通过这样的成比例放缩,Android解决了需要多个不同屏幕中的大小显示问题.   所以在Eclipse的布局文件中,以3.7in WVGA(Nexus One)(480×800)为例,可以看见其为sw320dp,h533dp.   即宽有320dp,高为533dp.   是怎么计算出来的呢?   将(480的平方+800的平方)开方=932.9523031   然后932.9523031/屏幕尺寸3.7=252.14927,此结果为此手机的屏幕密度.

然后按照上面的蓝本,就应该要计算在该手机上1dp对于多少px.计算如下: 160 1dp=1px   252.14927 1dp=?px   
  结果为:   252.14927/160=1.5759329  
  注意:   在此一般不取1.5759329,只取到1.5即可.   所以:480/1.5=320;800/1.5=533.3333(通常取为533),即上述的sw320dp,h533dp.

手机屏幕密度的对应关系 :

120上下浮动的都属于ldpi   160上下浮动的都属于mdpi   240上下浮动的都属于hdpi   320上下浮动的都属于xdpi   
以摩托罗拉ME525+(3.7英寸 分辨率854×480像素)为例:   将(480的平方+854的平方)开方=979.6509   然后979.6509/屏幕尺寸3.7=264.770529,此结果为此手机的屏幕密度.对应为hdpi   264.770529/160=1.6548   即在此手机中1dp=1.6548个像素,只取到1.6即可   所以:480/1.6=300;854/1.6=533.75(通常取为533)   按照这个逻辑,算出来的宽应该是只有300dp.悲剧的是,如果某个控件的宽为300,在此手机上是不能铺满手机的宽的.   也就是说除以的不是1.6而还是1.5!!!所以将宽设置为320即可   总结:在hdpi中,像素转换为dp统一用的是:像素/1.5;
  
以联想K860(5.0英寸,分辨率1280×720像素)为例:   将(1280的平方+720的平方)开方=1468.60478   然后1468.60478/屏幕尺寸5=293.720,此结果为此手机的屏幕密度.对应为xdpi   293.720/160=1.8357   即在此手机中1dp=1.8357个像素   所以:1280/1.8357=697.281;720/1.8357=392.22   按照这个逻辑,算出来的宽应该是392.22.悲剧的是,如果某个控件的宽为392.22,在此手机上是显示不完全的.   也就是说除以的不是1.8而是2!!!所以将宽设置为360即可   
总结:在xdpi中,像素转换为dp统一用的是:像素/2

注意问题1:   在建立模拟器的时候注意   854×480在Hardware中,应该将Abstracted LCD density设置为240,并手动输入分辨率   1280×720在Hardware中,应该将Abstracted LCD density设置为320,并手动输入分辨率   
注意问题2:   多个layout文件夹在命名上有相应规则,以分辨率480×854为例,需要建立480×854像素的layout文件夹,命名:layout-854×480,有两点需要注意:①大数(854)必须在前,   否则会报错;②两个数字之间的符号是小写英文字母“x”,不是乘号

每英寸像素(10802280 5.84寸)=(10801080+2280*2280 )^0.5 =2522(对角线长度) ,像素密度=2522/5.84=431.9dpi 对应为xxhdpi 431.9/160= 2.69 (一个dp=2.69个像素) ,1080/2.69=401
280/2.69=847 ,控件宽为401,在手机上是显示不完全的,也就是说除以的不是2.69而是3,因此宽为360高为760。总结:在xxhdpi中,像素转换为dp统一用的是:像素/3

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130891.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java最简单最全入门基础笔记(不简单,不全你打我)「建议收藏」

    java最简单最全入门基础笔记(不简单,不全你打我)「建议收藏」刚开始学习java的时候,可能是一头雾水,不知道从何学起,这里跟大家分享一下!(仅仅只供初级学者学习,大佬勿喷)一、初始java1.生活中的程序:从起床到教室上课的过程穿衣打扮》起床》洗漱》出宿舍》》吃早餐》到教室按照特定的顺序去完成某一件事的过程我们叫做生活中的程序2.计算机中的程序:一组有序指令的集合,需要和计算机交流就要使用计算机语言,java就是计算机语言的一种3.java…

    2022年6月4日
    31
  • Unity3D游戏引擎最详尽基础教程

    Unity3D游戏引擎最详尽基础教程转自:http://blog.sina.com.cn/s/blog_7c336a8301013son.html我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGore这样的3D平面射击游戏简直轻而易举,而就连使命召唤这样的大型3d游戏,如果素材得当也不在话下。二是因为易用,他的操作非常容易,而使用的脚本语言又是JavaSc

    2022年4月30日
    92
  • python学生管理系统代码_用python写学生管理系统

    python学生管理系统代码_用python写学生管理系统这几天开始接触了python语言,这语言相对c语言简洁了不少,语言真是一通百通,学起来还是比较轻松,在熟悉了基本语法,列表(序列),元组以及字典之后写了一个最基础简单的的学生管理系统能完成的功能有:学生管理系统 v1.0 1.添加学生的信息 2.删除学生的信息 3.修改学生的信息 4.查询学生的信息 5.遍历所有学生的信息 6.退出系统学生信息中,

    2022年9月20日
    3
  • CFileDialog类应用详解

    CFileDialog类应用详解原文地址 http blog csdn net bxwang1 article details 构造函数原型 CFileDialog BOOLbOpenFil nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp LPCTSTRlpszD NULL nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp LPCTSTRlpszF NULL nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp D

    2025年11月9日
    7
  • python+opencv图像模板匹配—多模板匹配

    python+opencv图像模板匹配—多模板匹配

    2021年10月6日
    63
  • 详解Document.Cookie

    详解Document.Cookie转自:https://www.jb51.net/article/77009.htm具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时

    2022年7月4日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号