在我的布局中,我有一个包含 4 个自定义 ImageView 的 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;
}
});
}
//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 方法(此时父 View 仍然为空)。
我怀疑现在更改 onPreDraw() 中的 View 为时已晚,但是是否有一种可以提前调用的方法,在该方法中我可以确定所有 View 都已被测量?
最佳答案
尝试在 mAswerGridView.setVisibility(View.VISIBLE);
之前调用 mAswerGridView.requestLayout()
这可能不起作用,因为正如 Android Developers 中所述。
This will schedule a layout pass of the view tree.
所以你最好强制重新布局:
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()); }
关于java - 绘图前调整 View 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36675339/