#android #android-animation #android-jetpack-compose
Вопрос:
В представлениях Android у нас была анимация с использованием OvershootInterpolator
Мы хотим воспроизвести ту же анимацию в Jetpack Compose. Я вижу, что существует несколько видов анимации, описанных в https://developer.android.com/jetpack/compose/animation но я не вижу, какой из них может повторить OvershootInterpolator
tween
спецификация, похоже, не делает никакого превышения, просто анимация между начальным и конечным значением без превышенияspring
спецификация делает превышение, однако у нее нет такогоdurationMillis
параметра, как tween, поэтому мы не можем контролировать, как быстро она воспроизводитсяkeyFrames
спецификация кажется возможным решением, сделав что-то вроде этого:animationSpec = keyframes { durationMillis = 500 0f at 100 with FastOutSlowInEasing // Overshoot value to 50f 50f * 2 at 300 with LinearOutSlowInEasing // Actual final value after overshoot animation 25f at 500 }
Есть ли лучший / более простой способ, чем использовать keyFrames
для репликации OvershootInterpolator
?
Ответ №1:
Вы можете использовать любой Interpolator
из Animator
мира с помощью пользовательского Easing
:
animationSpec = tween(easing = Easing {
OvershootInterpolator().getInterpolation(it)
})
См Easing
. Интерфейс: https://developer.android.com/reference/kotlin/androidx/compose/animation/core/Easing
Хотя я бы рекомендовал использовать пружины поверх интерполяторов, особенно тех, которые имитируют пружины. Пружины придали бы гораздо более естественный вид. 🙂
Ответ №2:
Мы можем использовать spring animation
compose для достижения OvershootInterpolator
. Несмотря на то, что мы не можем предоставить какую-либо пользовательскую продолжительность анимации, мы можем управлять скоростью анимации с помощью stiffness
атрибута.
Мы можем добавить float values
в stiffness
атрибут любой пользовательский параметр. androidx.compose.animation.core
в настоящее время предоставляет 4 stiffness
постоянные значения по умолчанию, т. е.,
object Spring {
/**
* Stiffness constant for extremely stiff spring
*/
const val StiffnessHigh = 10_000f
/**
* Stiffness constant for medium stiff spring. This is the default stiffness for spring
* force.
*/
const val StiffnessMedium = 1500f
/**
* Stiffness constant for a spring with low stiffness.
*/
const val StiffnessLow = 200f
/**
* Stiffness constant for a spring with very low stiffness.
*/
const val StiffnessVeryLow = 50f
.....
}
Мы можем проверить, что stiffness
подходит для нашего случая.
Например:- (средняя скорость)
animationSpec = spring(
dampingRatio = Spring.DampingRatioHighBouncy,
stiffness = Spring.StiffnessMedium // with medium speed
)
Мы также можем задать пользовательское значение для stiffness
, например:-
animationSpec = spring(
dampingRatio = Spring.DampingRatioHighBouncy, // this would define how far the overshoot would happen.
stiffness = 1000f // with custom speed less than medium speed.
)
Вы можете поиграть с custom float values
жесткостью, чтобы достичь идеальной продолжительности анимации.