我有几个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();
但是在滚动过程中它们出现在屏幕上之前它们仍然不会被绘制(这通常很好,但是动画会让它......呃,不是很好)
答案 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”只是一个阈值,我知道填充的视图永远不会小于。你的情况可能会有所不同。)