【问题标题】:translate animation翻译动画
【发布时间】:2019-08-19 22:29:27
【问题描述】:

我希望图像水平移动。 即图像应该从左端下角移动到右端下角一次。 无需再次回到左下角。

我尝试的代码是

<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>

这会将图像从左向右移动。但它再次来到左侧。 谁能告诉我如何解决这个问题?

【问题讨论】:

    标签: android


    【解决方案1】:

    您已经成为每个人首先对 Android 动画产生的巨大误解的受害者:动画 ImageView(或任何类型的视图)实际上并没有移动(或缩放、旋转或淡入淡出) )。这都是一个技巧......动画本质上是屏幕合成引擎的最后一分钟指令,以将视图偏移 x/y、旋转 z 等。视图的底层位置/大小/角度/alpha 永远不会真正改变。

    因此,当动画结束时,您的图像似乎会迅速回到起点,因为它实际上从未离开过它。

    也就是说,您可以通过将android:fillAfter="true" 添加到您的&lt;translate&gt; 标签以简单的方式实现您想要的。请记住,图像并没有真正移动。如果您需要在动画结束时更新布局,请连接 AnimationListener 并在 onAnimationEnd() 中进行操作。

    【讨论】:

    • 嗨 Reuben,我尝试使用 android:fillAfter="true"...但它与以前相同...然后我尝试使用 onAnimationEnd()。我将图像的可见性视为不可见......但仍然发生同样的事情......关于我做错了什么的任何线索?
    • 可能是因为您使用的是 但现在几乎不重要了。
    • 为什么不重要?一些代码会使这成为一个可爱的答案
    • 一个可爱的答案。
    【解决方案2】:

    我明白了...我没有使用那个动画 xml 文件,而是在 java 文件中编写。

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

    现在图像从左向右移动,然后它变得不可见......因此动画!!! :)

    【讨论】:

    • 我不知道为什么该代码有效。没有多大意义。尝试在setVisibility() 方法中使用View.VISIBLE
    • setVisibility(0) 有时它不起作用......我不知道你......我现在保留了 View.INVISIBLE,它可以工作............
    • 实际上,INVISIBLE 是 int == 1,VISIBLE == 0,gone ==2,here 我在代码中也遇到了 setVisibility 的问题,所以我把 View.VISIBLE/View .setVisibility 中的.INVISIBLE
    • 我的总是跳回原来的位置?我以为问题是翻译,然后留在原处? setFillAfter(true);没有将图像保持在应有的位置
    • 此代码适用于您在动画后不可见视图的情况。 android中的TranslateAnimation不会改变视图的真实位置。请改用 ObjectAnimator。
    【解决方案3】:

    翻译动画可以改变对象的视觉外观,但不能改变对象本身。也就是说,如果您将平移动画应用于视图,它会移动到新位置,但不会触发其点击事件;点击事件仍会在其之前的位置触发。

    发生这种情况是因为视图仍处于其原始位置。为了克服这个问题,我们可以使用实际移动对象的 ObjectAnimation。 对象动画是唯一实际移动对象的动画。

    您可以使用 ObjectAnimator 创建翻译动画。

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

    view - 这是要应用动画的视图 propertyName - 被动画的属性。 FromX,toX - 动画将随时间变化的一组值。

    【讨论】:

    • 在此答案中使用您的链接来增加流量是不受欢迎的!最好在此处包含该链接的摘要引用,以防止链接失效!
    • ObjectAnimator 是从 android 11 引入的。所以,在之前的 android 版本上,你必须使用非官方的库。这是一个 NineOldAndroids 库,您可以找到 android 11 的所有动画 API 并与所有其他 android 版本一起使用:nineoldandroids.com