我有一个FrameLayout容器,我正在尝试设置它的更改动画。我在视图上调用container.setLayoutTransition(layoutTransition),但当我稍后调用container.removeView(v)时,DISAPPEARING动画不会执行,视图只会立即删除。这是我的转换代码:LayoutTransition layoutTransition = new LayoutTransition();layoutTransition.setAnimator(LayoutTransition.APPEARING, ObjectAnimator.ofFloat(null, View.TRANSLATION_Y, toolHeight, 0f));layoutTransition.setStartDelay(LayoutTransition.APPEARING, 0);layoutTransition.setDuration(LayoutTransition.APPEARING, 1000);layoutTransition.setAnimator(LayoutTransition.DISAPPEARING, ObjectAnimator.ofFloat(null, View.TRANSLATION_Y, 0f, toolHeight));layoutTransition.setStartDelay(LayoutTransition.DISAPPEARING, 0);layoutTransition.setDuration(LayoutTransition.DISAPPEARING, 1000);container.setLayoutTransition(layoutTransition);要交换视图,请执行以下操作:if (container.getChildCount() > 0) { for (int i = container.getChildCount() - 1; i >= 0; i--) { container.removeViewAt(i); }}container.addView(newView);我已经放慢了动画的速度来确认情况,我可以清楚地看到APPEARING转换是正确执行的,但是DISAPPEARING转换不是,视图只是被立即删除。我发现,如果我从 >方法中删除视图,它会起作用,但这会增加相当多的复杂性,而这似乎并不必要。接下来是:if (container.getChildCount() > 0) { final View v = container.getChildAt(0); container.getLayoutTransition().removeChild(container, v); container.getLayoutTransition().addTransitionListener(new LayoutTransition.TransitionListener() { @Override public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) { } @Override public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) { transition.removeTransitionListener(this); if (transitionType == LayoutTransition.DISAPPEARING) { container.removeView(view); } } }}container.addView(newView);你觉得那不好吗?这只是一次删除一个视图,如果容器中有多个视图,那么我必须添加一个转换监听器,该监听器对执行次数进行计数,以知道何时删除自己,这简直是一团糟。删除本身很有趣,因为如果我简单地将转换监听器放在LayoutTransition.removeChild()上,它不会删除自身,那么消失的转换就不会再次运行。显然,我遗漏了一些与执行remove转换有关的内容。任何帮助都将不胜感激。编辑有人向我指出,添加视图会取消LayoutTransition转换:public class ViewGroup { private void addViewInner(...) { if (mTransition != null) { // Don't prevent other add transitions from completing, but cancel remove // transitions to let them complete the process before we add to the container mTransition.cancel(LayoutTransition.DISAPPEARING); } }}这对我来说没什么意义。不知道这里的理由是什么。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 正如您所注意到的,LayoutTransition并不像一些较新的api那样对动画类型进行排序。它的设计是一次处理一个项目的变化。最干净的代码将来自用延迟对add yourself进行排序,而不是链接侦听器调用:if (container.getChildCount() > 0) { for (int i = container.getChildCount() - 1; i >= 0; i--) { container.removeViewAt(i); } //Start the add once removals are complete long duration = container.getLayoutTransition().getDuration(LayoutTransition.DISAPPEARING); container.postOnAnimationDelayed(new Runnable(){ @Override public void run() { container.addView(newView); } }, duration);} else { container.addView(newView);}对于这样的事情,您可以从Scenes中获得更好的编排,但这是api 19+ (adsbygoogle = window.adsbygoogle || []).push({});
10-07 20:06