获取屏幕宽和高的两种方法
1.方法一:
WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Log.i(tag, "屏幕尺寸1: 宽度 = "+display.getWidth()+"高度 = :"+display.getHeight());
2.方法二:
DisplayMetrics dm =getResources().getDisplayMetrics();
int w_screen = dm.widthPixels;
int h_screen = dm.heightPixels;
Log.i(tag, "屏幕尺寸2:宽度 = " + w_screen + "高度 = " + h_screen + "密度 = " + dm.densityDpi);
推荐使用方法二,即可以获得屏幕的宽高,还可以获得屏幕的密度,这里获得的尺寸单位为 px(即像素)。
px与dip的概念及互相转化
px 即 pixels,是绝对像素,就是固定的像素点的个数;
dip 即 device independent pixel,设备独立像素,与像素无关。
1.转换公式如下:
package org.yanzi.util;
import android.content.Context;
public class DisplayUtil {
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);
}
}
2.转换细节
转换时牵涉到一个密度的概念,密度越大,单位物理尺寸上的像素点就越多,dip 就越大。
从转换公式上看,px 近似等于 dip * density。dip 和 dp 是同一个概念,在 Android 中推荐像素使用 dip 概念,举例:
如果扫描矩形长度为 300px,在 density 为 320 和 480 的手机屏幕上显示是不同的,所以要用 dip;因为 Cavas 绘图依据的坐标系、Rect 等单位都是 px,所以其尺寸要以 dip 为单位,坐标要以 px 为单位。假定要以屏幕中心为正方形的中心绘制一个边长为 D 的正方形,那么当 D=240 dip,下述代码:
//以dip为单位的中心
Point center_dip = new Point(DisplayUtil.px2dip(this, dm.widthPixels)/2, DisplayUtil.px2dip(this, dm.heightPixels)/2);
square_screen = new Rect(DisplayUtil.dip2px(this, center_dip.x - D/2),
DisplayUtil.dip2px(this,center_dip.y - D/2),
DisplayUtil.dip2px(this,center_dip.x + D/2),
DisplayUtil.dip2px(this,center_dip.y + D/2));
会先得到以 dip 为单位的屏幕中心,然后以 D 得到单位为 dip 的正常性坐标,再将其转换成单位为 px 的坐标,这样不管不同的手机分辨率是多少都可以确保在屏幕中心。
3.小结
densityDpi:每英寸多少像素点;
density:density = densityDpi / 160;
App 根据 densityDpi 大小决定调用哪个文件夹下的图片,关系如下:
drawable-ldpi:低密度,通常指 120;
drawable-mdpi:中等密度,通常指 160;
drawable-hdpi:高密度,通常是 320;
px = dip * density。
分辨率的概念
平时我们所说的 1366 * 768 并不是真正的分辨率,那个指的实际上是图片像素点总数;
分辨率实际上指的是每英寸上的像素点数,单位为 dpi。Windows 平台下右键->属性->摘要->高级里面可以查看,一般图片的 dpi 为 96DPI,这个单位和 PS 下的有出入,但都是一回事:http://wenku.baidu.com/link?url=P0mQdUmSUuV4qhvTgLDMJ8oHui5avC6VPvsaKU4THJIkbB37cpeylwHbZ3Xi3x4r9jUkAhmGKTudZ8hcG6HoyGhJRw2t0M-Oaem78YKmoKy
Android 屏幕分辨率详解
DisplayMetrics metrice= new DisplayMetrics();
Display defaultDisplay = getWindowManager().getDefaultDisplay();
defaultDisplay.getMetrics(metrice);
int densityDpi = metrice.densityDpi;
float density = metrice.density;
int heightPixels = metrice.heightPixels;
int widthPixels = metrice.widthPixels;
float xdpi = metrice.xdpi;
float ydpi = metrice.ydpi;
float scaledDensity = metrice.scaledDensity;
dip:于设备无关的像素值,比如说我在中密度上显示的值为50dip,在低密度的设备上显示的值就为50*0.75=37.5
px:代表物理像素,比如说在中密度上显示的值为50px,注意单位是px,在其他密度设备上显示的值也是50px
densityDpi :每英寸多少个点,我的理解是每英寸多少个dip
density:densityDpi /160;
drawable-hdpi 高密度,通常是指240也就是上述代码中的densityDpi为240
drawable-ldpi 底密度,通常是指120
drawable-mdpi 中等密度,通常是指160
drawable-xhdpi 超高密度,通常是指320
在drawable-mdpi 里放了一张像素为48*48的图片,把该图片设置成button按钮的背景,在不同密度,不同分辨率的设备下获得的数据如下:
densityDpi=120
density=0.75
heightPixels=320
widthPixels=240
xdpi=120.0
ydpi=120.0
scaledDensity=0.75
intrinsicHeight=36
intrinsicWidth=36
densityDpi=160
density=1.0
heightPixels=480
widthPixels=320
xdpi=160.0
ydpi=160.0
scaledDensity=1.0
intrinsicHeight=48
intrinsicWidth=48
densityDpi=160
density=1.0
heightPixels=768
widthPixels=1024
xdpi=160.0
ydpi=160.0
scaledDensity=1.0
intrinsicHeight=48
intrinsicWidth=48
densityDpi=240
density=1.5
heightPixels=800
widthPixels=480
xdpi=240.0
ydpi=240.0
scaledDensity=1.5
intrinsicHeight=72
intrinsicWidth=72
densityDpi=240
density=1.5
heightPixels=800
widthPixels=480
xdpi=160.42105
ydpi=160.0
scaledDensity=1.5
dimension=75.0
intrinsicHeight=72
intrinsicWidth=72
densityDpi=320
density=2.0
heightPixels=640
widthPixels=960
xdpi=320.0
ydpi=320.0
scaledDensity=2.0
intrinsicHeight=96 //代表图片实际显示的物理像素
intrinsicWidth=96
由此可知,图片的显示和密度之间存在着莫大的关系,在同等密度下不管设别分辨率多大,图片所显示的大小是一样的,在密度不相同的情况下,图片会进行缩放:例如,在中等密度下图片显示高度为48px,低密度下显示的高度为48*0.75=36,图片会进行缩小;在高密度下显示的高度为48*1.5=72,图片会放大;
由此也可以得出官网中的计算公式:
px = dp * (dpi / 160) 即px =dp*density;(density=densityDpi/160)