【问题标题】:How can I make this code for Animations more effective?如何使此动画代码更有效?
【发布时间】:2014-05-03 06:50:17
【问题描述】:

此代码通过ObjectAnimatorAnimationSets 在按钮单击时切换两个视图(mView1 和mView2)的y-position。在翻译动画时,两个视图的alpha 值将减少并再次增长。这只是一个玩一点的设置。 alpha 动画是用 XML 定义的,翻译动画是用代码完成的。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">
    <objectAnimator
        android:propertyName="alpha"
        android:duration="500"
        android:valueTo="0.5"
        android:valueType="floatType"/>
    <objectAnimator
        android:propertyName="alpha"
        android:duration="500"
        android:valueTo="1.0"
        android:valueType="floatType"/>
</set>
@Override
public void onClick(View v) {
    if (mView1 != null && mView2 != null) {

        int top = mView2.getTop();

        ObjectAnimator translateView1 = null;
        ObjectAnimator translateView2 = null;

        if (mView1.getTranslationY() == 0) {

                translateView1 = ObjectAnimator.ofFloat(mView1, "translationY", top);
            translateView2 = ObjectAnimator.ofFloat(mView2, "translationY", top*(-1));

        } else {

                translateView1 = ObjectAnimator.ofFloat(mView2, "translationY", 0);
            translateView2 = ObjectAnimator.ofFloat(mView1, "translationY", 0);

        }

        translateView1.setDuration(1000L);
        translateView2.setDuration(1000L);

        AnimatorSet alpha1 = (AnimatorSet)AnimatorInflater.loadAnimator(mCtx, R.anim.switcher);
        alpha1.setTarget(mView1);

        AnimatorSet alpha2 = (AnimatorSet)AnimatorInflater.loadAnimator(mCtx, R.anim.switcher);
        alpha2.setTarget(mView2);

        AnimatorSet set = new AnimatorSet();
        set.playTogether(translateView1, translateView2, alpha1, alpha2);
        set.start();

    }
}

现在,由于它按预期工作,我想知道如何缩短代码?

  • 真的有必要为每个使用 XML 动画的View 拥有一个单独的AnimatorSet 实例吗?我可以一次膨胀 xml 并在不同的 AnimatorSets / ObjectAnimators 上使用它吗?因为我没有找到将 Animator 作为 Argument 的 setter。

  • 我可以为一个 AnimationSet/ObjectAnimator 定义多个目标吗?或者是为 View 定义不同的 ObjectAnimator 并在 AnimationSet 中使用它们的唯一方法?

【问题讨论】:

    标签: android xml android-animation android-xml


    【解决方案1】:

    您需要将动画代码放在动画类中......就像这样:

    public class FadingView extends View {
    
        private ObjectAnimator fade, moveX, moveY;
        private AnimatorSet moveSet;
    
        public FadingView(Context context) {
            super(context);
        }
    
        private void fade(int duration, float...values) {
    
            if(fade==null) {
                fade = ObjectAnimator.ofFloat(this, "alpha", values);
            } else {
                fade.setFloatValues(values);
            }
            fade.setDuration(duration);
            fade.start();
    
        }
    
        private void move(int duration, int x, int y) {
    
            if(moveX==null) {
                moveX = ObjectAnimator.ofFloat(this, "translation_x", x);
            } else {
                moveX.setFloatValues(x);
            }
            if(moveY==null) {
                moveY = ObjectAnimator.ofFloat(this, "translation_y", y);
            } else {
                moveY.setFloatValues(y);
            }
            if(moveSet == null) {
                moveSet = new AnimatorSet();
                moveSet.playTogether(moveX, moveY);
            }
    
            moveSet.setDuration(duration);
            moveSet.start();
    
        }
    
        public void moveToUpperLeft(int duration) {
            move(duration, 0,0);
        }
    
        public void show(int duration) {
            fade(duration,1);
        }
    
        public void hide(int duration) {
            fade(duration,0);
        }
    
    }
    

    只是一个基本的例子,但现在你可以调用:

    FadingView view = new FadingView(context);
    view.hide(500);
    view.moveToUpperLeft(500);
    

    当然,您可以进一步自定义和概括它...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多