我有一个自定义视图,绘制一个可滚动的位图到屏幕。为了初始化它,我需要传入父布局对象的像素大小。但是在onCreate和onResume函数期间,布局还没有绘制,因此Layout . getmeasuredheight()返回0。
作为一种变通方法,我添加了一个处理程序来等待一秒钟,然后进行测量。这是工作,但它草率,我不知道多少我可以修剪的时间之前,我结束之前的布局得到绘制。
我想知道的是,我如何检测当一个布局被绘制?是否有事件或回调?
我有一个自定义视图,绘制一个可滚动的位图到屏幕。为了初始化它,我需要传入父布局对象的像素大小。但是在onCreate和onResume函数期间,布局还没有绘制,因此Layout . getmeasuredheight()返回0。
作为一种变通方法,我添加了一个处理程序来等待一秒钟,然后进行测量。这是工作,但它草率,我不知道多少我可以修剪的时间之前,我结束之前的布局得到绘制。
我想知道的是,我如何检测当一个布局被绘制?是否有事件或回调?
当前回答
我创建静态变量来检查布局是否已经绘制。如果它已经创建,你可以简单地调用绘制的函数。
static int firstAccess = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main8);
if (firstAccess==0) {
LAYOUT_YOU_DRAW.post(new Runnable() {
@Override
public void run() {
creatSpread();
firstAccess = 1;
}
});
}else{
creatSpread();
}
}
其他回答
如果您正在使用kotlin,我建议您使用doOnLayout
doOnLayout {
doWhateverYouNeed()
}
道格: 在布局此视图时执行给定的操作
另一个答案是: 试着检查onWindowFocusChanged上的视图维度。
最优雅的方法是使用OneShotPreDrawListener。OneShotPreDrawListener将注册一个回调函数,在视图树即将被绘制时调用,并且它将在一次OnPreDraw调用后删除自己。
OneShotPreDrawListener.add(view) {
view.doSomething();
}
要避免弃用代码和警告,您可以使用:
view.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@SuppressWarnings("deprecation")
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.getViewTreeObserver()
.removeOnGlobalLayoutListener(this);
} else {
view.getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
}
yourFunctionHere();
}
});
我创建静态变量来检查布局是否已经绘制。如果它已经创建,你可以简单地调用绘制的函数。
static int firstAccess = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main8);
if (firstAccess==0) {
LAYOUT_YOU_DRAW.post(new Runnable() {
@Override
public void run() {
creatSpread();
firstAccess = 1;
}
});
}else{
creatSpread();
}
}