#android-jetpack-compose
#android-jetpack-сочинять
Вопрос:
Я довольно часто оказываюсь в такой ситуации. У меня есть некоторое значение, как plates
в приведенном ниже примере, и я хочу показать/скрыть его в зависимости от того, является ли оно нулевым или нет. Но скрыть это всегда не удается, так как ничто не отображается всякий раз, когда оно равно нулю, и анимация просто превращается в пустое ничто.
Как я могу заставить это работать? Я хотел бы остаться plates
здесь, пока анимация не закончится.
AnimatedVisibility( visible = plates != null, content = { if (plates != null) { // Render plates } else { // The animation snaps to nothingness, as opposed to animating out } })
Комментарии:
1. Если вы хотите, чтобы содержимое отображалось во время части анимации «выход», содержимое не может быть пустым. Содержимое должно быть точно таким же, как при выполнении фазы «ввод», в противном случае анимация покажет очень быстрое изменение. Почему ваша переменная plates внезапно стала нулевой, если она не была нулевой, когда выполнялась фаза «ввод»?
2. Именно так я и думал. Поэтому я должен запоминать содержимое и обновлять его каждый раз, когда появляется ненулевое значение, а затем использовать его значение в блоке animatedVisibility, указывая при этом его видимость по последнему значению, равному нулю или нет? Что касается того, что значение снова становится нулевым, это просто указывает на то, что его больше не следует показывать.
3. Это правильное решение. Просто кэшируйте свой последний элемент и используйте его повторно при скрытии. Кроме того, если на вашем экране используется вертикальная прокрутка, вы должны поместить состояние прокрутки в свою модель представления и передать его в свой составляемый файл, потому что анимация разрушает состояние прокрутки. Использование локального состояния, такого как rememberScrollState, не сработает. Он разрушается. Выход будет выглядеть более плавным, не возвращаясь к верхней части экрана, из которого вы выходите.
Ответ №1:
Анимация всегда требует контента, даже когда нечего показывать. Просто отобразите поверхность, когда содержимое равно нулю (или пусто):
AnimatedVisibility( visible = plates != null, content = { if (plates != null) { // Render plates } else { Surface(modifier = Modifier.fillMaxSize()) { } } })
Комментарии:
1. Это имеет тот же эффект, когда пластины становятся пустыми, отображается пустая поверхность, и кажется, что пластины немедленно исчезают.
Ответ №2:
Это то, что я в итоге сделал, и это работает так, как ожидалось!
@Composable inline fun lt;Tgt; AnimatedValueVisibility( value: T?, enter: EnterTransition = fadeIn( animationSpec = FloatSpec ) expandVertically( animationSpec = SizeSpec, clip = false ), exit: ExitTransition = fadeOut( animationSpec = FloatSpec ) shrinkVertically( animationSpec = SizeSpec, clip = false ), crossinline content: @Composable (T) -gt; Unit ) { val ref = remember { Reflt;Tgt;() } ref.value = value ?: ref.value AnimatedVisibility( visible = value != null, enter = enter, exit = exit, content = { ref.value?.let { value -gt; content(value) } } ) }