package com.yongdaimi.android.androidapitest;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.Rect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.Window;
import android.view.WindowManager; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testCode();
} @Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.i("xp.chen", "getContentViewHeight(): "+getContentViewHeight(MainActivity.this));
Log.i("xp.chen", "getStatusBarHeight2(): "+getStatusBarHeight2(this));
} private void testCode() {
Log.i("xp.chen", "getResources().getDisplayMetrics():: widthPixels: "+getScreenWidth(this));
Log.i("xp.chen", "getResources().getDisplayMetrics():: heightPixels: "+getScreenHeight(this));
Log.i("xp.chen", "WindowManager:: widthPixels: "+getScreenWidth2(this));
Log.i("xp.chen", "WindowManager:: heightPixels: "+getScreenHeight2(this));
Log.i("xp.chen", "WindowManager getRealSize() :: widthPixels: "+getScreenWidth3(this));
Log.i("xp.chen", "WindowManager getRealSize() :: heightPixels: "+getScreenHeight3(this));
Log.i("xp.chen", "getResources() navigation_bar_height: "+getNavigationBarHeight(this));
Log.i("xp.chen", "getResources() getStatusBarHeight: "+getStatusBarHeight(this));
} public static int getScreenWidth(Context context) {
return context.getResources().getDisplayMetrics().widthPixels;
} /**
* 不包含虚拟导航栏高度
* @param context
* @return
*/
public static int getScreenHeight(Context context) {
return context.getResources().getDisplayMetrics().heightPixels;
} public static int getScreenWidth2(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
} public static int getScreenHeight2(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
return dm.heightPixels;
} /**
* 包含虚拟导航栏高度
* @param context
* @return
*/
public static int getScreenWidth3(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display defaultDisplay = windowManager.getDefaultDisplay();
Point outPoint = new Point();
defaultDisplay.getRealSize(outPoint);
return outPoint.x;
} public static int getScreenHeight3(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display defaultDisplay = windowManager.getDefaultDisplay();
Point outPoint = new Point();
defaultDisplay.getRealSize(outPoint);
return outPoint.y;
} public static int getNavigationBarHeight(Context context) {
int navigationBarHeight = -1;
Resources resources = context.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height","dimen", "android");
if (resourceId > 0) {
navigationBarHeight = resources.getDimensionPixelSize(resourceId);
}
return navigationBarHeight;
} public int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
} /**
* 注意:这个方法的值必须等到页面创建完成后才能获取到。推荐写在onWindowFocusChanged()方法中
* @param activity
* @return
*/
public int getStatusBarHeight2(Activity activity) {
Rect rectangle = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);
return rectangle.top;
} /**
* 注意:这个方法的值必须等到页面创建完成后才能获取到。推荐写在onWindowFocusChanged()方法中
* @param activity
* @return
*/
public static int getContentViewHeight(Activity activity) {
Rect rectangle= new Rect();
activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rectangle);
return rectangle.height();
} /**
* 可以利用getScreenHeight() 与 getScreenHeight3() 返回值的差异来判断是否存在虚拟导航栏
* @param context
* @return
*/
public static boolean hasNavigationBar(Context context) {
return getScreenHeight(context) != getScreenHeight3(context);
} }

测试结果:

【三星S6 无虚拟导航栏】

2019-05-07 15:58:08.157 11483-11483/com.yongdaimi.android.androidapitest I/xp.chen: getResources().getDisplayMetrics():: widthPixels: 1440
2019-05-07 15:58:08.157 11483-11483/com.yongdaimi.android.androidapitest I/xp.chen: getResources().getDisplayMetrics():: heightPixels: 2560
2019-05-07 15:58:08.157 11483-11483/com.yongdaimi.android.androidapitest I/xp.chen: WindowManager:: widthPixels: 1440
2019-05-07 15:58:08.158 11483-11483/com.yongdaimi.android.androidapitest I/xp.chen: WindowManager:: heightPixels: 2560
2019-05-07 15:58:08.158 11483-11483/com.yongdaimi.android.androidapitest I/xp.chen: WindowManager getRealSize() :: widthPixels: 1440
2019-05-07 15:58:08.158 11483-11483/com.yongdaimi.android.androidapitest I/xp.chen: WindowManager getRealSize() :: heightPixels: 2560
2019-05-07 15:58:08.159 11483-11483/com.yongdaimi.android.androidapitest I/xp.chen: getResources() navigation_bar_height: 192
2019-05-07 15:58:08.159 11483-11483/com.yongdaimi.android.androidapitest I/xp.chen: getResources() getStatusBarHeight: 96
2019-05-07 15:58:08.224 11483-11483/com.yongdaimi.android.androidapitest I/xp.chen: getContentViewHeight(): 2240
2019-05-07 15:58:08.225 11483-11483/com.yongdaimi.android.androidapitest I/xp.chen: getStatusBarHeight2(): 96

【Google Nexus6 带虚拟导航栏】

