如何强制ViewGroup绘制屏幕?

时间:2011-04-29 01:03:39

标签: android

我有几个LinearLayouts可以在ScrollView中填充下载的图像或文本。 LinearLayouts应用了LayoutAnimation,因此每个人在绘制时都会“滑动”到位。有没有办法强制屏幕外的LinearLayouts绘制,以便当用户滚动到它们时,动画已经完成?我尝试过测量每个视图:(容器是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();

但是在滚动过程中它们出现在屏幕上之前它们仍然不会被绘制(这通常很好,但是动画会让它......呃,不是很好)

2 个答案:

答案 0 :(得分:1)

如果您不想运行动画,为什么不简单地删除动画?框架将应用动画,因为你告诉它。

另请注意,您的代码都不会导致重绘。要绘制你需要调用invalidate()或draw()。

答案 1 :(得分: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);
    }
}

这实际上节省了一些周期,因为我没有全面应用动画,然后将其从不需要它的视图中删除。 (BTW“availableScreenHeight”就是这样,而“200”只是一个阈值,我知道填充的视图永远不会小于。你的情况可能会有所不同。)