android分辨率px跟dp,Android屏幕适配 px,dp,dpi及density的关系与深入理解

PX(pixel):

即传统计算机语言中描述的像素,在Android则代表绝对像素。

之所以Android中不推荐使用这种单位,正是因为不同生产厂商,不同品牌,不同屏幕的设备,其分辨率亦不一。

举例来说,我们现在将某个Button的width设为160px,则会出现如下情况:

在分辨率为“320宽”的设备里,该按钮显示占屏幕宽度一半;

在分辨率为“640宽”的设备里,该按钮显示占屏幕宽度的四分之一;

DPI(Dots Per Inch):

为了避免上面说到的使用px在屏幕适配中带来的问题,Android引入了一个新的单位:dp/dpi。

而在理解“dp”之前,我们更有必要先了解一下另一个概念。正是:dpi。

也有人讲dpi称为“屏幕密度”。其含义则是:每英寸所打印的点数,既每一英寸的屏幕所包含的英寸数。

举例来说,假设现在有一台“宽2英寸,长3英寸”的设备,则:

当该设备分辨率为“320*480”,则dpi值为160。

当该设备分辨率为“640*960”,则dpi值为320。

而“dpi”值越高的设备,其屏幕显示画面的效果也就越精细。

使用场景:

正是因为dpi值其代表的特性,所以android项目的资源文件下存在以下目录:

drawable-ldpi    ( 当dpi为120时,使用此目录下的资源)

drawable-mdpi    ( 当dpi为160时,使用此目录下的资源)

drawable-hdpi    ( 当dpi为240时,使用此目录下的资源)

drawable-xhdpi   ( 当dpi为320时,使用此目录下的资源)

drawable-xxhdpi  ( 当dpi为480时,使用此目录下的资源)

Android正是根据设备DPI值得不同,选择清晰度不同的资源使用,完成屏幕的适配。

DP/DIP(device independent pixels):

与我们之前谈到的绝对密度“px”对应,Android中引入的“dp”代表的则是“设备独立像素”。

该单位是为支持WVGA、HVGA和QVGA而使用的,其不再依赖像素本身,而是和屏幕密度相关。

在Android当中规定:在屏幕密度为“160dpi”的情况下,则刚好“1dp = 1px”。

注:当屏幕密度为“320dpi”时,则“1dp = 2px”,以此类推.......

也正是因此,让我们得以保证了:控件在不同密度的屏幕上显示一致,既完成屏幕适配。

使用场景:

让我们回到上面说到的使用px造成的控件显示问题,此时我们将使用新的单位“dp”。于是:

在分辨率320*480(既dpi为160)的设备下,则160dp等价于160px,按钮占屏幕宽的一半。

在分辨率640*960(既dpi为320)的设备下,则160dp等价于320px,按钮依然占屏幕宽的一半。

Density:

就这个单词本身直接翻译的意思而言,其也代表“密度”。

但需要注意的是,在Android中,其实并非如此。

注意我们这里指的是,通过代码“context.getResources().getDisplayMetrics().density”获取的“density”值。

而通过该方法获取到的该值,实际上是等价于“dpi / 160”的一个结果值。也就是说:

“getResources().getDisplayMetrics().density” = “getResources().getDisplayMetrics().densityDpi / 160”

看到这样一个解析,聪明的人大概已经能预见什么了。我们似乎发现了某种关联:

在Android里:“dpi = 160,则1dp = 1px”、“dpi = 320,则1dp = 2px”。以此类推。

到此你已经发现,dp,px与160之间存在着某种规律:“1dp = (dpi / 160)px”

换算一下,最终得到公式: dp = density * px。

到了这里我们明白了,其实Android提供的该值,也就是为了让我们在dp与px之间做转换。

归根结底,其目的还是为了帮助我们做屏幕适配。

使用场景:

虽然使用dp在xml文件中定义控件尺寸,能够很好的帮助我们完成适配。

但很多时候,我们也会需要在Java代码中动态的去设定控件的尺寸。

但由于在代码中的尺寸设定,基本都被默认为了px单位。

所以这个时候就可以借助“density”来帮我们完成dp与px的转换,从而完成适配。

这也是为什么,我们可以在网上查到类似的工具类代码:

