android两个动画一下子

时间:2016-08-16 18:44:37

标签: android animation rotation curve

我使用ValueAnimator通过抛物线方式移动ImageView,它就像一个魅力。 现在我试图将另一个动画添加到同一个ImageView中,使用XML代码自动旋转。 当我单独使用旋转动画(没有ValueAnimator)时,它工作正常,但是当我同时启动两个动画时,结果完全错误,图像通过错误的方式,有时它会阻塞。 这是代码:

this.ValueAnimator1 = ValueAnimator.ofFloat(0.0f,1.0f);
this.ValueAnimator1.setDuration(4000);
this.ValueAnimator1.addUpdateListener(new AnimatorUpdateListener(){
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float t = ((Float)ValueAnimator1.getAnimatedValue()).floatValue();
        float xPos = p0.x*(1-t)*(1-t) + 
            p1.x*2*t*(1-t) + p2.x*t*t;
        float yPos = p0.y*(1-t)*(1-t) + 
            p1.y*2*t*(1-t) + p2.y*t*t;
        ImageView1.setTranslationX(xPos); 
        ImageView1.setTranslationY(yPos);
    }
});
this.Animation1 = AnimationUtils.loadAnimation(this,R.anim.rotation_projectile);
ImageView1.startAnimation(rotationProjectile);
ValueAnimator1.start();

<?xml version="1.0" encoding="utf-8"?>
<rotate 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0" 
    android:toDegrees="90"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fillEnabled="true"
    android:fillAfter="true"
    android:duration="4000"
/>

1 个答案:

答案 0 :(得分:3)

您可以使用AnimatorSet一起播放动画。

但是,您必须只使用动画师。 这可以使用ObjectAnimator轻松实现。

    ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(imageview, "rotation", 0f, 90f);
    rotateAnimator.setDuration(4000); 

然后使用AnimatorSet.playTogether(Animator... items)

播放两个动画师

如果您想使用XML作为动画师

    <objectAnimator
        android:propertyName="rotation"
        android:duration="4000"
        android:valueType:"floatType"
        android:valueFrom="0f"
        android:valueTo="90f" />

修改

    final ImageView imageview = (ImageView) findViewById(R.id.imageView);
    final ValueAnimator translateAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);
    ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(imageview, "rotation", 0f, 90f);

    final AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.playTogether(translateAnimator, rotateAnimator);
    animatorSet.setDuration(4000);

    final float x = imageview.getX();
    final float y = imageview.getY();
    translateAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            float t = (Float) translateAnimator.getAnimatedValue();
            imageview.setTranslationX(x + t*100);    // do your own
            imageview.setTranslationY(y + t*100);    // thing here

        }
    });

    imageview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            animatorSet.start();
        }
    });