android: 得到状态栏和导航样的高度
一,代码:
package com.example.okdemo1.activity;
import static android.app.PendingIntent.getActivity;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.Bundle;
import android.transition.Transition;
import android.transition.TransitionInflater;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.WindowInsetsControllerCompat;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowInsetsController;
import android.view.WindowManager;
import android.widget.Toast;
import com.example.okdemo1.R;
public class FrameActivity extends AppCompatActivity {
private View pushView;
private int deOptions; //系统可见性的选项
private View decorView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
decorView = getWindow().getDecorView();
deOptions = decorView.getSystemUiVisibility();
setContentView(R.layout.activity_frame);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
View decorView = getWindow().getDecorView();
WindowInsets insets = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
insets = this.getWindowManager().getCurrentWindowMetrics().getWindowInsets();
int statusBarHeight = insets.getInsets(WindowInsetsCompat.Type.statusBars()).top; //in pixels
Log.d("test","状态栏高度:"+String.valueOf(statusBarHeight));
int navBarHeight = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom; //in pixels
Log.d("test","导航栏高度:"+String.valueOf(navBarHeight));
} else {
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
int statusBarHeight = getResources().getDimensionPixelSize(resourceId);
Log.d("test","状态栏高度:"+String.valueOf(statusBarHeight));
}
resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
int navBarHeight = getResources().getDimensionPixelSize(resourceId);
Log.d("test","导航栏高度:"+String.valueOf(navBarHeight));
}
}
//在代码中得到屏幕高度
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int width = displayMetrics.widthPixels;
int height = displayMetrics.heightPixels;
Log.d("test","屏幕高度:"+String.valueOf(height));
//得到遮罩层的高度
View mask=findViewById(R.id.mask);
//得到遮罩层的高度
mask.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int width = mask.getWidth();
int height = mask.getHeight();
Log.d("事件监听", "遮罩:Width: " + width + ", Height: " + height);
// 获取根View及其布局参数
int rootHeight = decorView.getHeight();
Log.d("事件监听", "根视图: height: " + rootHeight);
// 移除监听器以避免内存泄漏
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mask.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
mask.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
}
}
说明:运行结果结果

内容视图(这里是遮罩)高度+状态栏+导航栏 = 根视图
内容视图高度+状态栏 = 屏幕高度
所以这里的屏幕高度不包括导航栏高度
二,测试效果:

浙公网安备 33010602011771号