java - 绘图前调整 View 大小

标签 java android android-view

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

blink for a split second

views are resized in a moment

每个 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/

相关文章:

android - 在 doInBackground 的 AsyncTask 中更改 UI 线程的 View ,并不总是抛出 CalledFromWrongThreadException

java - 在 JavaFX 中逐像素生成图像,进度可见

android - 使用来自 Android 的 SOAP 调用 Magento api 时的 XMLPull 解析器异常

java - raw 无法解析或不是字段

android - 如何在 API 11 以下全屏打开 android 的 webview 上的嵌入式视频?

java - Realm:如何仅查询一对多关系中父亲的对象

android - 自定义 Android View 的自定义类型属性

android - 如何将前景属性设置为其他非 FrameLayout View

java - 您可以通过在后台运行中调用的方法使用发布吗?

Java KeyListener 没有响应