详解Android应用中屏幕尺寸的获取及dp和px值的转换

 更新时间:2016年03月22日 16:20:54   作者:chenlijian  
这篇文章主要介绍了Android应用中屏幕尺寸的获取及dp和px值的转换方法,这里主要介绍将dp转化为px值的例子,需要的朋友可以参考下

获取屏幕尺寸

通过WindowManager获取

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

//其中display = getWindowManager().getDefaultDisplay() 获得了一个DefaultDisplay对象; 然后 display.getMetrics(dm) 把屏幕尺寸信息赋值给DisplayMetrics dm

//注意:WindowManager有时候需要通过context。getSystemService获取:WindowManager wm = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);

DisplayMetrics和Display的关系。;

Display指代显示区域这个对象,它可能是真实的物理屏幕,也可能仅指应用程序的显示区域,比如在非全屏Activity里,系统因为有状态栏,因此显示区域要比物理屏幕要小。DisplayMetrics里封装了显示区域的各种属性值。查看源码发现,在DisplayMetrics对各个属性值的注释都说明为真实的物理尺寸。而且也发现display.getMetrics(dm)这一函数基本在应用在获取真实屏幕尺寸的时候。记住这一点即好。

注:构造函数DisplayMetrics不需要传递任何参数;调用getWindowManager()之后,会取得现有Activity的Handle。然后,diplay将取得的宽高维度存放于DisplayMetrics对象中,而取得的宽高维度是以像素为单位(Pixel),“像素”所指的是“绝对像素”而非“相对像素”。

通过DisplayMetrics对象dm可以获得如下信息

width = dm.widthPixels;

height = dm.heightPixels;

xdpi = dm.xdpi;

ydpi = dm.ydpi;

density = dm.densityDpi;

fdensity = dm.density;

将dp和px转化成对应的px数值的实例:

int padding =4;

padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4,

context.getResources().getDisplayMetrics());


解释:
padding的单位是:dip, padding的大小是:4

虽然是4dip,但是,不是最终padding的真实单位。

他是通过计算以后,4dp和密度系数相乘得到的一个值,实际上计算出来的padding单位是像素,也就是它的宽度。在不同dpi的屏幕上,这个值是不一样的。

即:将dp转化为px,返回的是一个dp对应的px数值。

如果这里是COMPLEX_UNIX_SP,就是讲sp转化为dp。

单位间的转换就用这个方法,可以将其封装成一个工具方法。

进一步理解:
applyDimension方法是将4像素转换为6dp(480x800)、4dp(320x800)、3dp(240x320), 所以返回的值对应不同的分辨率(通过getDisplayMetrics就得到了)就是6、4、3

源代码:

public static float applyDimension(int unit, float value,

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;

}

相关文章

  • Android开发中使用颜色矩阵改变图片颜色,透明度及亮度的方法

    Android开发中使用颜色矩阵改变图片颜色,透明度及亮度的方法

    这篇文章主要介绍了Android开发中使用颜色矩阵改变图片颜色,透明度及亮度的方法,涉及Android针对图片的读取、运算、设置等相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • 使用Flutter开发的抖音国际版实例代码详解

    使用Flutter开发的抖音国际版实例代码详解

    这篇文章主要介绍了使用Flutter开发的抖音国际版,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • android dialog边框去除白色边框实现思路及代码

    android dialog边框去除白色边框实现思路及代码

    android dialog边框含有白色真是美中不足啊,本文将介绍如何去除白色边框,有思路及代码,感兴趣的朋友可以了解下
    2013-01-01
  • Android Studio 生成自定义jar包的步骤详解

    Android Studio 生成自定义jar包的步骤详解

    这篇文章主要介绍了Android Studio 生成自定义jar包的具体操作步骤,需要的朋友可以参考下
    2018-01-01
  • 详解android使用SAX解析XML文件

    详解android使用SAX解析XML文件

    本篇文章主要是介绍了android使用SAX解析XML文件,解析XML的方式有很多种,本篇主要介绍使用sax来解析,需要的可以了解一下。
    2016-11-11
  • Android仿微信、录制音频并发送功能

    Android仿微信、录制音频并发送功能

    这篇文章主要介绍了Android仿微信、录制音频并发送功能的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Android+SQLite数据库实现的生词记事本功能实例

    Android+SQLite数据库实现的生词记事本功能实例

    这篇文章主要介绍了Android+SQLite数据库实现的生词记事本功能,结合具体实例形式分析了Android操作SQLite数据库实现生词记录功能的操作步骤与相关注意事项,需要的朋友可以参考下
    2017-09-09
  • 详解Android中AIDL的使用

    详解Android中AIDL的使用

    AIDL是Android Interface definition language的缩写,对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互,接下来通过本文给大家分享Android AIDL使用,需要的朋友参考下吧
    2021-07-07
  • Android SDK安装及配置教程

    Android SDK安装及配置教程

    这篇文章主要为大家详细介绍了Android SDK安装及配置教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • 准确测量 Android 应用中 Activity 和 Fragment 的启动时间的详细过程

    准确测量 Android 应用中 Activity 和 Fragmen

    在 Android 应用开发中,了解每个 Activity 和 Fragment 的启动时间对于性能优化至关重要,本文将介绍几种方法来准确测量 Activity 和 Fragment 的启动时间,并提供实际操作步骤,以帮助提升应用的响应速度和用户体验,需要的朋友可以参考下
    2024-07-07

最新评论