android获取屏幕尺寸

本文详细介绍在Android设备上获取屏幕尺寸、状态栏及导航栏高度的方法,包括基础屏幕尺寸获取、考虑导航栏时的完整高度计算、状态栏及导航栏高度的有效获取方式,以及dp与px、sp与px的转换公式。

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

前导

先介绍下基本的属性值

width: 屏幕的宽度
height:屏幕的高度
xdpi:屏幕宽度方向的dpi
ydpi:屏幕高度方向的dpi
density:屏幕整体的dpi
fdensity:dpi与标准像素密度(160dpi)比值
sdensity:字体缩放比例(个人感觉就是fdensity)

这篇文章衔接与android 冷知识 像素博客遗留的问题做出解释

基础的获得屏幕尺寸
		DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int width = metrics.widthPixels;
        int height = metrics.heightPixels;
        double xdpi=metrics.xdpi;
        double ydpi=metrics.ydpi;
        int density = metrics.densityDpi;
        double fdensity = metrics.density;
        double sdensity = metrics.scaledDensity;

这个方法有一定的缺陷,当手机有导航栏时;获取的高度会规避导航栏的高度

在有导航栏下获得全部高度
		Context context = getApplicationContext();
        DisplayMetrics dm = new DisplayMetrics();
        WindowManager windowMgr = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
        windowMgr.getDefaultDisplay().getRealMetrics(dm);
        int height2 = dm.heightPixels;
        int width2 = dm.widthPixels;
        double xdpi2=dm.xdpi;
        double ydpi2=dm.ydpi;
        int density2 = dm.densityDpi;
        double fdensity2 = dm.density;
        double sdensity2 = dm.scaledDensity;
            // 这样可以计算屏幕的物理尺寸
    	float width2 = (width / xdpi)*(width / xdpi);
    	float height2 = (height / ydpi)*(width / xdpi);

在这个方法中主要是在WindowManager中增加了一个属性getSystemService(Context.WINDOW_SERVICE),通过这个属性就可以完整的去获取手机的像素。

获得手机的状态栏的高度
方法一
		Rect frame = new Rect();
        getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;

这个方法在很多情况下都是不生效的,

方法二_有效方法
	public float getStatusBarHeight() {
        float result = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = getResources().getDimension(resourceId);
        }
        return result;
    }
方法三_有效方法
	public static int getStatusHeight(Activity activity){
        int statusHeight = 0;
        Rect localRect = new Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(localRect);
        statusHeight = localRect.top;
        if (0 == statusHeight){
            Class<?> localClass;
            try {
                localClass = Class.forName("com.android.internal.R$dimen");
                Object localObject = localClass.newInstance();
                int i5 = Integer.parseInt(localClass.getField("status_bar_height").get(localObject).toString());
                statusHeight = activity.getResources().getDimensionPixelSize(i5);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (NumberFormatException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
        return statusHeight;
    }
获取导航栏的高度
 public float getNavigationBarHeight() {
        float result = 0;
        int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = getResources().getDimension(resourceId);
        }
        return result;
    }
承接以前博客

1.dp与px之间的关系

	public static int dpToPixels(Context context , float dp){
		float density = context.getResources().getDisplayMetrics().density;
		return (int)Math.ceil(dp * density);

2.sp与px之间的关系

	/**
	 * Pixels 转 SP
	 */
	public static float pixelsToSp(Context context, float px) {
	    float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
	    return px/scaledDensity;
	}
	
	/**
	 * SP 转 Pixels
	 */
	public static float spToPixels(Context context, float sp) {
	    float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
	    return sp * scaledDensity;
	}

安卓源码
	public void setTo(DisplayMetrics o) {
        this.widthPixels = o.widthPixels;
        this.heightPixels = o.heightPixels;
        this.density = o.density;
        this.densityDpi = o.densityDpi;
        this.scaledDensity = o.scaledDensity;
        this.xdpi = o.xdpi;
        this.ydpi = o.ydpi;
        this.noncompatWidthPixels = o.noncompatWidthPixels;
        this.noncompatHeightPixels = o.noncompatHeightPixels;
        this.noncompatDensity = o.noncompatDensity;
        this.noncompatScaledDensity = o.noncompatScaledDensity;
        this.noncompatXdpi = o.noncompatXdpi;
        this.noncompatYdpi = o.noncompatYdpi;
    }

    public void setToDefaults() {
        this.widthPixels = 0;
        this.heightPixels = 0;
        this.density = (float)DENSITY_DEVICE / 160.0F;
        this.densityDpi = DENSITY_DEVICE;
        this.scaledDensity = this.density;
        this.xdpi = (float)DENSITY_DEVICE;
        this.ydpi = (float)DENSITY_DEVICE;
        this.noncompatWidthPixels = 0;
        this.noncompatHeightPixels = 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值