【问题标题】:LayoutTransition for LinearLayout with wrap_content带有 wrap_content 的 LinearLayout 的 LayoutTransition
【发布时间】:2016-04-08 10:32:33
【问题描述】:

我正在尝试为高度设置为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); 

Appearing 似乎工作得非常顺利,它可以根据我的需要设置动画和调整大小。

我遇到的问题是随着 LinearLayout 容器在移除动画完成之前调整大小而消失。

我也尝试过使用setAnimateParentHierarchy(),但它似乎并没有真正影响调整容器大小的方式和时间。

【问题讨论】:

  • 你找到解决办法了吗?
  • 目前,我没有找到解决方案。如果我发现自己能够再次实施类似的事情并找到解决方案,我也会在这里发布。

标签: android android-animation android-linearlayout layouttransition


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    相关资源
    最近更新 更多