public static int dip2px(Context context, float dipValue){

final float scale = context.getResources().getDisplayMetrics().density;

return (int)(dipValue * scale + 0.5f);

}

public static int px2dip(Context context, float pxValue){

final float scale = context.getResources().getDisplayMetrics().density;

return (int)(pxValue / scale + 0.5f);

}注:不要奇怪,熟悉的Java的特性的你应该明白,“+0.5f”是为了避免在类型强制转换中可能造成的精度丢失.

到了这里,我们总算小有收获。最后,通过一段代码,来验证一下我们的总结和猜想:

DisplayMetrics metrices = getResources().getDisplayMetrics();

int dpi = metrices.densityDpi;

float density = metrices.density;

float width = metrices.widthPixels;

float height = metrices.heightPixels;

Log.i("dpi==>", dpi+"");

Log.i("density==>", density+"");

Log.i("width==>", width+"");

Log.i("height==>", height+"");

查看打印结果:

0818b9ca8b590ca3270a3433284dd417.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 播放器 反交错,反交错- 视频横纹处理

以下名词解释摘自维基百科反交错”(deinterlacing)是将交错式(即隔行扫描)(interlace)影像讯号转换为渐进式(逐行扫描)(progressive)影像讯号的一种方法。因为装置处理速度以及带宽的限制下,广播电视系统,例如NTSC或是PAL,都是使用交错式讯号…

android webview简单使用,android WebView 简单使用Demo

activity配置文件:activity_main.xmlandroid:layout_width"match_parent"android:layout_height"match_parent"android:orientation"vertical" >android:layout_width"match_parent"android:layout_height"wrap_co…

android one x2,HTC One X 深度OS Android4.1.2 大气不失稳重 雍容华贵 流畅运行

您可能感兴趣的话题:rom刷机核心提示:注意事项:1. 本刷机教程需在windows操作系统下进行2. 刷机前确保手机电量不少于50%3. 为避免资料丢失,刷机前请先备份个人资料4. 本教程内容均来自于互联网并经N多网官方整理刷机前必看注意事…

android q全局夜间模式,安卓Q新功能全局夜间模式,网友:都9102年了,魅族Flyme早就有...

原标题:安卓Q新功能全局夜间模式,网友:都9102年了,魅族Flyme早就有目前市面上的智能手机系统基本是苹果的iOS和谷歌的安卓两分天下,其中,安卓系统的用户分布更加广泛。近日,安卓Q系列被正式曝光…

android 教程概要,Android精通教程-第一节Android入门简介

前言大家好,我是 Vic,今天给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢每日一句If life were predictable it would cease to be life, and be without flavor.--- Eleanor Roosevelt每日一句入门工具的安装第一步&a…

市场销售的计算机主机硬盘主要有,一种具有旋转功能的计算机硬盘销售架的制作方法...

本实用新型涉及硬盘销售技术领域,具体为一种具有旋转功能的计算机硬盘销售架。背景技术:硬盘是电脑主要的存储媒介之一,由一个或者多个铝制或者玻璃制的碟片组成,碟片外覆盖有铁磁性材料,硬盘有固态硬盘、机械硬盘和混…

计算机设备中找不到网络适配器,驱动技巧:解决设备管理器中找不到网卡的问题...

类型:网卡问题:设备管理器中找不到网卡,因此驱动精灵万能网卡版无法安装网卡驱动解决方案:操作步骤:1、首先确认是否有网卡查看电脑周边接口有无RJ45网线接口。一般在后面。如下图所示:2、若电脑配置有网卡&#xff0c…

计算机原理2408,《计算机组成原理实验》课程教学大纲

《计算机组成原理实验》课程教学大纲教学模块(章)教学目标基本运算器试验了解运算器的组成结构,掌握运算器的工作原理。静态随机存储器实验掌握静态随机存储器 RAM 工作特性及数据的读写方法。微程序控制器实验掌握微程序控制器的组成原理,掌握微程序的编…

win7计算机双击变管理,如何修复Win7系统鼠标单击以双击

