转换动画

34

我想让一张图片水平移动,即从左下角向右下角移动一次,无需再返回到左下角。

我尝试过的代码片段:

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator">

<translate android:fromXDelta="0%p" android:toXDelta="200%p" 
android:duration = "2000"/>
</set>

这将使图像从左侧移动到右侧。但是它又回到了左侧。 有人能告诉我如何解决这个问题吗?

3个回答

84
您已经陷入了所有第一次接触Android动画时的一个巨大误解:动画中的ImageView(或其他类型的视图)实际上并没有移动(缩放、旋转或淡化)。这是一个技巧...动画本质上是一些临时指令,通过对屏幕合成引擎进行偏移x / y、旋转z等操作。视图的基本位置/大小/角度/透明度从未真正改变。
因此,当动画结束时,您的图像似乎会立即回到起始点,因为它实际上从未离开过。
话虽如此,您可以通过将android:fillAfter="true"添加到您的<translate>标记来简单地实现想要的效果。只需记住,图像并没有真正移动。如果您需要在动画结束时更新布局,请连接一个AnimationListener,并在onAnimationEnd()中完成它。

1
嗨,Reuben,我尝试使用android:fillAfter="true"......但是和之前一样......然后我尝试使用onAnimationEnd()。我将图像的可见性设置为不可见......但仍然发生相同的事情......你有什么线索吗?我做错了什么吗? - Anju
1
可能是因为你使用了一个<set>,但现在这几乎无关紧要。 - Reuben Scratton
10
为什么这不重要?加上一些代码就可以让这个回答更好了。 - SSH This
这确实是个很好的答案。 - Anubian Noob
这是我在整个网络上找到的关于fillAfter使用的唯一帖子。谢谢。我真的不明白图像实际上并没有移动!如果我有一个按钮,将其移动到新位置,你说按钮实际上并没有移动。好吧,但所有操作,视图本身,按钮的一切都在新的位置。在旧位置触摸没有任何作用。那这是什么意思呢? - undefined

68

我明白了...不使用那个动画XML文件,我在Java文件内编写。

Animation animation = new TranslateAnimation(0, 500,0, 0);
animation.setDuration(1000);
animation.setFillAfter(true);
myImage.startAnimation(animation);
myImage.setVisibility(0);

现在这张图片是从左向右移动的,然后变得逐渐透明...因此具有动画效果!!! :)


5
我不知道为什么那段代码起作用,感觉有点不合理。尝试在 setVisibility() 方法中使用 View.VISIBLE - Macarse
setVisibility(0) 有时候不起作用...我不知道为什么...现在我使用了 View.INVISIBLE,它可以正常工作... - Anju
6
实际上,INVISIBLE 是指 int 等于 1,VISIBLE 是指 int 等于 0,gone 是指 int 等于 2,具体请参见此处链接:http://developer.android.com/reference/android/view/View.html#attr_android:visibility。我在代码中使用 setVisibility 函数时也遇到过问题,所以我使用了 View.VISIBLE / View.INVISIBLE 来设置。 - xxxxxxxxxadfas
2
我的图片一直跳回到原来的位置?我以为问题是要翻译,然后保持在原地?setFillAfter(true); 没有让图片停留在它应该停留的位置。 - SSH This
这段代码在动画后将视图隐藏的情况下有效。在Android中,TranslateAnimation不会改变视图的实际位置。请改用ObjectAnimator。 - Nguyen Minh Binh

20

Translate Animation可以改变一个对象的视觉外观,但不能改变对象本身。也就是说,如果你将一个Translate Animation应用于一个视图,它会移动到新的位置,但其点击事件不会被触发;点击事件仍然会在其先前的位置被触发。

这是因为该视图仍处于原始位置。为了克服这个问题,我们可以使用ObjectAnimation来实际移动一个对象。 Object Animation是唯一实际移动对象的动画。

您可以使用ObjectAnimator创建Translate Animation。

ObjectAnimator transAnimation= ObjectAnimator.ofFloat(view, propertyName, fromX, toX);
transAnimation.setDuration(3000);//set duration
transAnimation.start();//start animation

view - 这是要应用动画的视图。 propertyName - 正在进行动画处理的属性。 FromX,toX - 一组值,动画会在这些值之间随着时间进行变化。


2
在这个答案中使用你的链接来获取流量是不被赞同的!最好在这里包含一个摘要引用,以防止链接失效! - t0mm13b
ObjectAnimator是从Android 11开始引入的。因此,在之前的Android版本中,您必须使用非官方库。这就是NineOldAndroids库,您可以在其中找到所有Android 11动画API,并与其他所有Android版本一起使用:http://nineoldandroids.com/ - Nguyen Minh Binh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接