Android 获取屏幕宽高的正确姿势

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更效! 阅读详情

前言

在开发时,我们经常需要根据屏幕的宽高来进行对view的适配,无论是自定义view还是andorid自带的一些控件,比如说需要占当前屏幕高度的30%,就需要获取到屏幕的宽高,但在获取宽高时我遇到了一些坑,总结如下

获取高度

下面两种方法都是安卓自带方法可以获取到屏幕宽高的

但是!

这两种方法获取的高度都是省略了手机最上方系统状态栏的高度

系统方法

int screenHeight = Resources.getSystem().getDisplayMetrics().heightPixels;//屏幕高度
int screenWidth = Resources.getSystem().getDisplayMetrics().widthPixels;//屏幕宽度

WindowManager

/**
 * 屏幕高度
 * @return the height of screen, in pixel
 */
public static int getScreenHeight(Context context) {
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Point point = new Point();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        //noinspection ConstantConditions
        wm.getDefaultDisplay().getRealSize(point);
    } else {
        //noinspection ConstantConditions
        wm.getDefaultDisplay().getSize(point);
    }
    return point.y;
}

/**
 * 屏幕宽度
 * @return the width of screen, in pixel
 */
public static int getScreenWidth(Context context) {
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Point point = new Point();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        //noinspection ConstantConditions
        wm.getDefaultDisplay().getRealSize(point);
    } else {
        //noinspection ConstantConditions
        wm.getDefaultDisplay().getSize(point);
    }
    return point.x;
}

根据屏幕判断,获取完整的屏幕宽高

这种方法可以获取到完整的屏幕高度

/***
 * 获取屏幕的高度,全面屏和非全面屏
 * @param context
 * @return
 */
public static int getFullActivityHeight(@Nullable Context context) {
    if (!isAllScreenDevice()) {
        return getScreenHeight(context);
    }
    return getScreenRealHeight(context);
}

private static final int PORTRAIT = 0;
private static final int LANDSCAPE = 1;
private volatile static boolean mHasCheckAllScreen;
private volatile static boolean mIsAllScreenDevice;

@NonNull
private volatile static Point[] mRealSizes = new Point[2];

public static int getScreenRealHeight(@Nullable Context context) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
        return getScreenHeight(context);
    }

    int orientation = context != null
            ? context.getResources().getConfiguration().orientation
            : getApplicationContext().getResources().getConfiguration().orientation;
    orientation = orientation == Configuration.ORIENTATION_PORTRAIT ? PORTRAIT : LANDSCAPE;

    if (mRealSizes[orientation] == null) {
        WindowManager windowManager = context != null
                ? (WindowManager) context.getSystemService(Context.WINDOW_SERVICE)
                : (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        if (windowManager == null) {
            return getScreenHeight(context);
        }
        Display display = windowManager.getDefaultDisplay();
        Point point = new Point();
        display.getRealSize(point);
        mRealSizes[orientation] = point;
    }
    return mRealSizes[orientation].y;
}

public static int getScreenHeight(@Nullable Context context) {
    if (context != null) {
        return context.getResources().getDisplayMetrics().heightPixels;
    }
    return 0;
}

/***
 * 获取当前手机是否是全面屏
 * @return
 */

public static boolean isAllScreenDevice() {
    if (mHasCheckAllScreen) {
        return mIsAllScreenDevice;
    }
    mHasCheckAllScreen = true;
    mIsAllScreenDevice = false;
    // API小于21时,没有全面屏
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        return false;
    }
    WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    if (windowManager != null) {
        Display display = windowManager.getDefaultDisplay();
        Point point = new Point();
        display.getRealSize(point);
        float width, height;
        if (point.x < point.y) {
            width = point.x;
            height = point.y;
        } else {
            width = point.y;
            height = point.x;
        }
        if (height / width >= 1.97f) {
            mIsAllScreenDevice = true;
        }
    }
    return mIsAllScreenDevice;
}

参考博客:Android怎样正确的获取屏幕的高度 - 简书

