安卓的屏幕显示区域划分
安卓的屏幕显示区域分为三个嵌套的部分,依次为 屏幕显示区域
、应用显示区域
、视图显示区域
。
其中,屏幕显示区域
指的是整个屏幕的尺寸。这个尺寸通常是不会变的,且就是手机厂商对外公布的手机屏幕大小数据。它包含状态栏、标题栏和内容区域。
应用显示区域
指的是应用实际显示的面积。它不包含状态栏,但包含标题栏。而且,这个值是会随应用显示的面积的改变而改变的。比如,当文本框需要输入时,如果弹出了输入法,则 应用显示区域
的高度值会减少输入法的高度。
视图显示区域
指的就是内容区域。它不包含状态栏、标题栏。
因此,在没有输入法的正常情况下:屏幕显示区域
> 应用显示区域
> 视图显示区域
。
因为输入法的高度一般大于状态栏,所以在有输入法的情况下:屏幕显示区域
> 视图显示区域
> 应用显示区域
。
下面给出求这几个尺寸的方法。
求屏幕显示区域的大小
方法 1
/**
* 获取屏幕尺寸(包含标题栏、状态栏)
*
* @since 2023-4-11
*/
public static Dimension getScreenSize(Activity activity) {
var view = activity.getWindow().getDecorView();
return new Dimension(view.getWidth(), view.getHeight());
}
方法 2
/**
* 方法 2:获取屏幕尺寸(包含状态栏、标题栏)
*
* @since 2023-4-11
*/
public static Dimension getScreenSize2(Activity activity) {
var disp = activity.getWindowManager().getDefaultDisplay();
var point = new Point();
disp.getSize(point);
return new Dimension(point.x, point.y);
}
求应用显示区域的大小
求输入法键盘的高度
关于这方面的内容,可见笔者的另一篇博客:
安卓中如何获取输入法的高度:
https://blog.csdn.net/wangpaiblog/article/details/130479682
求应用显示区域的大小
/**
* 获取应用尺寸(包含标题栏,但不包含状态栏)
*
* 如果遇到输入法键盘弹出的情况,此方法的返回值会减去输入法键盘的高度
*
* @param needConsiderKeyboard 为 true,则认为应用的真实尺寸应减少输入法键盘的高度。
* 为 false,则认为真实尺寸为输入法键盘出现之前的高度
* @param keyboardHeight 输入法键盘的高度。
* 此值只有 needConsiderKeyboard 为 true 时才有效。
* 如果界面中没有出现输入法键盘,此值为 0
* @since 2023-4-11
*/
public static Dimension getApplicationSize(
Activity activity, boolean needConsiderKeyboard, int keyboardHeight) {
var rect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
if (needConsiderKeyboard) {
return new Dimension(rect.width(), rect.height());
} else {
return new Dimension(rect.width(), rect.height() + keyboardHeight);
}
}
求视图显示区域的大小
/**
* 获取视图尺寸(不包含状态栏、标题栏)
*
* @since 2023-4-11
*/
public static Dimension getViewSize(Activity activity) {
var rect = new Rect();
activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rect);
return new Dimension(rect.width(), rect.height());
}
求状态栏显示区域的大小
/**
* 获取状态栏尺寸
*
* @since 2023-4-11
*/
public static Dimension getStatusBarSize(Activity activity, int keyboardHeight) {
return Dimension.subtract(
getScreenSize(activity),
getApplicationSize(activity, false, keyboardHeight));
}
求标题栏显示区域的大小
/**
* 获取标题栏尺寸
*
* @since 2023-4-11
*/
public static Dimension getTitleBarSize(Activity activity, int keyboardHeight) {
return Dimension.subtract(
getApplicationSize(activity, false, keyboardHeight),
getViewSize(activity));
}