我一直在搜索关于这个主题的线索,我可以在Android 2.2处理AnimationListeners时出现的闪烁中找到,但我无法解决我的问题。
我得到的是一个LinearLayout'popover',用户触摸向下移动大约100个像素,然后再次触摸以将其向上移动。我终于让它在没有任何闪烁的第一部分上工作(感谢建议在动画视图上调用clearAnimation()),但是当做相反的操作(即,将视图移回视图)时,闪烁在开始。我无法在onAnimationStart()方法中调用clearAnimation(),因为它不会动画!
当然,如果我使用setFillAfter()而没有任何动画监听器,所有动画都可以正常工作,但是视图的触摸区域不会移动(因为视图本身没有“实际”移动)。
非常感谢任何帮助。
this.popoverTab.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
popoverTab.setClickable(false);
popoverTab.setFocusable(false);
if (popoverHidden) {
Log.d(TAG, "About to show popover");
// the popover is currently hidden, show it.
TranslateAnimation animation = new TranslateAnimation(0, 0, 100, 0);
animation.setDuration(700);
animation.setFillBefore(true);
animation.setAnimationListener(new AnimationListener() {
public void onAnimationEnd(Animation animation) {
}
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationStart(Animation animation) {
footer.layout(footer.getLeft(), (footer.getTop() - 100), footer.getRight(), footer.getBottom());
}
});
footer.startAnimation(animation);
} else {
Log.d(TAG, "About to hide popover");
// the popover is showing, hide it.
TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 100);
animation.setDuration(700);
animation.setFillAfter(true);
animation.setAnimationListener(new AnimationListener() {
public void onAnimationEnd(Animation animation) {
footer.clearAnimation();
footer.layout(footer.getLeft(), (footer.getTop() + 100), footer.getRight(), footer.getBottom());
}
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationStart(Animation animation) {
}
});
footer.startAnimation(animation);
}
// invert.
popoverHidden = !popoverHidden;
popoverTab.setClickable(true);
popoverTab.setFocusable(true);
}
});
答案 0 :(得分:53)
我遇到了同样的问题,几天后我找到了解决方案......感谢:
http://www.mail-archive.com/android-developers@googlegroups.com/msg67535.html
我找到了解决这个问题的方法。线索来自事实 在显示视图时,一切正常。 显然,当动画运行时,即将进行更新 节目强迫发生在后台并且不会导致 闪烁。添加一个短动画到后端 当我们隐藏视图时,onAnimationEnd()会使闪烁消失 程。
这是工作代码中的新onAndimationEnd()
public void onAnimationEnd(Animation animation) { animation = new TranslateAnimation(0.0f, 0.0f, 0.0f, 0.0f); animation.setDuration(1); mPlayer0Panel.startAnimation(animation); }
答案 1 :(得分:13)
@Override
public void onAnimationEnd(Animation animation)
{
footer.clearAnimation();
}
这对我有用。
答案 2 :(得分:3)
您不必在clearAnimation()
上使用onAnimationEnd()
。
试试这个:
setFillBefore(true)
和setFillAfter(true)
答案 3 :(得分:3)
我搜索了所有stackoverflow帖子的动画问题(闪烁和缓慢)。 我没有找到任何完美的答案。但我找到了相同的解决方案,如下所示,
onStart of Animation use,
view_you_want_to_animate.setDrawingCacheEnabled(true);
on动画使用结束,
view_you_want_to_animate.setDrawingCacheEnabled(false);
现在,当我的视图是动画时,我的视图没有闪烁或缓慢的行为。 它适用于我。
答案 4 :(得分:0)
Alrite,我有同样的问题让我搜索它,我最后在这篇文章中。为我的问题找到了解决方案,想分享我的解决方案。
我有很多动画正在运行,但最近开始闪烁,但当我追踪问题时发现在 for 循环下绘制动画列表后发生了闪烁。 (数组列表)
我只是添加了try catch以避免定位后的问题,问题;一些动画在飞行中被移除但没有足够的时间来更新线程,所以循环仍然尝试并失败但未显示而是闪烁,但在try和catch数组列表绘图修复了我的问题。
答案 5 :(得分:0)
我遇到了同样的错误,但是它只出现在某些视图中,尽管所有实现都相同。事实证明,发生这种情况有两个原因:
android:animateLayoutChanges="true"
因此,有两种解决方案,要么删除android:animateLayoutChanges="true"
标记(建议不要使用它,否则建议使用),或者在有问题的视图周围使用包装器Layout!所以代替:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:animateLayoutChanges="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/btnClose"
android:layout_width="50dp"
android:layout_height="50dp">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="center"
android:src="@drawable/ic_arrow_back" />
</LinearLayout>
...
</RelativeLayout>
,做
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:animateLayoutChanges="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="50dp"
android:layout_height="50dp">
<LinearLayout
android:id="@+id/btnClose"
android:layout_width="50dp"
android:layout_height="50dp">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="center"
android:src="@drawable/ic_arrow_back" />
</LinearLayout>
</LinearLayout>
...
</RelativeLayout>