繁体   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