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

相关文章

PyTorch核心方法之state_dict()、parameters()参数打印与应用案例

《PyTorch核心方法之state_dict()、parameters()参数打印与应用案例》PyTorch是一个流行的开源深度学习框架,提供了灵活且高效的方式来训练和部署神经网络,这篇文章主要介绍... 目录前言模型案例A. state_dict()方法验证B. parameters()C. 模型结构冻

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

自定义注解SpringBoot防重复提交AOP方法详解

《自定义注解SpringBoot防重复提交AOP方法详解》该文章描述了一个防止重复提交的流程,通过HttpServletRequest对象获取请求信息,生成唯一标识,使用Redis分布式锁判断请求是否... 目录防重复提交流程引入依赖properties配置自定义注解切面Redis工具类controller

C#如何在Excel文档中获取分页信息

《C#如何在Excel文档中获取分页信息》在日常工作中,我们经常需要处理大量的Excel数据,本文将深入探讨如何利用Spire.XLSfor.NET,高效准确地获取Excel文档中的分页信息,包括水平... 目录理解Excel中的分页机制借助 Spire.XLS for .NET 获取分页信息为什么选择 S

VSCode开发中有哪些好用的插件和快捷键

《VSCode开发中有哪些好用的插件和快捷键》作为全球最受欢迎的编程工具,VSCode的快捷键体系是提升开发效率的核心密码,:本文主要介绍VSCode开发中有哪些好用的插件和快捷键的相关资料,文中... 目录前言1、vscode插件1.1 Live-server1.2 Auto Rename Tag1.3

Java调用DeepSeek API的8个高频坑与解决方法

《Java调用DeepSeekAPI的8个高频坑与解决方法》现在大模型开发特别火,DeepSeek因为中文理解好、反应快、还便宜,不少Java开发者都用它,本文整理了最常踩的8个坑,希望对... 目录引言一、坑 1:Token 过期未处理,鉴权异常引发服务中断问题本质典型错误代码解决方案:实现 Token

Nginx 访问控制的多种方法

《Nginx访问控制的多种方法》本文系统介绍了Nginx实现Web访问控制的多种方法,包括IP黑白名单、路径/方法/参数控制、HTTP基本认证、防盗链机制、客户端证书校验、限速限流、地理位置控制等基... 目录一、IP 白名单与黑名单1. 允许/拒绝指定IP2. 全局黑名单二、基于路径、方法、参数的访问控制

springboot3.x使用@NacosValue无法获取配置信息的解决过程

《springboot3.x使用@NacosValue无法获取配置信息的解决过程》在SpringBoot3.x中升级Nacos依赖后,使用@NacosValue无法动态获取配置,通过引入SpringC... 目录一、python问题描述二、解决方案总结一、问题描述springboot从2android.x