2-я анимация начинается в верхней части экрана вместо расположения предыдущей анимации - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть две анимации, которые должны происходить одна за другой. Первая работает, как и ожидалось, но вторая анимация переходит на самый верх экрана при вызове onAnimationEnd() первой анимации. Воздушный шар ImageView «всплывает» к центру экрана, и он должен расширяться (остальное будет реализовано позже. Я просто пытаюсь заставить эту часть работать). Первая анимация - чистая Java, а не XML.

xml второй анимации (bounce.xml):

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:duration="2000"
        android:fromXScale="1.0"
        android:toXScale="2.0"
        android:fromYScale="1.0"
        android:toYScale="2.0"
        android:pivotX="50%"
        android:pivotY="50%"/>
</set>    

Мой класс BounceInterpolator:

public class BounceInterpolator implements Interpolator {
    private double mAmplitude = 1;
    private double mFrequency = 10;

    BounceInterpolator(double amplitude, double frequency) {
        mAmplitude = amplitude;
        mFrequency = frequency;
    }
    public float getInterpolation(float time) {
        return (float) (-1 * Math.pow(Math.E, -time/ mAmplitude) * Math.cos(mFrequency * time) + 1);
    }
}

И, наконец, класс, где все это происходит:

public class CelebrateActivity extends AppCompatActivity {

    ImageView purple_balloon_1;
    Animation anim;
    Animation bounceAnim;
    RelativeLayout layout;
    MediaPlayer mediaPlayer;
    DisplayMetrics displayMetrics;
    static int height;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_celebrate);

        displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        height = displayMetrics.heightPixels;

        mediaPlayer = MediaPlayer.create(this, R.raw.first_love);
        mediaPlayer.start();

        layout = findViewById(R.id.relativeLayout);
        purple_balloon_1 = findViewById(R.id.purple_balloon_1);
        slideUp();
    }

    public void slideUp() {
        Animation slide = null;
        slide = new TranslateAnimation(0, 0, height, height / 2 - 100);
        slide.setDuration(15000);
        slide.setFillAfter(true);
        slide.setFillEnabled(true);
        purple_balloon_1.startAnimation(slide);

        bounceAnim = AnimationUtils.loadAnimation(CelebrateActivity.this, R.anim.bounce);
        BounceInterpolator interpolator = new BounceInterpolator(0.2, 20);
        bounceAnim.setInterpolator(interpolator);

        slide.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                purple_balloon_1.startAnimation(bounceAnim); //Where the 2nd animation is supposed to start. It works, but it jumps to the top of the screen.
            }
            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
    }
}

Почему он прыгает в верхнюю часть экрана, и как я могу установить координату Y для местоположения ImageView, чтобы предотвратить указанное прыжок?

1 Ответ

0 голосов
/ 29 апреля 2018

@ pskink - Спасибо за советы. Я пошел с ObjectAnimator и AnimatorSet. Я избавился как от своих XML-файлов, так и от класса BounceInterpolator, который сохранил много кода в процессе. Анимация работает отлично сейчас.

Еще раз спасибо.

public class CelebrateActivity extends AppCompatActivity {

    ImageView purple_balloon_1;
    //Animation slide;
    //Animation grow;
    AnimatorSet animatorSet;
    RelativeLayout layout;
    MediaPlayer mediaPlayer;
    DisplayMetrics displayMetrics;
    static int height;

    public static final String TAG = "CelebrateActivity.this";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_celebrate);

        displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        height = displayMetrics.heightPixels;

        mediaPlayer = MediaPlayer.create(this, R.raw.first_love);
        mediaPlayer.start();

        layout = findViewById(R.id.relativeLayout);
        purple_balloon_1 = findViewById(R.id.purple_balloon_1);

        animatorSet = new AnimatorSet();
        ObjectAnimator slide = ObjectAnimator.ofFloat(purple_balloon_1, "translationY", height, height / 2);
        slide.setDuration(15000);
        ObjectAnimator growX = ObjectAnimator.ofFloat(purple_balloon_1, "scaleX", 1.5f);
        growX.setDuration(500);
        ObjectAnimator growY = ObjectAnimator.ofFloat(purple_balloon_1, "scaleY", 1.5f);
        growY.setDuration(500);

        animatorSet.playTogether(growX, growY);
        animatorSet.playSequentially(slide, growX);
        animatorSet.start();
    }
}
...