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);
                }
            }
        });
    }

}

说明:运行结果结果

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

二,测试效果:

 

posted @ 2025-05-10 09:04  刘宏缔的架构森林  阅读(111)  评论(0)    收藏  举报