簡體   English   中英

在繪制之前調整視圖的大小

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM