2016-04-17 18 views
0

在我的布局中,我有一个包含4个自定义ImageView的GridView。我将GridView的可见性设置为不可见,直到所有ImageViews首先被调整大小,但是当显示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方法(父视图在t时仍然为空他的观点)。
我怀疑在onPreDraw()中更改视图为时已晚,但是有没有一种方法可以在之前调用,我可以确定所有视图都已经过测量?

回答

1

尝试调用mAnswerGridView.requestLayout()mAnswerGridView.setVisibility(View.VISIBLE);

,因为它是在Android Developers

这将时间表表示认为树的布局传递这可能不是因为工作。

所以,你可以更好地强制重新布局:

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

我试过requestLayout和invalidate方法,但没有任何效果。 – tomwyr

+0

耶,使用给定的方法做了这项工作,虽然我不明白为什么。不应该requestLayout()调用这两个方法(度量和布局)以及? – tomwyr

+0

是的,它应该,但它不立即调用该方法 – John

1

我创建了一个处理程序,日程安排调用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); 
       } 
      }); 
     } 
    } 
}); 
相关问题