2011-04-29 73 views
1

我有幾個LinearLayouts在ScrollView中被下載的圖像或文本填充。 LinearLayouts有一個適用於它們的LayoutAnimation,所以每一個在繪製時都會「滑入」到位。有沒有辦法強制屏幕外的LinearLayouts進行繪製,以便在用戶滾動到它們時,動畫已經完成?我已經試過測量像這樣每個視圖:(容器是一個ViewGroup)如何強制ViewGroup畫出屏幕?

int measuredWidth = View.MeasureSpec.makeMeasureSpec(LayoutParams.FILL_PARENT, View.MeasureSpec.AT_MOST); 
int measuredHeight = View.MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, View.MeasureSpec.UNSPECIFIED); 
container.measure(measuredWidth, measuredHeight); 
container.layout(0, 0, container.getMeasuredWidth(), container.getMeasuredHeight()); 
container.requestLayout(); 

但是他們仍然不會畫,直到他們滾動(這通常是好的,但在動畫使得它在顯示在屏幕上。呃,不好)

回答

0

對於任何未來的讀者,這是我落得這樣做:我的子類的LinearLayout和推翻onLayout僅如果佈局目前是在屏幕上它填充了矩賦予動畫:

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) 
{ 
    super.onLayout(changed, left, top, right, bottom); 

    // only animate if viewgroup is currently on screen 
    int[] xy = new int[2]; 
    this.getLocationOnScreen(xy); 
    int yPos = xy[1]; 

    if (yPos < availableScreenHeight && bottom > 200) 
    { 
     Animation slide_down = AnimationUtils.loadAnimation(getContext(), R.anim.container_slide_down); 
     LayoutAnimationController controller = new LayoutAnimationController(slide_down, 0.25f); 
     this.setLayoutAnimation(controller); 
    } 
} 

這實際上節省了一些週期,因爲我沒有全面應用動畫,然後從不需要它的視圖中刪除它。 (順便說一句,「availableScreenHeight」就是這樣,而「200」只是一個門檻,我知道一個填充視圖將永遠不會小於)你的情況可能會有所不同。)

1

如果你不想運行動畫,你爲什麼不簡單地刪除動畫?該框架將應用動畫,因爲你告訴它。

另請注意,您的任何代碼都不會導致重繪。要繪製你需要調用invalidate()或draw()。

+0

我希望動畫在視圖組上顯示填充下載的數據。這意味着如果當時在屏幕上,您會看到動畫。如果當時不在屏幕上,則不會。此外,視圖組可以以任何順序,所以我不能假定某個視圖組會在任何給定時間處於屏幕上或屏幕外。我認爲最簡單的方法就是強制他們在下載完成時畫圖,不管他們在哪裏。至於第二部分 - 我嘗試了container.invalidate(),但沒有運氣。我不能使用draw(),因爲我沒有可以引用的畫布,只是viewgroups。 – wirbly 2011-04-29 02:10:05

+0

只需在動畫結束時刪除動畫。 – 2011-04-29 04:27:46

+0

但是Android不會在屏幕上開始動畫(在我的例子中是滾動到視圖中),所以等到它結束爲時已經太晚了,因爲它已經被用戶看到了。動畫不會在屏幕外發生。 – wirbly 2011-04-29 13:43:28