gpt4 book ai didi

android - 删除 subview 时 LayoutTransition.DISAPPEARING 动画不运行

转载 作者:搜寻专家 更新时间:2023-11-01 07:52:28 26 4
gpt4 key购买 nike

我有一个 FrameLayout 容器,我试图让它的变化动画化。我在 View 上调用了 container.setLayoutTransition(layoutTransition),但是当我稍后调用 container.removeView(v) 时,DISAPPEARING 动画不是执行后, View 会立即被删除。

这是我的转换代码:

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 过渡不是,该 View 会立即被删除。

我发现,如果我从 LayoutTransition.removeChild() 方法中删除 View ,它会起作用,但这会增加很多似乎没有必要的复杂性。这就是它的样子:

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);

觉得这很糟糕?这只是为了一次删除一个 View ,如果容器中有多个 View ,那么我必须添加一个转换监听器来计算执行次数以知道何时删除自己,这简直是一团糟。

移除本身很有趣,因为如果我只是将过渡监听器放在 LayoutTransition 上并且它不会自行移除,那么消失的过渡就不会再次运行。

很明显,我遗漏了一些与执行删除转换有关的内容。任何帮助将不胜感激。

编辑

有人向我指出添加 View 会取消 DISAPPEARING 转换:

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);
}
}
}

这对我来说意义不大。想知道这里的推理是什么。

最佳答案

正如您所注意到的,LayoutTransition 并不像某些较新的 API 那样真正对动画类型进行排序。它旨在一次处理单个项目更改。最干净的代码将来自延迟添加自己的顺序,而不是链接监听器调用:

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+

关于android - 删除 subview 时 LayoutTransition.DISAPPEARING 动画不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32996761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com