android:动态获取view的宽高

一,两种方式:

ViewTreeObserver.OnGlobalLayoutListener 可以监听视图树的全局布局事件,
当视图树的布局发生变化时会触发回调。通过这种方式可以在视图布局完成后获取其宽高。

View.post 方法可以将一个 Runnable 放入视图的消息队列中,当视图布局完成后执行。

 

二,代码:

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.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.View;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;

import com.example.okdemo1.R;

public class FrameActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);

        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 mask=findViewById(R.id.mask);
        int maskHeight = mask.getHeight();
        Log.d("test","遮罩高度1:"+String.valueOf(maskHeight));

        //调整遮罩层的高度和位置
        mask.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int width = mask.getWidth();
                int height = mask.getHeight();
                Log.d("事件监听", "Width: " + width + ", Height: " + height);

                // 移除监听器以避免内存泄漏
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    mask.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                } else {
                    mask.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                }
            }
        });

        mask.post(new Runnable() {
            @Override
            public void run() {
                // 获取View的宽高
                int width = mask.getWidth();
                int height = mask.getHeight();
                Log.d("Runnable", "Width: " + width + ", Height: " + height);
                // 执行你需要的操作
            }
        });
    }



}

三,测试效果:

 

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