Android完美获取状态栏高度、标题栏高度、编辑区域高度获取 简单说明一下(上图Activity采用默认Style,状态栏标题栏都会显示):最大的草绿色区域是屏幕界面,红色次大区域我们称之为“应用界面区域”,最小紫色的区域我们称之为“View绘制区域”;屏幕顶端、应用界面区之外的那部分显示手机电池网络运营商信息的为“状态栏”,应用区域顶端、View绘制区外部显示Activity名称的部分我们称为“标题栏”。二、状态高度的测量。 阅读详情

相关推荐

Android屏幕适配3-动态获取屏幕及动态设置控件

1、问题 在屏幕适配中,要求应用在不同的屏幕上显示一样的效果时,我们的布局可以采用百分比来定位,也就是 layout_weight,但对于一些层层嵌套或更加复杂的情况下,使用百分比的效果并不是很好,页无法解决一些问题,比如文字大小。 2、解决思路 我们可以根据屏幕大小重新对布局以及布局内的对象大小进行调整。原理类似于我们用播放器看视频的时候,无论怎么调整窗口大小,播放器都可以自动调整视频...

moduzhang的博客 3347

Android获取屏幕大小的两种方法

使用DisplayMetrics类WindowManager类,我们可以轻松地获取屏幕的尺寸信息,并根据需要进行屏幕适配或布局调整。在Android开发中,有时我们需要获取设备屏幕的大小信息,以便针对不同屏幕尺寸进行适配或布局调整。本文将介绍两种常用的方法来获取Android设备屏幕的大小,供开发者参考。除了使用DisplayMetrics类,我们还可以使用WindowManager类来获取屏幕大小。Android提供了DisplayMetrics类,可以用于获取屏幕的尺寸信息。来获取屏幕宽度高度

TechPulseZ的博客 2356

Android获取手机屏幕宽度高度(单位为像素)

方法一: //方法一:应用程序显示区域指定可能包含应用程序窗口的显示部分,不包括系统装饰 Display display = getWindowManager().getDefaultDisplay(); Point point = new Point(); display.getSize(point); int width = display.getWidth(); int height = display.getHeight();

路宇的博客 1万+

Android 开发中获取屏幕(分辨率)的几种方式

【代码】Android 开发中获取屏幕(分辨率)的几种方式。

大雪冬至的博客 6618

Android获取屏幕宽度的4种方法

方法1: WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); int width = wm.getDefaultDisplay().getWidth(); int height = wm.getDefaultDisplay().getHeight(); 方法2: Windo

luodiqingkaiji2010的专栏 862

