实际上,根据场景,有多种解决方案:
- 安全的方法是在布局阶段结束后,在绘制视图之前使用:
public static void runJustBeforeBeingDrawn(final View view, final Runnable runnable) {
final OnPreDrawListener preDrawListener = new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
view.getViewTreeObserver().removeOnPreDrawListener(this);
runnable.run();
return true;
}
};
view.getViewTreeObserver().addOnPreDrawListener(preDrawListener);
}
使用示例:
ViewUtil.runJustBeforeBeingDrawn(yourView, new Runnable() {
@Override
public void run() {
//Here you can safely get the view size (use "getWidth" and "getHeight"), and do whatever you wish with it
}
});
在某些情况下,手动测量视图的大小就足够了:
view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
int width=view.getMeasuredWidth();
int height=view.getMeasuredHeight();
如果您知道容器的大小:
val widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(maxWidth, View.MeasureSpec.AT_MOST)
val heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(maxHeight, View.MeasureSpec.AT_MOST)
view.measure(widthMeasureSpec, heightMeasureSpec)
val width=view.measuredWidth
val height=view.measuredHeight
- 如果你有一个扩展过的自定义视图,你可以在 "onMeasure" 方法中获取其大小,但我认为它只在某些情况下有效:
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
final int newHeight= MeasureSpec.getSize(heightMeasureSpec);
final int newWidth= MeasureSpec.getSize(widthMeasureSpec);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
If you write in Kotlin, you can use the next function, which behind the scenes works exactly like runJustBeforeBeingDrawn
that I've written:
view.doOnPreDraw { actionToBeTriggered() }
请注意,您需要将以下内容添加到gradle中(通过此处找到):
android {
kotlinOptions {
jvmTarget = "1.8"
}
}
implementation 'androidx.core:core-ktx:#.#'
match_parent
)。在这种情况下,一个更简单的解决方案甚至可以在View被绘制之前安全地调用(例如,在Activity的onCreate()方法中),只需使用Display.getSize()即可;有关详细信息,请参见https://dev59.com/tYzda4cB1Zd3GeqPiiM1#30929599。我知道这不是@NikReiman所要求的,但我留下一条注释给那些可能能够使用这种更简单方法的人。 - CODE-REaD