2011-04-29 59 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