Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)

本文主要是介绍Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

获取屏幕宽和高的两种方法

方法一、代码如下:
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Comic Sans MS;font-size:18px;">        WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);  
  2.         Display display = wm.getDefaultDisplay();  
  3.         Log.i(tag, "屏幕尺寸1: 宽度 = "+display.getWidth()+"高度 = :"+display.getHeight()  
  4.                 );</span>  

方法二、代码如下:
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Comic Sans MS;font-size:18px;">DisplayMetrics dm =getResources().getDisplayMetrics();  
  2.         int w_screen = dm.widthPixels;  
  3.         int h_screen = dm.heightPixels;  
  4.         Log.i(tag, "屏幕尺寸2:宽度 = " + w_screen + "高度 = " + h_screen + "密度 = " + dm.densityDpi);</span>  

方法一的方法已经被遗弃了,推荐用方法2的方法,除获得屏幕的宽和高外还可以获得屏幕的密度。这里必须注意,获得的尺寸单位为px,即像素,而不是屏幕的绝对尺寸。在G700上得到的参数如下:
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Comic Sans MS;font-size:18px;">    Line 1297: 12-08 11:39:09.037 I/yan     (13602): 屏幕尺寸1: 宽度 = 720高度 = :1280  
  2.     Line 1299: 12-08 11:39:09.037 I/yan     (13602): 屏幕尺寸2:宽度 = 720高度 = 1280密度 = 320</span>  

在Geek手机上参数如下:
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Comic Sans MS;font-size:18px;">    Line 1511: 01-06 03:11:20.839 I/yan     (30175): 屏幕尺寸1: 宽度 = 1080高度 = :1920  
  2.     Line 1513: 01-06 03:11:20.839 I/yan     (30175): 屏幕尺寸2:宽度 = 1080高度 = 1920密度 = 480</span>  

可以看到,同样是5.0寸的屏幕,一个密度是320,一个密度是480.同样的物理宽度,后者是1080个像素而前者是720个像素。

px与dip的概念及互相转化

px即pixels,是绝对像素,有多少个像素点就是多少个像素点。
dip即device independent pixel,设备独立像素,无像素无关。
二者转换公式如下:
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Comic Sans MS;font-size:18px;">package org.yanzi.util;  
  2.   
  3. import android.content.Context;  
  4.   
  5. public class DisplayUtil {  
  6.     public static int dip2px(Context context, float dipValue){              
  7.         final float scale = context.getResources().getDisplayMetrics().density;                   
  8.         return (int)(dipValue * scale + 0.5f);           
  9.     }              
  10.     public static int px2dip(Context context, float pxValue){                  
  11.         final float scale = context.getResources().getDisplayMetrics().density;                   
  12.         return (int)(pxValue / scale + 0.5f);           
  13.     }   
  14. }  
  15. </span>  
转换时牵涉到一个密度的概念,密度越大,单位物理尺寸上的像素点就越多,dip也就越大。从转换公式上也可以看到,px近似等于dip*density。dip跟dp一个意思,在android开发中推荐像素使用dip概念。举个简单的例子,如果扫描矩形框的长度为300px,在density为320和480的手机屏幕上显示效果是完全不一样的,因此单位要使用dip。但是在使用canvas绘制东西时,所依照的坐标系、Rect等单位都是px,所以其尺寸要以dip为单位,而坐标要以px为单位。假设要以屏幕的中心为正方形的中心,画一个边长为D的正方形,设D = 240dip. 代码如下:
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Comic Sans MS;font-size:18px;">        Point center_dip = new Point(DisplayUtil.px2dip(this, dm.widthPixels)/2,  
  2.                 DisplayUtil.px2dip(this, dm.heightPixels)/2); //以dip为单位的中心  
  3.   
  4.         square_screen = new Rect(DisplayUtil.dip2px(this, center_dip.x - D/2),  
  5.                 DisplayUtil.dip2px(this,center_dip.y - D/2),  
  6.                 DisplayUtil.dip2px(this,center_dip.x + D/2),  
  7.                 DisplayUtil.dip2px(this,center_dip.y + D/2));</span>  
首先得到dip为单位的屏幕中心,然后以D(单位dip)得到单位为dip的正常性坐标,再将其转换成单位为px的坐标,这样在不同的手机上显示效果就是一样的。其实可以这么看待dip,dip有点类似手机的物理尺寸,尽管实际上不是。dip = px/density,geek 5.0寸屏跟G700,得到的结果是一样的:1080/3 = 720/2

总结:
densityDpi 每英寸多少个像素点,
density =  densityDpi /160
APP根据densityDpi的大小决定调用哪个文件夹下的图片,关系如下:
drawable-ldpi 底密度,通常是指120
drawable-mdpi 中等密度,通常是指160
drawable-xhdpi 超高密度,通常是指320

px = dip*density 
在绘制矩形时,可以首先获得屏幕宽度的dip,根据dip决定边长D,然后用文中的方法确定其px坐标。来张效果图:


分辨率的概念

现在人们经常把320*240成为 分辨率,其实是不准确的,这仅仅是图片的像素点总数罢了,分辨率的概念是每英寸上的像素点数,单位为dpi.在windows下右键属性--摘要--高级里可以查看,一般图片的dpi为96DPI。这个单位根ps下的有出入,但都是一回事。详情参见:http://www.baidu.com/link?url=P0mQdUmSUuV4qhvTgLDMJ8oHui5avC6VPvsaKU4THJIkbB37cpeylwHbZ3Xi3x4r9jUkAhmGKTudZ8hcG6HoyGhJRw2t0M-Oaem78YKmoKy

参考:http://blog.csdn.net/wqunwang506/article/details/7925333

这篇关于Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/481350

相关文章

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu