安卓--获取手机屏幕的相关参数

本文介绍如何使用Android的DisplayMetrics类获取设备的屏幕分辨率、尺寸及单位转换方法,并提供了一个实用的工具类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DisplayMetrics类是获取手机屏幕各种属性的关键类。

一、获取手机屏幕的分辨率:

1.通过WindowManager获取

DisplayMetrics dm = new DisplayMetrics();  
getWindowManager().getDefaultDisplay().getMetrics(dm);  
//屏幕宽度  
int widthPixels = dm.widthPixels;  
//屏幕高度  
int heightPixels = dm.heightPixels; 

2.通过Resources获取

DisplayMetrics dm = getResources().getDisplayMetrics();// 通过Resources获取
//屏幕宽度
int widthPixels = dm.widthPixels;
//屏幕高度
int heightPixels = dm.heightPixels;
3.获取屏幕的默认分辨率  

Display display = getWindowManager().getDefaultDisplay();// 获取屏幕的默认分辨率
//屏幕宽度
int widthPixels = display.getWidth();//getWidth和下面的getHeight在API 13中已经被弃用了,应该用getSize(Point p)来代替 
//屏幕高度
int heightPixels = display.getHeight();

二、获取手机屏幕的dip:

首先要知道,dp与px的区别:
 px就是像素,这是一个物理单位,在不同的屏幕上,同样大小的像素,显示出来的大小可能不同。
 而dp(dpi)是一种相对的单位,叫做像素密度,在每英寸160点的显示器上,1dp = 1px。 
DisplayMetrics dm = getResources().getDisplayMetrics();// 通过Resources获取
int widthPixels = dm.widthPixels;//屏幕宽度(px)
int heightPixels = dm.heightPixels;//屏幕高度(px)
Log.d("width:", widthPixels+"");
Log.d("height:", heightPixels+"");
float density = dm.density;//屏幕密度(0.75 / 1.0 / 1.5),每个dpi有多少像素
int densityDpi = dm.densityDpi;// 屏幕密度dpi(120/160/240/400),每英寸有多少像素
float xdpi = dm.xdpi;//X轴方向的每英寸的dpi数   该值*该方向的英寸数等于该方向的像素数
float ydpi = dm.ydpi;//Y轴方向的每英寸的dpi数   该值*该方向的英寸数等于该方向的像素数
Log.d("density", String.valueOf(density));//1dpi的像素数
Log.d("densityDpi", String.valueOf(densityDpi));//每英寸有多少像素
Log.d("xdpi", String.valueOf(xdpi));
Log.d("ydpi", String.valueOf(ydpi));
经测试,我的手机(nubia Z7 max  1080p  5.5寸)  宽2.7寸  长4.8寸   写对角线正好5.5寸
也就是说,我的手机屏幕,1dp =2.5px

获取X轴和Y轴方向的dpi数,只要将上面的xdpi乘以该方向的实际物理英寸,y轴同理。

、获取手机屏幕的大小(具体的尺寸):

用该方向的像素除以该方向的densityDpi,就可以得到该方向的实际英寸了

DisplayMetrics dm = getResources().getDisplayMetrics();// 通过Resources获取
float density = dm.density;//屏幕密度(0.75 / 1.0 / 1.5),每个dpi有多少像素
int densityDpi = dm.densityDpi;// 屏幕密度dpi(120/160/240/400),每英寸有多少像素
float xInch = dm.widthPixels * 1.0f / densityDpi;
float yInch = dm.heightPixels * 1.0f / densityDpi;
Log.d("X inch:", xInch+"");
Log.d("Y inch:", yInch+"");



如要在开发过程中,要在px和dp之间进行转换,可以使用如下的工具类:

package com.learn.protection;
import android.content.Context;
import android.util.DisplayMetrics;
import android.util.Log;
/**
 * Created by KalinaRain on 2015/4/12.
 */
public class DensityUtil {
    private static final String TAG = DensityUtil.class.getSimpleName();
    private static DisplayMetrics dm;
    private static float dmDensity = 0.0f;// 当前屏幕的densityDpi
    private static float dmDensityDpi = 0.0f;// 当前屏幕的densityDpi
    private static float scale = 0.0f;//也就是dm.density
    /**
     * 根据构造函数获得当前手机的屏幕系数
     */
    public DensityUtil(Context context) {
        // 获取当前屏幕
        dm = context.getApplicationContext().getResources().getDisplayMetrics();
        // 设置Density
        setDmDensity(dm.density);
        // 密度因子
        scale = getDmDensity();//density = dm.densityDpi/160
        dmDensityDpi = dm.densityDpi;//每英寸含有的像素数
        Log.i(TAG, toString());
    }
    /**
     * 获取当前屏幕的density
     */
    public static float getDmDensity() {
        return dmDensity;
    }
    /**
     * 设置当前屏幕的density
     */
    public static void setDmDensity(float dmDensity) {
        DensityUtil.dmDensity = dmDensity;
    }
    /**
     * dpi转换像素
     */
    public static int dip2px(float dipValue) {
        return (int) (dipValue * scale + 0.5f);
    }
    /**
     * 像素转换dpi
     * */
    public int px2dip(float pxValue) {
        return (int) (pxValue / scale + 0.5f);
    }
    @Override
    public String toString() {
        return " dmDensity:" + dmDensity + " dmDensityDpi:" + dmDensityDpi;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值