Java 在绘制之前调整视图的大小

Java 在绘制之前调整视图的大小,java,android,android-view,Java,Android,Android View,在我的布局中,我有一个包含4个自定义图像视图的GridView。我正在将GridView的可见性设置为不可见,直到所有ImageView最初都调整了大小,但当显示GridView时,ImageView仍保持不变,会出现短暂的闪烁 每个ImageView创建单独的侦听器以缩放其大小: //Setting new params as half of parent's size and increasing counter if (getViewTreeObserver().isAlive(

在我的布局中,我有一个包含4个自定义图像视图的GridView。我正在将GridView的可见性设置为不可见,直到所有ImageView最初都调整了大小,但当显示GridView时,ImageView仍保持不变,会出现短暂的闪烁

每个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;
        }
    });
}
我还尝试在onGlobalLayout方法中调整它们的大小(相同的结果),并覆盖onMeasure方法(此时父视图仍然为空)。

我怀疑在onPreDraw()中更改视图已经太迟了,但是是否有一个方法可以在前面调用,我可以确保所有视图都已测量

尝试在
mAnswerGridView.setVisibility(View.visibility)之前调用
mAnswerGridView.requestLayout()

这可能不起作用,因为正如在

这将安排视图树的布局过程

因此,您最好强制重新播放:

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()); }

尝试在
mAnswerGridView.setVisibility(View.VISIBLE)之前调用
mAnswerGridView.requestLayout()

这可能不起作用,因为正如在

这将安排视图树的布局过程

因此,您最好强制重新播放:

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);
                }
            });
        }
    }
});

我创建了一个处理程序,它在调用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);
                }
            });
        }
    }
});

我尝试过requestLayout和invalidate方法,但没有效果。是的,使用给定的方法完成了任务,尽管我不太明白为什么。requestLayout()不应该同时调用这两个方法(measure和layout)吗?是的,应该调用,但它不会立即调用这两个方法!如果我不想强制重新启动,你知道这样一种机制,在计划的方法完成之前保持设置可见性吗?是的,设置处理程序也会起作用,因为它将被添加到MessageQueue的末尾,所以在所有计划计算完成后运行。我尝试了requestLayout和invalidate方法,但没有效果。是的,使用给定的方法完成了任务,尽管我不太明白为什么。requestLayout()不应该同时调用这两个方法(measure和layout)吗?是的,应该调用,但它不会立即调用这两个方法!如果我不想强制重新启动,您知道这样一种机制在计划方法完成之前保持设置可见性吗?是的,设置处理程序也会起作用,因为它将添加到MessageQueue的末尾,并在所有计划计算完成后运行