鼠标在计算机中的位置非常重要。就像我们的指南针。我们需要的是,只需移动并单击它即可。然后最近,Windows 7 Ultimate 64位系统用户报告说win7鼠标的单击已更改为双击,这种情况无疑给我们的常规操作增加了麻烦,让我们看一下如何解…

量子计算机功率,量子计算功耗知多少

邻家怪蜀黍 2015.10.06 , 10:06 pm——量子计算功耗知多少google的量子智能实验室刚刚制造的最新的计算机可能是目前第一台商业量子计算机了。而这台新型的计算机能够比传统计算机更快的、使用相对更少的功耗来完成相同的计算任务。不过量子计算到底能节约多少功耗目前还是个迷…

升级计算机方案,关于计算机升级方案

2004-12-28cpu 赛扬D2.4G 内存 金士顿256M DDR400 硬盘 酷鱼80G 7200转 液晶显示器用明基或三星的2500元左右 想问主板用华硕什么样的好?用华硕845PE的行不行?与什么样的显卡相配,注:并不玩大型游戏?CPU: 赛扬4 2。0G …

网易126邮箱服务器设置,网易闪电邮企业邮箱设置教程(POP3)

原标题:网易闪电邮企业邮箱设置教程(POP3)使用网易闪电邮收发企业邮箱邮件,下面是设置教程1、启动闪电邮后,点击“邮箱---新建邮箱账户”菜单,如下图:2、输入“邮箱地址和密码”,点击下拉箭头继续设置&…

django2与ajax,Python-Django-Ajax进阶2

-forms组件的渲染错误信息在模板中:{{ foo.errors.0 }}-forms使用bootstrap样式widgetwidgets.EmailInput(attrs{class:form-control}))-全局和局部钩子函数AOP:面向切面编程-局部钩子函数(再校验name)def clean_name(self):# 从cleaned_data中取出字段的值name self.cleaned_…

java方法的传递方式_JAVA基础--方法传参

JAVA基础--方法传参为啥拿这个当话题?在初学者阶段,许多童鞋都对方法传参比较迷茫,知其然不知其所以然。一.先说说参数传递的几个术语:值调用(call by vale):表示方法接收的是调用者传递的值。引用调用(call by reference):表示方…

java udp 协议_网络协议 - UDP 协议详解

网络协议 - UDP 协议详解 基于TCP和UDP的协议非常广泛,所以也有必要对UDP协议进行详解。pdai UDP概述UDP(User Datagram Protocol)即用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第…

java线程卡住排查_基于 Java 线程栈 排查问题

除日志外,还有没有别的方式跟踪线上服务问题呢?或者,跟踪并排除日志里无法发现的问题?方法当然是有的,就是通过现场快照定位并发现问题。我们所说的现场,主要指这两方面:Java 线程栈。线程栈是J…

java实验二答案天津商业大学_天津商业大学信息安全实验一

天津商业大学信息安全实验一 1《信息安全技术》实 验 报 告 书实验名称: 实验一Internet应用风险专 业: 电子商务班 级: 1203班姓 名: 代常发学 号: 20124934指导老师: 丁雷信息工程学院2015 年 5 月2目 录…

java前端的日期插件_几个前端时间插件总结

几个前端时间插件总结总结一下几款时间插件,分别是- [ ] jeDate 手册http://www.jemui.com/jedate/- [ ] bootstrap-datetimepicker 下载地址- [ ] My97DatePicker 下载地址- [ ] jQuery UI 插件Datepicker下载地址并没有哪款完全超越另外一款,主要还是看…

Java插件自动保存浏览器书签_多浏览器书签同步插件EverSync

有时上网时会遇到浏览器不能正常显示的问题。(比如我的火狐浏览器无法正确显示微信公众号管理后台,在chrome上可以正常显示),所以我的电脑里安装了chrome和firefox两个浏览器。但是时间长了,会出现两个浏览器上书签不同步的问题。原来自己的解…

php oracle 中文字段,怎么解决php oracle乱码问题

php oracle乱码是由于没有正确的配置字符集信息导致的,其解决办法就是通过PLSQL运行“select * from V$NLS_PARAMETERS;”获取oracle的字符集,并重新设置正确的字符集即可。PHP Oracle 中文乱码问题通常缺省配置连接Oracle在处理中文时都会遇到乱码问题&…