我正在为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);
}
});
如何在动画结束后使动画视图的可见性不可见?
请建议。
答案 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)