动画在Android结束后如何删除动画视图?

时间:2013-10-30 11:46:06

标签: android android-animation

我正在为RelativeLayout使用右移动动画。

我尝试在onAnimationEnd()中为“布局”设置“可见性”为“GONE”,但它无效。动画视图仍然停留在它停止的位置。

这是我使用的代码:

从右到左创建动画:

TranslateAnimation animate = new TranslateAnimation(0,-rlImages.getWidth()/2,0,0);
animate.setDuration(1000);
animate.setFillAfter(true); 

将动画设置为布局:

centre_leftanimate.startAnimation(animate);

为动画添加侦听器:

animate.setAnimationListener(new AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        // TODO Auto-generated method stub
        centre_leftanimate.setVisibility(View.GONE);   // I wants to make the visibility of view to gone,but this is not working                                                         
        half_left.setVisibility(View.VISIBLE);
    }
});

如何在动画结束后使动画视图的可见性不可见?

请建议。

6 个答案:

答案 0 :(得分:19)

我遇到了同样的问题,除了我实际删除了动画视图,但动画仍然存在!

简单的解决方案是实际取消动画,然后您可以隐藏或删除视图。

animatedView.getAnimation().cancel();

或者如果你还有动画对象:

animation.cancel();

编辑:上面的解决方案似乎还剩下一些,所以我补充说:

animatedView.setAnimation(null);

答案 1 :(得分:2)

我有同样的问题,在我的情况下删除

android:fillAfter="true"

在负责删除视图的动画中,这段代码解决了我的问题。但其他人会有更好的代码。

viewToHide.startAnimation(animationForHide);
viewToHide.setVisibility(View.GONE);

答案 2 :(得分:1)

您可以根据需要设置视图的可见性。 如果在动画开始后立即将其设置为View.INVISIBLE,则动画将可见,并且动画停止后视图将立即消失。 我认为您的代码的问题可能是您正在使用GONE而不是INVISIBLE。 第二个问题可能是您在设置侦听器之前启动动画,但使用我的解决方案您实际上不需要任何侦听器。 另外,拿走FillAfter选项。

 TranslateAnimation animate = new TranslateAnimation(0,-rlImages.getWidth()/2,0,0);
 animate.setDuration(1000);
 centre_leftanimate.startAnimation(animate);
 centre_leftanimate.setVisibility(View.INVISIBLE);

答案 3 :(得分:1)

我知道这是一个老问题,但我今天遇到了这个问题,我想表明我是如何解决它的,因为尽管已经发布的答案有帮助,但没有一个能完全适用于我的案例。

在我的情况下,我创建了一个自定义视图,应用了2个动画(alpha和翻译),并在动画完成后删除了视图。我就这样做了:

//Create fade out animation
AlphaAnimation fadeOut = new AlphaAnimation(1f, 0f);
fadeOut.setDuration(1000);
fadeOut.setFillAfter(true);
//Create move up animation
TranslateAnimation moveUp = new TranslateAnimation(0, 0, 0, -getHeight() / 6);
moveUp.setDuration(1000);
moveUp.setFillAfter(true);
//Merge both animations into an animation set
AnimationSet animations = new AnimationSet(false);
animations.addAnimation(fadeOut);
animations.addAnimation(moveUp);
animations.setDuration(1000);
animations.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) { }
        @Override
        public void onAnimationEnd(Animation animation) {
            //Hide the view after the animation is done to prevent it to show before it is removed from the parent view
            view.setVisibility(View.GONE);
            //Create handler on the current thread (UI thread)
            Handler h = new Handler();
            //Run a runnable after 100ms (after that time it is safe to remove the view)
            h.postDelayed(new Runnable() {
                @Override
                public void run() {
                    removeView(view);
                }
            }, 100);
        }
        @Override
        public void onAnimationRepeat(Animation animation) { }
    });
view.startAnimation(animations);

请注意,这是在自定义视图(扩展了FrameLayout)内完成的,所有内容都在UI线程上运行。

答案 4 :(得分:0)

我遇到了同样的问题,我用这个问题Android - remove View when its animation finished的答案解决了这个问题。

编辑: 你可以这样做:

        static void Main(string[] args)
    {
        StreamReader hours = new StreamReader("hours.txt");
        string number = "";

        while (number != null)
        {
            number = hours.ReadLine();
            if (number != null)
                Console.WriteLine(number);
        }
        //list of numbers above is all ok when running program

        int total = 0;
        double average = 0;
        for (int index = 0; index < number.Length; index++)
        {
            total = total + number[index];
        }
        average = (double)total / number.Length;
        Console.WriteLine("Average = " + average.ToString("N2"));

        int high = number[0];

        for (int index = 0; index < number.Length; index++)
        {
            if (number[index] > high)
            {
                high = number[index];
            }
        }

        Console.WriteLine("Highest number = " + high);

        int low = number[0];

        for (int index = 0; index > number.Length; index++)
        {
            if (number[index] < low)
            {
                low = number[index];
            }
        }
        Console.WriteLine("Lowest number = " + low);
        hours.Close();
                Console.ReadLine();
        }
    }
}

LayoutMain是包含视图的布局。 MN是您的活动。

答案 5 :(得分:0)

只需在onAnimationEnd内部调用

animate.setListener(null)