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);
// 执行你需要的操作
}
});
}
}
三,测试效果:
![]()
浙公网安备 33010602011771号