等待其他视图动画结束

12

我有以下的布局片段:

    <LinearLayout
        android:id="@+id/tagContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true" >

    </LinearLayout>

    <TextView
        android:id="@+id/commentLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tagContainer" />

如您所见,animateLayoutChangesLinearLayout 上设置为 true,因此当添加项目时,它会动画显示添加效果。这很好,但在删除项目时存在问题。如果我删除一个项目,动画仍然正常播放,但下面的 TextView 会立即弹出,而不是等待动画完成。我该如何实现这一点,甚至更好的是,使 TextView 动画上升与 LinearLayout 动画同步进行?


你能展示一下动画代码以及如何将动画添加到视图中吗?必须有动画监听器或布局转换监听器,它们具有通知您动画结束、期间和结束时的事件。 - Nikola Despotoski
完全没有动画代码。如果您指定了此属性,框架将为项目添加/删除添加默认的淡入淡出动画。 - WonderCsabo
2个回答

25
您可以通过以下方式从视图中检索LayoutTransition:setLayoutTransition(android.animation.LayoutTransition)
mLinearLayout = findViewById(R.id.myLayout);
LayoutTransition layoutTransition = mLinearLayout.getLayoutTransition();
layoutTransition.addTransitionListener(new TransitionListener(){

            @Override
            public void endTransition(LayoutTransition arg0, ViewGroup arg1,
                    View arg2, int arg3) {
                switch(arg2.getId()){
                                //....
                                }
            }

            @Override
            public void startTransition(LayoutTransition transition,
                    ViewGroup container, View view, int transitionType) {
                switch(view.getId()){
                                //....
                                }

            }});

谢谢!我该如何告诉TextView保持在原位并向上移动?(我知道我必须在这些回调函数中完成此操作,但我不知道如何做到这一点。) - WonderCsabo
使用回调参数,您可以区分过渡类型。int transitionType表示这些过渡(请参阅过渡类型的文档),您需要实现自己的逻辑,例如:if(view.getView() == R.id.myView && transitionType==LayoutTransition.DISAPPEARING){ //add/remove the TextView }首先,在回调中记录事件的顺序和参数,并查看它们如何被调用,然后尝试使用您的视图。 :) - Nikola Despotoski
有没有办法获取转换的进度? - android developer

2

这不是一个答案,而是一个现成的代码片段,您可以尝试使用它来查看发生了什么。

mContainer = (ViewGroup) v.findViewById(R.id.container);
if (Build.VERSION.SDK_INT >= 11) {
    mLayoutTransition = mContainer.getLayoutTransition();

    if (mLayoutTransition != null) {
        mLayoutTransition.addTransitionListener(new LayoutTransition.TransitionListener() {

            @Override
            public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
                Log.d("\n\n startTransition: in "+container+" view "+view+" type "+ descr(transitionType));
            }

            @Override
            public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
                Log.d("\n\n endTransition: in "+container+" view "+view+" type "+ descr(transitionType));
            }

            String descr(int transitionType) {
                String[] m = new String[]{"CHANGE_APPEARING","CHANGE_DISAPPEARING","APPEARING","DISAPPEARING"};
                return "" + transitionType + ": " + m[transitionType&3] + " changing="+( transitionType&LayoutTransition.CHANGING);
            }
        });
    }
}

对我来说,容器视图是一个 LinearLayout,我们需要关注的事件是:

public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) { // UI thread
    if (transitionType == LayoutTransition.DISAPPEARING) {
        // start 2nd animation, it will be done while another view is moved
    }
}

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