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的三种方法 布局 根据上图所示,先规定几个定义,上图的模块整体叫做导航,由导航标题和导航内容组成.要实现上图所示的布 ...
随机推荐
- Azure上Linux VM误配防火墙的恢复方法
在实际运维中,防火墙把自己挡在机器外面的情况会时有发生.如何快速的恢复对运维人员是很重要的. 本文将介绍如何用Azure Extension实现不通过ssh对VM进行操作的方法. 之前写过一遍Blog ...
- MYSQL BENCHMARK()函数
MySQL有一个内置的BENCHMARK()函数,可以测试某些特定操作的执行速度. BENCHMARK(count,expr) BENCHMARK会重复计算expr表达式count次,通过这种方式就可 ...
- ZOJ 4016 Mergeable Stack(栈的数组实现)
Mergeable Stack Time Limit: 2 Seconds Memory Limit: 65536 KB Given initially empty stacks, the ...
- Rails的静态资源管理(四)—— 生产环境的 Asset Pipeline
官方文档:http://guides.ruby-china.org/asset_pipeline.html http://guides.rubyonrails.org/asset_pipeline.h ...
- Rails、Nginx、Passenger、bundle之间的协作关系
引自:http://www.zhihu.com/question/20062163 Bundle是Gem包的依赖管理工具,RubyGem本身有依赖管理为何还要Bundle呢?有时候两个gem虽然都依赖 ...
- oracle sql 函数
(7)查询日期之间的数据 例如查询student表中出生日期(birthday)在’2016-01-01’ 和’2017-01-01’之间的数据: select * from student wher ...
- Arduino Uno 在win7 64位下的驱动问题
1.解压[mdmcpq.inf_amd64_neutral_fbc4a14a6a13d0c8.rar],将[mdmcpq.inf_amd64_neutral_fbc4a14a6a13d0c8]文件夹复 ...
- 第4章 ZK基本特性与基于Linux的ZK客户端命令行学习 4-1 zookeeper常用命令行操作
ls path [watch] watch是一个监督者.quota是zookeeper的子目录.目录就是节点的意思,对于zookeeper来说它是以一个节点来说的,所以说/就是根节点,zookeepe ...
- [转]怎么学习前端,尤其是 JavaScript 这块
1. 先看看 w3school ,了解什么是 js,再找几本写 js 小效果的书看看,知道 js 干什么: 2. 然后再去通读 API,推荐 <Javascript权威指南>,第四版吧,第 ...
- parseXXX的用法
转换字符串. parseXXX是Integer类.等基本数据类型包装类的方法,用于实现String和int型数据的转换.例如, Integer.getInteger(String s) 从字符串中获取 ...