1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > android获取导航栏宽高 Android获取屏幕的宽高度 状态栏 标题栏 导航栏 编辑区域高度...

android获取导航栏宽高 Android获取屏幕的宽高度 状态栏 标题栏 导航栏 编辑区域高度...

时间:2021-06-17 01:13:41

相关推荐

android获取导航栏宽高 Android获取屏幕的宽高度 状态栏 标题栏 导航栏 编辑区域高度...

目录

0、相关文章:

1、获取屏幕款高度

代码:

/**

* 获取屏幕宽度

*

* @param context 上下文对象

* @return int

*/

public static int getScreenWidth(Context context) {

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

DisplayMetrics dm = new DisplayMetrics();

wm.getDefaultDisplay().getMetrics(dm);

return dm.widthPixels;

}

/**

* 获取屏幕高度

*

* @param context 上下文对象

* @return int

*/

public static int getScreenHeight(Context context) {

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

DisplayMetrics dm = new DisplayMetrics();

wm.getDefaultDisplay().getMetrics(dm);

return dm.heightPixels;

}

2、获取状态栏高度

状态栏是显示显示手机状态(如电池电量、网络状态、时间、运营商信息等)的区域,一般内容型应用都会显示保留状态栏,但是游戏界面如果还保留状态栏就不合适了,因为游戏界面要响应各种手势,而状态栏也会响应一些手势,有可能引发错误操作,所以一般在游戏界面都会隐藏状态栏,使游戏界面全屏显示,关于设置全屏请查看《Android设置Activity全屏的两种方式及Theme属性解析》,继续看状态栏高度测量:

状态栏高度的测量我在这里提供4种方法:

2.1、通过系统尺寸资源获取

状态栏高度定义在Android系统尺寸资源中status_bar_height,但这并不是公开可直接使用的,例如像通常使用系统资源那样android.R.dimen.status_bar_height。但是系统给我们提供了一个Resource类,通过这个类可以获取资源文件,借此可以获取到status_bar_height

/**

* 获取状态栏高度——方法1

* */

int statusBarHeight1 = -1;

//获取status_bar_height资源的ID

int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");

if (resourceId > 0) {

//根据资源ID获取响应的尺寸值

statusBarHeight1 = getResources().getDimensionPixelSize(resourceId);

}

Log.e("-------", "状态栏-方法1:" + statusBarHeight1)

2.2、通过R类的反射

大家都知道Android的所有资源都会有惟一标识在R类中作为引用。我们也可以通过反射获取R类的实例域,然后找status_bar_height

/**

* 获取状态栏高度——方法2

* */

int statusBarHeight2 = -1;

try {

Class> clazz = Class.forName("com.android.internal.R$dimen");

Object object = clazz.newInstance();

int height = Integer.parseInt(clazz.getField("status_bar_height")

.get(object).toString());

statusBarHeight2 = getResources().getDimensionPixelSize(height);

} catch (Exception e) {

e.printStackTrace();

}

Log.e("-------", "状态栏-方法2:" + statusBarHeight2);

2.3、借助应用区域的top属性

这就用到了开题时的那张屏幕区域划分图片,状态栏位于屏幕最顶端,其位置从(0,0)开始,故而应用区域的顶端位置(高度 = Y坐标 - 0)即为状态栏的高度

/**

* 获取状态栏高度——方法3

* 应用区的顶端位置即状态栏的高度

* *注意*该方法不能在初始化的时候用

* */

Rect rectangle= new Rect();

getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);

//高度为rectangle.top-0仍为rectangle.top

Log.e("-------", "状态栏-方法3:" + rectangle.top);

*注意*如果单单获取statusBar高度而不获取titleBar高度时,这种方法并不推荐大家使用,因为这种方法依赖于WMS(窗口管理服务的回调)。正是因为窗口回调机制,所以在Activity初始化时执行此方法得到的高度是0,这就是很多人获取到statusBar高度为0的原因。这个方法推荐在回调方法onWindowFocusChanged()中执行,才能得到预期结果。

2.4、借助屏幕和应用区域高度

还是看屏幕区域划分图,是不是状态栏占满了屏幕中除应用区域之外的全部呢?所以直接上代码

/**

* 获取状态栏高度——方法4

* 状态栏高度 = 屏幕高度 - 应用区高度

* *注意*该方法不能在初始化的时候用

* */

//屏幕

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

//应用区域

Rect outRect1 = new Rect();

getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);

int statusBar = dm.heightPixels - outRect1.height(); //状态栏高度=屏幕高度-应用区域高度

Log.e("------------", "状态栏-方法4:" + statusBar);

3、4这两种方法其实本质是一样,所以如果单单获取statusBar高度而不获取titleBar高度时也不推荐大家使用,理由同上方法3

3、获取标题栏高度

搞懂了上边的原理,标题栏高度的测量也就手到擒来啦,依旧是屏幕区域划分图。这里也给出两种方法,先给出公共代码吧,就是获取各区域(*注意*依旧是在Activity的回调方法onWindowFocusChanged()中执行,才能得到预期结果)

//屏幕

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

Log.e("-------", "屏幕高:" + dm.heightPixels);

//应用区域

Rect outRect1 = new Rect();

getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);

Log.e("------", "应用区顶部" + outRect1.top);

Log.e("-------", "应用区高" + outRect1.height());

//View绘制区域

Rect outRect2 = new Rect();

getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect2);

Log.e("--------", "View绘制区域顶部-错误方法:" + outRect2.top); //不能像上边一样由outRect2.top获取,这种方式获得的top是0,可能是bug吧

int viewTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); //要用这种方法

Log.e("--------", "View绘制区域顶部-正确方法:" + viewTop);

Log.e("--------", "View绘制区域高度:" + outRect2.height());

有时候获取View绘制区时列出来的那个outRect2.top=0

3.1、top-top

/**

* 获取标题栏高度-方法1

* 标题栏高度 = View绘制区顶端位置 - 应用区顶端位置(也可以是状态栏高度,获取状态栏高度方法3中说过了)

* */

int titleHeight1 = viewTop - outRect1.top;

Log.e("--------", "标题栏高度-方法1:" + titleHeight1);

3.2、高度-高度

/**

* 获取标题栏高度-方法2

* 标题栏高度 = 应用区高度 - View绘制区高度

* */

int titleHeight2 = outRect1.height() - outRect2.height();

Log.e("----------", "标题栏高度-方法2:" + titleHeight2);

4、获取导航栏高度

在Android4.0 (API Level 14)及更高版本中,System Bar由Status Bar(位于顶部)和Navigation Bar(位于底部)组成。

public int getNavigationBarHeight() {

Resources resources = mActivity.getResources();

int resourceId=resources.getIdentifier("navigation_bar_height","dimen","android");

int height = resources.getDimensionPixelSize(resourceId);

Log.v("navigation bar>>>", "height:" + height);

return height;

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。