Как сделать плавную анимацию с помощью ValueAnimator? - PullRequest
0 голосов
/ 28 января 2020

Я хочу, чтобы скрыть расширенный потрясающий, когда он нажимается с помощью анимации. Я хочу уменьшить масштаб кнопки с первоначальной высоты и ширины до 0 / ушел. Он исчезает в углу, но в середине анимация отстает.

    private fun animateHideScoreFab(){
        val animX = ValueAnimator.ofInt(editScoreFab.measuredWidth, 0).apply {
            duration = 1000
        }
        val animY = ValueAnimator.ofInt(editScoreFab.measuredHeight, 0).apply {
            duration = 1000
        }


        animX.addUpdateListener {
            val value = it.animatedValue as Int
            editScoreFab.layoutParams.width = value
            editScoreFab.requestLayout()
        }

        animY.addUpdateListener {
            val value = it.animatedValue as Int
            editScoreFab.layoutParams.height = value
        }

        AnimatorSet().apply {
            this.interpolator = AccelerateDecelerateInterpolator()
            play(animX).with(animY)
            start()
        }

    }

Результат:

enter image description here

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Использование AccelerateDecelerateInterpolator https://developer.android.com/reference/android/view/animation/AccelerateDecelerateInterpolator говорит

Интерполятор, где скорость изменения начинается и заканчивается медленно, но ускоряется до середины.

Таким образом, в середине скорость изменения выше, чем при старте, что может сделать его запаздывающим

Попробуйте другой интерполятор, такой как LinearInterpolator https://developer.android.com/reference/android/view/animation/LinearInterpolator.html, который имеет постоянную скорость изменения.

Обновление Для AccelerateDecelerateInterpolator, если вы посмотрите на таблицу в https://developer.android.com/guide/topics/graphics/prop-animation.html#interpolators между 400 мс и 600 мс, значение скачет на 45,5% от расстояния, которое вы анимируете

Другим фактором гладкости является не использование Int, а использование Float, например, ValueAnimator.ofFloat, поэтому он имеет промежуточные шаги,

Update2

Перепланировка элемент дорогой, так как его необходимо измерить и перерисовать.

Он должен быть быстрее и плавнее, просто масштабируя уже нарисованное изображение, как это обычно делается с помощью графического процессора, и, следовательно, быстрее и плавнее. Также масштабирование вида берет Float

пример масштабирования Fab к верхнему праву onClick (обратите внимание, что ObjectAnimator как проще для реализации)

Извините в Java не Kotlin

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AnimatorSet animationSet = new AnimatorSet();

                // Set point to scale around to top right
                view.setPivotY(0);
                view.setPivotX(view.getMeasuredWidth());

                ObjectAnimator scaleY = ObjectAnimator.ofFloat(view,"scaleY", 1f, 0f);
                scaleY.setDuration(1000);
                // Optional as AccelerateDecelerateInterpolator is the default
                scaleY.setInterpolator(new AccelerateDecelerateInterpolator());
                ObjectAnimator scaleX = ObjectAnimator.ofFloat(view,"scaleX", 1f, 0f);
                scaleX.setDuration(1000);
                // Optional as AccelerateDecelerateInterpolator is the default
                scaleX.setInterpolator(new AccelerateDecelerateInterpolator());
                animationSet.playTogether(scaleX, scaleY);
                animationSet.start();
            }
        });
0 голосов
/ 29 января 2020

В представлениях есть свойства scaleX и scaleY, которые можно интерполировать от 1 до 0, это даст эффект сжатия представления, а не контейнера.

Во-вторых, для анимации масштаба работайте наверх, если ваши родительские параметры макета не подходят вам, вы должны установить ось в правом верхнем углу с помощью: view.pivotX = view.width; view.pivotY = 0

Кроме того, если вы используете propertyListener и обновляете его самостоятельно, вы может использовать только один ValueAnimator и выполнить калибровку c самостоятельно, а также рассмотреть возможность замены editScoreFab.requestLayout() на editScoreFab.invalidate()

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