2016-04-17 16 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); 
       } 
      }); 
     } 
    } 
}); 
相關問題