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)
感谢您的时间!
我终于找到了解决问题的方法.
当我们从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)
| 归档时间: |
|
| 查看次数: |
3852 次 |
| 最近记录: |