Как правильно реализовать следующую анимацию масштаба / отказов? - PullRequest
1 голос
/ 10 апреля 2020

У меня есть следующая анимация, которая масштабирует изображение от «невидимого» до 60dp x 60dp, добавляя эффект отскока. Когда это заканчивается, оно исчезает с другим эффектом масштаба

bounce_animation. xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false">
    <set android:interpolator="@android:anim/bounce_interpolator">
        <scale
            android:fromXScale="0.1"
            android:fromYScale="0.1"
            android:toXScale="1.0"
            android:toYScale="1.0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:duration="1600" />
    </set>
    <set>
        <scale
            android:startOffset="1900"
            android:duration="200"
            android:pivotX="50%"
            android:pivotY="50%"
            android:fromXScale="1.0"
            android:fromYScale="1.0"
            android:toXScale="0"
            android:toYScale="0" />
    </set>
</set>

Это мой код для использования этого

MainActivity. java

        final ImageView likeBig = findViewById(R.id.like_big);
        final Animation bounceAnimation = AnimationUtils.loadAnimation(this, R.anim.bounce_animation);
        bounceAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                likeBig.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                likeBig.setVisibility(View.GONE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });

Проблема в том, что когда я делаю likeBig.setVisibility(View.VISIBLE); изображение становится видимым в течение доли секунды в полном размере, прежде чем запускается масштабная анимация. Мне нужно, чтобы изображение было невидимым до начала анимации.

Что не так с моим подходом?

1 Ответ

1 голос
/ 10 апреля 2020

Я могу только догадываться, почему View отображается в полном размере в начале анимации: возможно, onAnimationStart() срабатывает, когда анимация начинает вычислять следующие изменения, но до того, как экран обновляется в первый раз?

При этом вы можете использовать анимации свойств вместо View анимаций для достижения желаемого эффекта:

Во-первых, пусть ваш View будет иметь размер просто 1dp x 1dp в начале. Вместо того, чтобы устанавливать опору, вставьте его в центр FrameLayout размером 60dp x 60dp. При необходимости вы можете установить видимость FrameLayout на GONE после завершения анимации (в этом случае вам необходимо зарегистрировать Animator.AnimatorListener ).

<FrameLayout
    android:layout_width="60dp"
    android:layout_height="60dp">
    <ImageView
        android:id="@+id/like_big"
        android:layout_width="1dp"
        android:layout_height="1dp"
        android:layout_gravity="center"
        android:src="@mipmap/ic_launcher"
        android:background="#0000ff"/>
</FrameLayout>

Далее анимация:

ObjectAnimator growX = ObjectAnimator.ofFloat(like_big,"scaleX", 1f, 60.0f);
ObjectAnimator growY = ObjectAnimator.ofFloat(like_big,"scaleY", 1f, 60.0f);
AnimatorSet growAnim = new AnimatorSet();
growAnim.playTogether(growX, growY);
growAnim.setDuration(1600);
growAnim.setInterpolator(new BounceInterpolator());

ObjectAnimator shrinkX = ObjectAnimator.ofFloat(like_big,"scaleX", 60.0f, 0.0f);
ObjectAnimator shrinkY = ObjectAnimator.ofFloat(like_big,"scaleY", 60.0f, 0.0f);
AnimatorSet shrinkAnim = new AnimatorSet();
shrinkAnim.playTogether(shrinkX, shrinkY);
shrinkAnim.setDuration(200);
shrinkAnim.setInterpolator(new LinearInterpolator());

AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playSequentially(growAnim, shrinkAnim);

Запустите анимацию, позвонив по номеру

animatorSet.start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...