android: 获取屏幕高度和虚拟导航栏高度的几种方法
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
参考链接:
android: 获取屏幕高度和虚拟导航栏高度的几种方法的更多相关文章
- Android 获取屏幕高度,宽度,状态栏高度
背景介绍: 到目前为止,android已经从1.5发展到目前的3.2,我们在写一个应用的时候,最常用到得就是获取屏幕高度,宽度,以及status bar的高度. 然而android系统变化太快了,从开 ...
- iOS 更改状态栏、导航栏颜色的几种方法
ios上状态栏 就是指的最上面的20像素高的部分状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分:背景部分:就是显示黑色或者图片的背景部分: (一)设置sta ...
- NavUtils【底部虚拟导航栏工具类】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 获取底部虚拟导航栏的高度值 效果图 代码分析 checkDeviceHasNavigationBar(Context context ...
- Android获取屏幕高度、标题高度、状态栏高度详解
Android获取屏幕高度的方法主要由view提供 通过View提供的方法获取高度方式有两种: 1, 当前显示的view中直接获取当前view高宽2,通过Activity的getWindow().fi ...
- 获取Android屏幕尺寸、控件尺寸、状态栏/通知栏高度、导航栏高度
1.获取Android屏幕尺寸 我们能够通过getSize()方法获得屏幕的尺寸 Display display = getWindowManager().getDefaultDisplay(); P ...
- android 自己定义状态栏和导航栏分析与实现
效果 android 4.4之后,系统是支持自己定义状态栏和导航栏的.举个最典型的样例就是bilibiliclient了(iOS版本号和android版本号能用两套全然不一样符合各自系统的设计ui,良 ...
- Android 8.1 SystemUI虚拟导航键加载流程解析
需求 基于MTK 8.1平台定制导航栏部分,在左边增加音量减,右边增加音量加 思路 需求开始做之前,一定要研读SystemUI Navigation模块的代码流程!!!不要直接去网上copy别人改的需 ...
- 获取不同机型微信小程序状态栏+导航栏高度
获取不同机型微信小程序状态栏+导航栏高度 一. 前言 很多时候我们开发微信小程序,都需要先知道状态栏和导航栏的高度,才能去做其他功能 二. 获取微信小程序状态栏高度 用wx.getSystemInfo ...
- CSS实现导航条Tab的三种方法
前面的话 导航条Tab在页面中非常常见,本文说详细介绍CSS实现导航条Tab的三种方法 布局 根据上图所示,先规定几个定义,上图的模块整体叫做导航,由导航标题和导航内容组成.要实现上图所示的布 ...
随机推荐
- [转] linux 启动文件及设置环境变量
系统级启动文件 ==================================== 1./etc/rc 主启动文件,不要修改它 2./etc/rc.conf 决定启动哪些系统自带的守护进程 ...
- Shell脚本把文件从GBK转为UTF-8编码
http://www.jb51.net/article/51308.htm 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...
- 开发环境入门 linux基础 (部分)while for 函数 计划任务
while循环 while do 动作 done 需要无限循环时我们会选择while : echo -e 格式处理,将\n的意义不变. exit 指退出执行程序 break 指跳出本层循环 conti ...
- c#学习之路---壁咚漏洞搜索
每次出漏洞都会用JAVA去写,不过JAVA你懂得,写GUI每次画图很吃力. 于是左右学习了下c#,期间也得到表哥storm7kb的帮助,要不然这个表格与数据绑定不知道c#怎么弄. 上一下图吧: --- ...
- windows黑科技-记录dns log
昨天看到袁哥微博,看到了这篇,今天测试了一下,记录下来: The DNS Client service does not log by default. However, if a file name ...
- Python命令模块argparse学习笔记(二)
argparse模块可以设置两种命令参数,一个是位置参数,一个是命令参数 位置参数 import argparse parser = argparse.ArgumentParser(descripti ...
- 跨resetlogs不完全恢复- oracle自动reset错误incarnation
在做oracle跨resetlogs的不完全恢复时,如果未删除flashback area的控制文件自动备份,那么Oracle可能会从控制文件自动备份中自动探测到incarnation信息,并重置in ...
- MySQL 删除字段数据某关键字后的所有数据
),'开发商') WHERE Compay LIKE '%开发商%'; sql附上
- Python之tuple的创建以及使用
tuple又是一种有序列表,它与list只有两种不同:1.创建后不能更改.2.创建时得用() 在使用tuple的时候我们需要进行那个添加一个“,” 如果不加的话就是一个整数. 但是tuple作为一个不 ...
- spring分模块开发