带有wrap_content的LinearLayout的LayoutTransition

5

我想要动画化一个高度设置为wrap_contentLinearLayout中视图的添加/删除操作。

目前,我已尝试为LinearLayout设置android:animateLayoutChanges="true",并通过编程方式启用过渡效果,如下所示:

LayoutTransition transition = new LayoutTransition();
transition.setDuration(300);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    transition.enableTransitionType(LayoutTransition.APPEARING);
    transition.enableTransitionType(LayoutTransition.DISAPPEARING);
    transition.setAnimateParentHierarchy(true);
}

container.setLayoutTransition(transition); 

出现动画看起来非常流畅,可以按照我的要求进行动画和缩放。
我遇到的问题是在消失时,LinearLayout容器会在移除动画完成之前被调整大小。
我也尝试过使用setAnimateParentHierarchy(),但似乎无法影响容器大小调整的方式和时间。

你解决这个问题了吗? - Quanturium
目前,我还没有找到解决方案。如果我将来再次遇到实现类似功能的情况,并且找到了解决方案,我也会在这里发布。 - Ionut Negru
1个回答

1
一个简单的解决方案是将布局转换设置为第一个祖先,该祖先不使用wrap_content。
以下代码找到正确的祖先,设置所需的动画,并在动画结束时恢复原始LayoutTransition(如果存在)。
在执行添加/删除操作的代码中调用此方法。不需要包含在问题中的任何代码。
注意:此解决方案仅适用于SDK> = JELLY_BEAN。

private static void setHeightChangeAnimation(ViewGroup animatedLayout) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        ViewGroup vg = animatedLayout;
        while (vg instanceof ViewGroup) {
            vg = (ViewGroup) vg.getParent();
            if (vg instanceof ViewGroup  && vg.getLayoutParams().height != LayoutParams.WRAP_CONTENT) {
                LayoutTransition animatedLayoutLt = animatedLayout.getLayoutTransition();
                LayoutTransition lt = new LayoutTransition();
                lt.enableTransitionType(LayoutTransition.CHANGING);
                lt.setDuration(animatedLayoutLt.getDuration(LayoutTransition.CHANGE_APPEARING));
                lt.setStartDelay(LayoutTransition.CHANGING, animatedLayoutLt.getStartDelay(LayoutTransition.APPEARING));

                final ViewGroup finalVg = vg;
                final LayoutTransition oldLt = finalVg.getLayoutTransition();
                lt.addTransitionListener(new LayoutTransition.TransitionListener() {
                    public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {}

                    public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
                        finalVg.setLayoutTransition(oldLt);
                    }
                });
                finalVg.setLayoutTransition(lt);

                break;
            }
        }
    }
}

使用以下代码进行调用:

    setHeightChangeAnimation(yourAnimatedLinearLayout);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接