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的三种方法 布局 根据上图所示,先规定几个定义,上图的模块整体叫做导航,由导航标题和导航内容组成.要实现上图所示的布 ...
随机推荐
- 使用HibernateTemplate手写源生SQL的【增删改查】 操作
使用 HibernateTemplate 进行持久化操作 执行的时候不报错,但数据库的持久化操作没有一点作用,问了好多人,说没有声明事务和提交事务, 用的是别人搭的的架构,事务已经有了,自动提交事务的 ...
- AD的差分输入与单端输入
AD的差分输入与单端输入 单端输入,输入信号均以共同的地线为基准.这种输入方法主要应用于输入信号电压较高(高于1V),信号源到模拟输入硬件的导线较短(低于15 ft,1ft=304.8mm),且所有的 ...
- (转)C#特性详解
本文转载自:http://www.cnblogs.com/rohelm/archive/2012/04/19/2456088.html 特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集.类 ...
- AngularJS:SQL
ylbtech-AngularJS:SQL 1.返回顶部 1. AngularJS SQL 在前面章节中的代码也可以用于读取数据库中的数据. 使用 PHP 从 MySQL 中获取数据 AngularJ ...
- leetcode482
这道题主要使用了C++的几个API,大小写转化,字符串替换.其余的逻辑都比较简单.而且经查资料,string类字符串拼接的速度使用+=的速度是很快的.以下代码,也是用的+=来拼接字符串. string ...
- openGL一些概念02
着色器程序 着色器程序对象(Shader Program Object)是多个着色器合并之后并最终链接完成的版本. 如果要使用刚才编译的着色器我们必须把他们链接为一个着色器程序对象,然后在渲染对象的时 ...
- windows安装和配置JDK
安装完JDK后配置环境变量 计算机→属性→高级系统设置→高级→环境变量 系统变量→新建 JAVA_HOME 变量 . 变量值填写jdk的安装目录(本人是 E:\Java\jdk1.7.0) ...
- 昨天的笔试题, StringBuffer
代码: public static void switchStr(StringBuffer x, StringBuffer y) { x.append(y); System.out.println(& ...
- checked多选,取消,反选
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Winform状态栏控件中Label靠右显示的方法
设计器: 代码: 在Form_Load事件中添加 : statusStripMain.LayoutStyle= ToolStripLayoutStyle.HorizontalStackWithOv ...