[英]Resizing Views before drawing
在我的布局中,我有一個包含4個自定義ImageView的GridView。 我將GridView的可見性設置為不可見,直到首先調整所有ImageView的大小,但是當顯示GridView時,ImageViews仍然短暫閃爍。
每個ImageView都會創建單獨的偵聽器以縮放其大小:
//Setting new params as half of parent's size and increasing counter
if (getViewTreeObserver().isAlive()) {
final ViewTreeObserver viewTreeObserver = getViewTreeObserver();
viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
getViewTreeObserver().removeOnPreDrawListener(this);
View parent = (View) getParent();
int dimension = Math.min(parent.getWidth(), parent.getHeight()) / 2;
mThisImageView.setLayoutParams(new AbsListView.LayoutParams(dimension, dimension));
ResizeCounter.setCounter(ResizeCounter.getCounter() + 1);
return true;
}
});
}
//Activity listens to the moment when all ImageViews have been resized
ResizeCounter.addCounterListener(new OnResizeCounterChangeListener() {
@Override
public void onResizeCounterChanged() {
if (ResizeCounter.getCounter() == 4) {
mAnswerGridView.setVisibility(View.VISIBLE);
}
}
});
我還嘗試過在onGlobalLayout方法中調整它們的大小(相同的結果)並覆蓋onMeasure方法(此時,父視圖仍然為null)。
我懷疑在onPreDraw()中更改視圖為時已晚,但是是否可以在內部調用更早的方法來確定所有視圖是否已被測量?
嘗試在mAnswerGridView.setVisibility(View.VISIBLE);
之前調用mAnswerGridView.requestLayout()
mAnswerGridView.setVisibility(View.VISIBLE);
這可能不起作用,因為正如Android開發人員所述
這將安排視圖樹的布局遍歷。
因此,您最好強制重新布局:
relayoutChildren(View view) {
view.measure(
View.MeasureSpec.makeMeasureSpec(view.getMeasuredWidth(), View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(view.getMeasuredHeight(), View.MeasureSpec.EXACTLY));
view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); }
我創建了一個處理程序,可以在調用requestLayout之后立即安排設置可見性。
在這種情況下效果很好。
ResizeCounter.addCounterListener(new OnResizeCounterChangeListener() {
@Override
public void onResizeCounterChanged() {
if (ResizeCounter.getCounter() == 4) {
mAnswerGridView.requestLayout();
Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
mAnswerGridView.setVisibility(View.VISIBLE);
}
});
}
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.