Android создает тест на равенство плавающих анимаций ⇐ Android
-
Anonymous
Android создает тест на равенство плавающих анимаций
Я пробую простой проект с помощью Android Jetpack Compose. У меня есть анимированное состояние с плавающей запятой (с использованием animateFloatAsState), которое изменяется от 0 до 1, примерно так:
var xTarget по памяти {mutableFloatStateOf(0F) } val x: Плавающее значение с помощью animateFloatAsState( целевое значение = xTarget, анимацияSpec = tween(durationMillis = xDuration, easing = xEasing), label = "x анимация", ) { х -> когда (х) { 0 -> xTarget = 1 1 -> xTarget = 0 } } с кнопкой, запускающей анимацию, установив xTarget = 1. Теперь я хочу отреагировать, когда x = 0,5, примерно так:
if (x == 0,5) Log.d(LOG_TAG, «Середина») Но я считаю, что это ненадежно — оно не выполняется при всех запусках, чего можно было ожидать, поскольку мы имеем дело с равенством анимированного числа с плавающей запятой.
Как вы думаете, как лучше всего с этим справиться?
Я могу придумать два способа на ум: 1) вместо этого протестировать небольшой интервал - но это не идеально, поскольку граница между ненадежностью и большим количеством попаданий резкая и зависит от скорости анимации. . И 2) что-то вроде
var isRightTested : логическое значение по памяти {mutableStateOf(false) } if (x>0,5 && !isRightTested || x < 0,5 && isRightTested) { isRightTested = !isRightTested // ДЕЛАТЬ } Это кажется слишком запутанным (отредактируйте — теперь оно гораздо более лаконично, см. мой комментарий ниже).
Я пробую простой проект с помощью Android Jetpack Compose. У меня есть анимированное состояние с плавающей запятой (с использованием animateFloatAsState), которое изменяется от 0 до 1, примерно так:
var xTarget по памяти {mutableFloatStateOf(0F) } val x: Плавающее значение с помощью animateFloatAsState( целевое значение = xTarget, анимацияSpec = tween(durationMillis = xDuration, easing = xEasing), label = "x анимация", ) { х -> когда (х) { 0 -> xTarget = 1 1 -> xTarget = 0 } } с кнопкой, запускающей анимацию, установив xTarget = 1. Теперь я хочу отреагировать, когда x = 0,5, примерно так:
if (x == 0,5) Log.d(LOG_TAG, «Середина») Но я считаю, что это ненадежно — оно не выполняется при всех запусках, чего можно было ожидать, поскольку мы имеем дело с равенством анимированного числа с плавающей запятой.
Как вы думаете, как лучше всего с этим справиться?
Я могу придумать два способа на ум: 1) вместо этого протестировать небольшой интервал - но это не идеально, поскольку граница между ненадежностью и большим количеством попаданий резкая и зависит от скорости анимации. . И 2) что-то вроде
var isRightTested : логическое значение по памяти {mutableStateOf(false) } if (x>0,5 && !isRightTested || x < 0,5 && isRightTested) { isRightTested = !isRightTested // ДЕЛАТЬ } Это кажется слишком запутанным (отредактируйте — теперь оно гораздо более лаконично, см. мой комментарий ниже).
Мобильная версия