在FrameLayout中快速切换和动画视图会使视图变得混乱

Pie*_*cau 2 android view android-animation

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

我有一个FrameLayout,它是视图的容器,还有一个Button.

FrameLayout应该一次只显示一个视图,当我单击Button时,我希望FrameLayout 显示另一个视图,并在从FrameLayout中删除视图启动动画.

这里的特殊性是我只使用两个视图,我想在这两个视图之间切换.

问题:

当我快速点击按钮多次,然后停止点击时,两个视图同时显示在另一个上面,并且不会消失.容器仍然只包含一个视图......绝对奇怪!

错误截图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;
}
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,动画正在视图中启动,而之前的动画仍然在运行,而我这样做的方式可能会成为问题的根源.

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

// Animation outAnimation = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
// current.startAnimation(outAnimation);
Run Code Online (Sandbox Code Playgroud)

如果我停止重复使用视图并创建新视图,它也可以完美地运行:

// next = temp;
next = new TextView(this);
next.setText("View: " + new Random().nextInt());
Run Code Online (Sandbox Code Playgroud)

但我不想创建新的观点:-).

似乎问题与在视图中添加/删除此视图时在视图上多次启动动画有关.

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

如果您希望布局能够自己测试,这是我的main.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>
Run Code Online (Sandbox Code Playgroud)

感谢您的时间!

Pie*_*cau 5

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

当我们从ViewGroup中删除视图时,如果在此视图上运行动画,它将自动添加到ViewGroup的"消失的子项"列表中.

当我们尝试向ViewGroup添加一个已从其中删除但仍在其消失的子节点中的视图时,似乎出现了这个问题.

有一种简单的方法可以解决这个问题: 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;
}
Run Code Online (Sandbox Code Playgroud)