gpt4 book ai didi

android - 在 FrameLayout 中快速切换和动画 View 会弄乱 View

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

我有一个关于 Android 动画的非常奇怪的问题,我尝试了很多不同的方法和组件,但仍然找不到任何解释。

我有一个 FrameLayout,它是 View 的容器,还有一个 Button

这个 FrameLayout 应该一次只显示 一个 View ,当我点击 Button 时,我希望 FrameLayout 显示另一个 View ,并在从 FrameLayout 中移除的 View 开始动画

这里的特殊性是我只使用了两个 View ,我想在这两个 View 之间切换。

问题:

当我非常快速地多次单击按钮,然后停止单击时,两个 View 同时显示一个在另一个之上,并且不会消失。容器仍然只包含一个 View ......绝对奇怪!

error screenshot http://i.minus.com/jDXyvUsE1LCOx.png

我可以用一个简单的例子重现这个:

public class TestAnimActivity extends Activity implements OnClickListener {

private FrameLayout container;

private TextView current;
private TextView next;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

current = new TextView(this);
current.setText("View 1 YEAH");
next = new TextView(this);
next.setText(" View 2 DOH");

container = (FrameLayout) findViewById(R.id.container);
container.addView(current);

findViewById(R.id.button).setOnClickListener(this);
}

public void onClick(View v) {
Animation outAnimation = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
current.startAnimation(outAnimation);
container.addView(next);
container.removeView(current);

TextView temp = current;
current = next;
next = temp;
}
}

如您所见,动画正在 View 上启动,而之前的动画仍在运行,而我这样做的方式可能是问题的根源。

如果我评论动画相关的代码,它会完美地工作:

// Animation outAnimation = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
// current.startAnimation(outAnimation);

如果我停止重用 View 并改为创建新 View ,它也可以完美运行:

// next = temp;
next = new TextView(this);
next.setText("View: " + new Random().nextInt());

但我不想创建新 View :-)。

问题似乎与在从其父级添加/删除此 View 时在 View 上多次启动动画有关。

我首先尝试使用 ViewFlipper,然后是 ViewAnimator,然后查找 Android 源代码并最终手动执行此操作以重现问题。

如果你希望布局能够自己测试,这里是我的ma​​in.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<FrameLayout
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />

<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Click me fast" />

</LinearLayout>

感谢您的宝贵时间!

最佳答案

我终于找到了解决问题的方法。

当我们从一个 ViewGroup 中移除一个 View 时,如果这个 View 上有动画在运行,它会自动添加到该 ViewGroup 的“消失的 child ”列表中。

当我们尝试向 ViewGroup 添加一个已从中删除但仍在其消失的子项中的 View 时,问题似乎出现了。

有一种简单的方法可以解决这个问题:viewGroup.clearDisappearingChildren();

这里是 onClick() 方法的新实现:

public void onClick(View v) {

next.clearAnimation();
container.clearDisappearingChildren();

Animation outAnimation = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
current.startAnimation(outAnimation);
container.addView(next);
container.removeView(current);

TextView temp = current;
current = next;
next = temp;
}

关于android - 在 FrameLayout 中快速切换和动画 View 会弄乱 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8658568/

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