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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操