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 onclick方法吗,Android中button的onClick事件几种方法

Android中button的onClick事件几种方法发布时间:2020-09-03 02:36:31来源:脚本之家阅读:100作者:水桶前辈Android中button的onClick事件几种方法利用三种方法,学习button的监听事件。方法一源码如下:packag…

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

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

android room表关联,如何在首次运行时填充Android Room数据库表?

我尝试了许多方法可以做到这一点,每个没有提供。首先,我尝试使用addMigrations方法向Room中添加Migration实现,但发现它只在数据库升级期间运行,但不在创建时运行。然后,我尝试使用openHelperFactory方法将SQLiteOpenH…

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多网官方整理刷机前必看注意事…

升级鸿蒙3.0需要备份吗,升级鸿蒙OS3.0机型曝光!大哥,你是认真的吗?

鸿蒙OS系统,可真是“千呼万唤始出来”啊!自2017年华为开始研发鸿蒙内核1.0,2018年进展至鸿蒙内核2.0,2019年正式推出了鸿蒙OS1.0系统,并在发布会上预计2021年发布鸿蒙OS3.0系统。虽然在开发者大会上,华为宣…

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…

html支持的脚本语言,能不能让日志内容在支持html语言的同时支持一下脚本语言,拜托!拜托!...

日志里经常引用一个网站的歌,他们的歌曲网址有部分常改变,比如说dm1.hting.com/ht//部分,没准哪天就变成dm1.hting.com/as//。所以我想在内容模板里声明一个变量。比如说用zdy代替dm1.haoting.com/ht//。这样它那部分若变了,我就直接在内容模板里把zdy代表的字符串也…

des解码 android,DES解密出错

- 当前 Bug 的表现(可附上截图)执行crypto.TripleDES().decrypt 时,出现下面错误:VM5902:1 URIError: URI malformedat decodeURIComponent ()at Function.value (appservice.js:984)at toString (appservice.js:984)at t.onShow (binded.js? [sm]:123)…

2021年浙江省高考成绩查询时间,2021年浙江高考成绩什么时候出来 时间

2021年浙江高考成绩什么时候出来 时间浙江高考成绩公布时间预计在23日左右可查询成绩6月9日起,全省91.4万余份试卷将在省教育考试院集中扫描采集信息后,由经过严格选聘并培训的评卷教师们在全省共3个评卷点进行“背靠背”网上评卷。所有评卷教师都签订了…

计算机主机的主要包括,微型计算机的主机主要包括

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。微型计算机的主机主要包括CPU和内存储器。CPU包括运算器和控制器。内存储器包括ROM和RAM。微型计算机,是指由微处理器作为CPU的计算机。由大规模集成电路组成的、体积较小…

网络中的计算机之间的关系,有关服务器与主机之间的关系

局域网,是指“存在于某一个较小地理区域内的计算机网络”。通常把两台以上的电脑通过各种介质(比如双绞线、同轴电缆、电话线等等,空气也算是一种介质,这就是无线网络)连接起来,这就构成了计算机网络。专业的说法是一台电脑与一台…

计算机键盘打出来都是英语大写怎么办,电脑键盘上大小写怎么切换

按下电脑键盘上的"CAPS LOCK"键,提示灯就会亮,就可以输入大写,再按一下"CAPS LOCK"键,提示灯灭了,就输入的是小写。按键的位置和提示灯的位置就在下图红框内,不同厂家的键盘也稍微有些…

计算机逻辑判断函数函数知识点,计算机考点条件检测函数IF

出国留学网小编为你整理“2017计算机资格Excel2003考点条件检测函数IF”哦,介绍了计算机资格考试Excel2003等相关内容,欢迎广大网友前来学习,希望对你有所帮助!更多资讯关注本网站的更新吧!功能:IF函数具有判断的能力,…

html5 视频路径加密,HTML5视频路径混淆

这是一个奇怪的,与我一起裸露。HTML5视频路径混淆我一直在玩Video.js,并遇到了提供的示例问题。使用html5视频元素指定MP4(h264)视频时,会出现一些混淆。当我使用(绝对值):显示视频,没有问题。但是当我使用&#xff1a…

c语言编程题2^0+2^1+……+2e63,牛客网刷题33(2道题)

60.在其它数都出现k次的数组中找到只出现一次的数题目链接题目描述给定一个整型数组arr和一个大于1的整数k。已知arr中只有1个数出现了一次,其他的数出现k次,请返回出现了1次的数。输入描述输入包含两行,第一行包含两个整数n和k(1≤n≤105,1≤…

西昌学院计算机,西昌学院

西昌学院是2003年经教育部批准组建的省属全日制普通多科性本科院校。坐落在举世闻名的中国西昌航天城。这里四季如春,资源丰富,素有“月城”、“春城”的美誉。学院前身为1939年北洋工学院迁至西昌创建的国立西康技艺专科学校,距今已有70年的…

如何形容自己的计算机水平,信息在计算机中的表示

教学任务:(一)知识目标:1、让学生了解0和1是怎样表示不同信息的。2、理解什么是二进制,十进制是如何转换成二进制的。3、学生了解字符编码的简要知识。(二)能力目标1、 激发学生的学习热情,能举一反三。2、培养学生合作学习的能力…

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

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