安卓ObjectAnimator的fill after选项是什么?

4
在我的安卓应用程序中,我使用ObjectAnimator来移动ImageView。如下所示:
ObjectAnimator transitionX = ObjectAnimator.ofFloat(v, "TranslationY", 190);

有没有像fillAfter一样的选项,可以在动画完成后将视图的位置重置为新位置?

这个方法也许适用于你的情况,可以尝试使用 ObjectAnimator.pause() 方法。 - mco
4个回答

6

不,我会使用属性动画系统,假设v是一个视图:

v.animate().translationY(190).withEndAction(new Runnable() {
        @Override
        public void run() {
           v.setTranslationY(v.getTranslationY()-190);
        }
    }).start();

2

没有这个选项。但是您可以使用监听器来达到相同的效果,在onAnimationEnd()中手动将其更改为初始位置。以下是一个缩放图像视图的示例:

scaleDown.addListener(new Animator.AnimatorListener() {
                        @Override
                        public void onAnimationStart(Animator animation) {

                        }

                        @Override
                        public void onAnimationEnd(Animator animation) {
                            //Initial property values
                            tempIV.setScaleX(1f);
                            tempIV.setScaleY(1f);
                            tempIV.setAlpha(1f);
                        }

                        @Override
                        public void onAnimationCancel(Animator animation) {

                        }

                        @Override
                        public void onAnimationRepeat(Animator animation) {

                        }
                    });

0

我认为处理这个问题的正确方法是使用AnimationSet来合并两个动画,一个用于平移视图,另一个用于将视图平移回来。

就像这样

ObjectAnimator translateTo190= ObjectAnimator.ofFloat(v, "TranslationY", 190);
ObjectAnimator translateBack = ObjectAnimator.ofFloat(v, "TranslationY", 0);

AnimatorSet translate= new AnimatorSet();
translate.play(translateTo190).before(translateBack);
translate.start();

0

我在编写一种卡牌发牌动画时遇到了这样的问题,其中卡牌从中央“牌堆”快速发放。经过多次尝试,我使用ObjectAnimator以以下方式使其正常工作。

我在动画源处添加了一个单独的“牌堆”卡牌,然后添加了第二张要实际动画的卡牌。我使用以下deal_from_drawpile.xml来将卡牌分为两部分进行动画处理:第一部分将卡牌返回到源位置,第二部分则缩放和旋转卡牌,就像它被“发牌”一样:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:interpolator="@android:anim/accelerate_interpolator"
 android:ordering="sequentially">
<set android:interpolator="@android:anim/accelerate_interpolator"
     android:ordering="together">
    <objectAnimator
        android:propertyName="translationX"
        android:duration="10"
        android:valueFrom="0.0f"
        android:valueTo="0.0f"/>
    <objectAnimator
        android:propertyName="translationY"
        android:duration="10"
        android:valueFrom="0.0f"
        android:valueTo="0.0f"/>
    <objectAnimator
        android:propertyName="scaleX"
        android:duration="10"
        android:valueFrom="0.75f"
        android:valueTo="0.75f"/>
    <objectAnimator
        android:propertyName="scaleY"
        android:duration="10"
        android:valueFrom="0.75f"
        android:valueTo="0.75f"/>
</set>
<set android:ordering="together">
    <objectAnimator
        android:propertyName="rotation"
        android:duration="300"
        android:valueFrom="0.0f"
        android:valueTo="360.0f"/>
    <objectAnimator
        android:propertyName="scaleX"
        android:duration="300"
        android:valueFrom="0.75f"
        android:valueTo="0.5f"/>
    <objectAnimator
        android:propertyName="scaleY"
        android:duration="300"
        android:valueFrom="0.75f"
        android:valueTo="0.5f"/>
</set>

然后在代码中,我添加了实际的翻译,这取决于半圆形排列的手的数量。然后将完整的动画序列添加到AnimatorSet中,并在最后触发它。 代码片段如下:

        fullScreenContent.addView(dealtCardView);
    for (int iCard=0; iCard<numCards; iCard++) {
        for (int iPlayer = 0; iPlayer < numPlayers; iPlayer++) {
            dealtCardAnimator = dealtCardAnimator.clone();
            dealtCardAnimator.setTarget(dealtCardView);
            //offsets where the cards are dealt according to player
            ObjectAnimator playerOffsetXAnimator = ObjectAnimator.ofFloat(dealtCardView, "TranslationX", mGame.getPlayer(iPlayer).getPlayerLayout().getTranslationX());
            ObjectAnimator playerOffsetYAnimator = ObjectAnimator.ofFloat(dealtCardView, "TranslationY", mGame.getPlayer(iPlayer).getPlayerLayout().getTranslationY());
            if (lastDealtCardAnimator == null) dealSet.play(dealtCardAnimator).with(playerOffsetXAnimator).with(playerOffsetYAnimator);
            else dealSet.play(dealtCardAnimator).with(playerOffsetXAnimator).with(playerOffsetYAnimator).after(lastDealtCardAnimator);
            //The card is returned to the home point with the first portion of deal_from_drawpile

            lastDealtCardAnimator = dealtCardAnimator;
        }//end for iPlayer
    }//end for numCards
    dealSet.start();

现在我可以调整XML中每个步骤的持续时间,以获得我想要的效果。请注意,您必须将持续时间嵌入到每个元素中,而不是设置部分(在那里它会被忽略,并且似乎使用某些任意默认值)。

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