2019-05-07 15:59:02.894 30818-30818/com.yongdaimi.android.androidapitest I/xp.chen: getResources().getDisplayMetrics():: widthPixels: 1440
2019-05-07 15:59:02.894 30818-30818/com.yongdaimi.android.androidapitest I/xp.chen: getResources().getDisplayMetrics():: heightPixels: 2392
2019-05-07 15:59:02.895 30818-30818/com.yongdaimi.android.androidapitest I/xp.chen: WindowManager:: widthPixels: 1440
2019-05-07 15:59:02.895 30818-30818/com.yongdaimi.android.androidapitest I/xp.chen: WindowManager:: heightPixels: 2392
2019-05-07 15:59:02.895 30818-30818/com.yongdaimi.android.androidapitest I/xp.chen: WindowManager getRealSize() :: widthPixels: 1440
2019-05-07 15:59:02.896 30818-30818/com.yongdaimi.android.androidapitest I/xp.chen: WindowManager getRealSize() :: heightPixels: 2560
2019-05-07 15:59:02.896 30818-30818/com.yongdaimi.android.androidapitest I/xp.chen: getResources() navigation_bar_height: 168
2019-05-07 15:59:02.896 30818-30818/com.yongdaimi.android.androidapitest I/xp.chen: getResources() getStatusBarHeight: 84
2019-05-07 15:59:02.967 30818-30818/com.yongdaimi.android.androidapitest I/xp.chen: getContentViewHeight(): 2112
2019-05-07 15:59:02.968 30818-30818/com.yongdaimi.android.androidapitest I/xp.chen: getStatusBarHeight2(): 84

参考链接:

1.Android屏幕各尺寸获取

android: 获取屏幕高度和虚拟导航栏高度的几种方法的更多相关文章

  1. Android 获取屏幕高度,宽度,状态栏高度

    背景介绍: 到目前为止,android已经从1.5发展到目前的3.2,我们在写一个应用的时候,最常用到得就是获取屏幕高度,宽度,以及status bar的高度. 然而android系统变化太快了,从开 ...

  2. iOS 更改状态栏、导航栏颜色的几种方法

    ios上状态栏 就是指的最上面的20像素高的部分状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分:背景部分:就是显示黑色或者图片的背景部分: (一)设置sta ...

  3. NavUtils【底部虚拟导航栏工具类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 获取底部虚拟导航栏的高度值 效果图 代码分析 checkDeviceHasNavigationBar(Context context ...

  4. Android获取屏幕高度、标题高度、状态栏高度详解

    Android获取屏幕高度的方法主要由view提供 通过View提供的方法获取高度方式有两种: 1, 当前显示的view中直接获取当前view高宽2,通过Activity的getWindow().fi ...

  5. 获取Android屏幕尺寸、控件尺寸、状态栏/通知栏高度、导航栏高度

    1.获取Android屏幕尺寸 我们能够通过getSize()方法获得屏幕的尺寸 Display display = getWindowManager().getDefaultDisplay(); P ...

  6. android 自己定义状态栏和导航栏分析与实现

    效果 android 4.4之后,系统是支持自己定义状态栏和导航栏的.举个最典型的样例就是bilibiliclient了(iOS版本号和android版本号能用两套全然不一样符合各自系统的设计ui,良 ...

  7. Android 8.1 SystemUI虚拟导航键加载流程解析

    需求 基于MTK 8.1平台定制导航栏部分,在左边增加音量减,右边增加音量加 思路 需求开始做之前,一定要研读SystemUI Navigation模块的代码流程!!!不要直接去网上copy别人改的需 ...

  8. 获取不同机型微信小程序状态栏+导航栏高度

    获取不同机型微信小程序状态栏+导航栏高度 一. 前言 很多时候我们开发微信小程序,都需要先知道状态栏和导航栏的高度,才能去做其他功能 二. 获取微信小程序状态栏高度 用wx.getSystemInfo ...

  9. CSS实现导航条Tab的三种方法

    前面的话   导航条Tab在页面中非常常见,本文说详细介绍CSS实现导航条Tab的三种方法 布局   根据上图所示,先规定几个定义,上图的模块整体叫做导航,由导航标题和导航内容组成.要实现上图所示的布 ...

随机推荐

  1. [转载]关于linux下system()函数的总结

    1.曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.这里必须要搞懂system()函数,因为有时你不得不面对它. 2.先来看一下system()函数的简 ...

  2. maven打包指定main函数的入口,生成依赖的包

    为了使Jar包中指定Main方法位置和生成依赖包,需要在pom文件中加入如下配置: <build> <plugins> <plugin> <groupId&g ...

  3. canvas渐变

    代码: 1 /** 2 * Created by Administrator on 2016/1/29. 3 */ 4 function draw(id){ 5 var canvas = docume ...

  4. Java-API-Package:org.springframework.beans.factory.annotation

    ylbtech-Java-API-Package:org.springframework.beans.factory.annotation 1.返回顶部 1. @NonNullApi @NonNull ...

  5. Oracle 文件

    参数文件 跟踪文件 告警文件 数据文件 临时文件 控制文件 重做日志文件 密码文件 闪回日志 dum文件 数据泵文件 1参数文件 Parameter file:告诉oracle实例在那里可以找到控制文 ...

  6. 用Unreal Engine绘制实时CG影像

    转自:http://www.unrealchina.net/portal.php?mod=view&aid=225 近年来,对实时CG的关心热度越来越高,但要想弥补与预渲染方式的差异并不是那么 ...

  7. 用nfs挂载内核时出错 ERROR: Cannot umount的解决办法

    SMDK2440 # nfs 30000000 192.168.1.106:/work/nfs_root/uImage                         ERROR: resetting ...

  8. SqlServer——事务一进阶之锁的概念(SqlServer技术内幕 T-SQL程序设计 第九章)

         一.事务的概念及ACID特性 对于单独一条SQL语句,数据库会隐式的将其作为事务,即该SQL语句要么执行成功,要么失败(相当于不执行),而我们通常说的事务就是将多条SQL语句放在 begin ...

  9. 探究QA职能

    测试人员一般是被外界普遍认为是QC,即对产品的质量进行检测,找出质量问题并配合相关人员解决问题,从而管控产品质量,说通俗点就是帮开发找漏洞,给开发擦屁股:如果线上出现bug,就是你没有测试完整,最累的 ...

  10. [Python Study Notes]pynput实现对键盘控制与监控

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...