Android view】Android获取屏幕设备正确姿势

                                                        Android获取设备屏幕的2种方法1、private void Method1() { Resources resources = this.getResources(); DisplayMetrics dm = resources.getDisplayMe...

sinat_34153600的博客 496

Android 获取屏幕

最近开发项目需要动态适配大图片的布局,需要获取屏幕来比例适配,看了许多大牛的博客,自己整理下获取屏幕的几种方式。屏幕分两种: 应用屏幕:不包括了状态栏(刘海屏,水滴屏等),导航栏等系统装饰UI所占用的空间 实际屏幕:包括了状态栏(刘海屏,水滴屏等),导航栏等系统装饰UI所占用的空间 获取屏幕离不开:Display 、DisPlayMetrics Display Provides information about the size and density of a logical di

weidiezeng的博客 2万+

获取屏幕

// 获取屏幕(方法1)   int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕(像素,如:480px)   int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); // 屏幕(像素,如:800p)  

isMeLook的博客 1814

Android 获取手机屏幕的真实可用

不知道你们遇没遇到过h5页面加载全屏网络图片屏幕下面有白边的bug,之所以会这样是因为H5获取屏幕值是可用值(不包括底部虚拟导航栏),而不是真实的屏幕(包括底部虚拟导航栏)。话不多说,直接上代码,就是干!!! import android.content.Context; import android.graphics.Point; import android.os.Buil...

yonbor605的博客 2586

Android开发中获取屏幕的几种方法

Android开发过程中经常会遇到获取手机屏幕的需求,下面就获取屏幕的方法总结如下:        方法1:利用WindowManager获取 int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕(像素,如:720px) int screenHeight = getWindowMana

愚睿^_^的专栏 5781

Android获取屏幕,状态栏,actionbar,layout,导航栏高度的方法汇总

看这个博客你可以知道 获取屏幕,状态栏,actionbar,layout,导航栏(虚拟按键栏)高度的方法   目录顺序为 代码测试的机型 状态栏高度 actionbar高度 屏幕高度 导航栏(虚拟按键栏)高度 layout 总结   代码测试的机型:小米8青春版 这里我们用的是小米8青春版手机测试(刘海屏) 小米8青春版屏幕px为1080*2280,...

yh18668197127的博客 3263

android 获取控件的,android获取屏幕获取控件 步骤总结

android获取屏幕获取控件 方法总结获取屏幕 获取空间的 在开发的时候经常用到,刚开始做开发的时候 总是 复制粘贴 不知道 所以然 ,今天 彻底的 总结一下 获取的 用法先讲一下原理 在最后贴出代码之一直接使用。1. 获取屏幕。首先要只一个 函数就是WindowManager他的api是这样说的android.view接口 WindowManager所有...

weixin_42588672的博客 924

Android获取屏幕

一、 前言 android 4.4(sdk 19)之后,获取屏幕高度需要考虑底部导航栏等decor。网上很多方案是没有考虑这一点的,因此获取到的屏幕高度小于实际高度,误导开发者。 二、 错误方案 列举几种常见的获取出来高度可能小于实际高度的方案: 1. DisplayMetrics dm = getApplicationContext().getResources().getDisp...

进击的小宇宙 6562

android 获取屏幕

今天在整理工程: 发现项目中有两种获取屏幕的方法: 一、通过WindowManager获取Display,通过display获取Metrics,通过Metrics获取。最后的单位是px。 public static final int getScreenWidth() { Context context = XManager.getManager().getApplication(

Spartacus0830的专栏 1337

Android屏幕硬件当前View显示区域的,Kotlin

Android测量View的一般通用方法众所周知Android在onCreate里面如果直接对一个View进行getWidth,getHeight时候,得到到的值全部是0,这样拿不到View的的值,但有时候又必须在初始化阶段获取一个View的,现在给出一个基本的通用方法: int w = View.MeasureSpec.makeMeasureSpec(0, Vie_安卓获取view的Android测量View的一般通用方法_安卓获取view的-CSDN博客。

Zhang Phil 1432

Android学习笔记之屏幕、状态栏、标题以及left()、top()、right()、bottom()

Android学习笔记之屏幕、状态栏、标题以及left()、top()、right()、bottom()前言:  想学号安卓,这几个方法及属性你不得不学会怎么获取,当你学会了如何获取屏幕、状态栏、标题栏以及子控件与父控件的left()、top()、right()、bottom()等,这会对你学习自定义控件会有很大的帮助,我之前做自定义的时候有时候也很难弄清他们之间的区别,今天

GodV的博客 4106

android获取屏幕像素密度DPI、density、屏幕

获取手机屏幕像素密度 dpi DisplayMetrics metrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); metrics.density; 3.5 metrics.densityDpi; 560 Android获取屏幕的...

wusejiege6的博客 5258

android 获得组件高度,android获取屏幕获取控件(三种方法)

android获取屏幕获取控件(三种方法)发布时间:2020-09-03 21:53:49来源:脚本之家阅读:313作者:ganchuanpu1.获取屏幕方法1:int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕(像素,如:480px)int screenHeight = getWin...

weixin_30063287的博客 1486
上一篇: Android 给一个view添加一个边框
下一篇: 搜索引擎搜索特定网站的方法 :site
TDSSS
博客等级 码龄6年 71粉丝 55原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TDSSS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值