Android动画闪烁

时间:2012-02-22 00:57:37

标签: android android-animation

我一直在搜索关于这个主题的线索,我可以在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);
    }

});

6 个答案:

答案 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()

试试这个:

  1. 两个动画上使用setFillBefore(true)setFillAfter(true)
  2. 在开始时和结束两者动画
  3. 时设置正确的布局属性

答案 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)

我遇到了同样的错误,但是它只出现在某些视图中,尽管所有实现都相同。事实证明,发生这种情况有两个原因:

  • 当我在根xml元素中使用android:animateLayoutChanges="true"
  • 当有问题的视图直接连接到根xml元素时

因此,有两种解决方案,要么删除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>