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

这篇具有很好参考价值的文章主要介绍了Android 获取屏幕宽高的正确姿势。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在开发时,我们经常需要根据屏幕的宽高来进行对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怎样正确的获取屏幕的高度 - 简书文章来源地址https://www.toymoban.com/news/detail-505597.html

到了这里,关于Android 获取屏幕宽高的正确姿势的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android获取屏幕分辨率的正确方法;获取到分辨率(垂直方向像素)的不正确

    我通过下面的方法去获取屏幕分辨率的,但获取到的分辨率有时会不准确。原因是此方法有时候会忽略一些布局或控件的高度,从而得不到正确的高度。 而通过另外一个方法则没有上述那种问题,可以获取到正确的屏幕分辨率。

    2024年02月14日
    浏览(57)
  • [unity]如何通过代码获取UI宽高和屏幕宽高

    1.获取UI宽高 首先,使用GetComponentRectTransform().sizeDelta获取,但是这样会有问题,会跟锚点设置有关,改变设置后获取不对 只适用于MiddleCenter 所以又看了API,可以使用GetComponentRectTransform().rect获取 打印如下:  2.获取屏幕宽高 宽度: UnityEngine.Screen.width 高度: UnityEngine.Screen.

    2024年02月17日
    浏览(41)
  • uniapp微信小程序获取屏幕宽高

    uniapp开发微信小程序的时候,有时候去调整样式 你需要适配各种手机屏幕,使用,你的样式宽高就不能使用rpx   有的朋友觉得可以使用vw  vh  %   是的,当然可以 但是要让你的元素,宽高,比如50%再去加上20rpx  怎么做 所以这时候就要去获取不同手机页面屏幕的宽高 如何

    2023年04月09日
    浏览(54)
  • React Native获取手机屏幕宽高(Dimensions)

      参考链接: https://www.reactnative.cn/docs/next/dimensions#%E6%96%B9%E6%B3%95 https://chat.xutongbao.top/

    2024年02月14日
    浏览(46)
  • 小程序获取屏幕宽高wx.getSystemInfoSync().windowWidth

    方式一:getSystemInfo:需要在success方法中取值 方式二:getSystemInfoSync:可以直接\\\".windowWidth\\\"取值 1、官方上规定屏幕宽度为20rem,规定屏幕宽为750rpx,则1rem=750/20rpx。       即:不论哪个型号的手机,屏幕宽度都是750rpx 2、微信小程序rpx,px,rem单位换算规则       屏幕实际宽度

    2024年02月12日
    浏览(39)
  • vue3指导教程(附带获取屏幕可视区域宽高)

            vue3.0 向下兼容 vue2.x 版本,优化了主要核心双向绑定原理和体积大小,并且更加友好的兼容 ts 语法。vue3是基于ES6新增的proxy代理实现的。 1.1 vue3的特点 新增了组合式api 更接近原生js 更加解耦(收到react启发) 按需加载 1.2 与vue2的区别         相同点:生命周

    2024年02月03日
    浏览(42)
  • js和jquery获取屏幕宽高以及加margin和padding等边距的宽高

    Javascript: JQuery div的宽高:

    2024年01月20日
    浏览(42)
  • Android中正确使用Handler的姿势

    在Android中,Handler是一种用于在不同线程之间传递消息和任务的机制。以下是在Android中正确使用Handler的一些姿势: 1. 在主线程中创建Handler对象 在Android中,只有主线程(也称为UI线程)可以更新UI。因此,如果您需要在后台线程中执行某些任务并更新UI,则需要使用Handler将任

    2024年02月11日
    浏览(47)
  • uniapp微信小程序获取屏幕宽高,胶囊按钮的位置以及Vue3.2在css层获取逻辑层的数据

    场景:在开发小程序时需要把使用了固定定位的按钮放在屏幕的中间,考虑了用 vw  vh  % 但是还要减去按钮宽的一半,所以在这里不适用。以下是uniapp中自带的获取屏幕的高宽等数据,我在这里顺便记录一些其他小知识 1.使用uni.getWindowInfo()  uniapp官网介绍: uni.getWindowInfo(

    2024年02月12日
    浏览(65)
  • dialog 设置宽高的四种方式 设置宽高无效问题

    查看布局边界 AS查看进程窗口布局 右下角 Layout Inspector 设定Dialog宽高为何需要在Dialog.show()之后才有效 Dialog源码解析

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包