Использование 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();
}
});