Я пытаюсь использовать функцию AnimatedVisibility и Modifier.pointerInput, чтобы добиться такого эффекта, чтобы пользователь мог провести по ней пальцем, чтобы удалить элемент в списке. Я обнаружил, что выход и вход в анимацию отображаются неправильно, что меня смутило. Элемент появлялся и исчезал без анимации. Я не знаю, что пошло не так. Мне интересно, почему это так, и есть ли способ помочь мне определить, почему ожидаемая анимация не работает. Заранее спасибо.
@Composable
fun SwipedContent (
swipeThreshold: Float = 500f,
isVisibility: () -> Boolean,
modifier: Modifier = Modifier,
onSwipe: () -> Unit,
content: @Composable () -> Unit
) {
val offsetX = remember { Animatable(0f) }
val scope = rememberCoroutineScope()
AnimatedVisibility (
visible = isVisibility.invoke(),
enter = fadeIn(tween(300)) + slideInHorizontally(
initialOffsetX = { it }
),
exit = fadeOut(tween(300)) + slideOutHorizontally(
targetOffsetX = { fullWidth ->
if (fullWidth > 0) {
fullWidth
} else {
-fullWidth
}
}
)
) {
Box (
modifier = modifier
.pointerInput(Unit) {
detectHorizontalDragGestures(
onDragEnd = {
if (offsetX.value > swipeThreshold || offsetX.value < -swipeThreshold) {
onSwipe.invoke()
} else {
scope.launch { offsetX.animateTo(0f) }
}
}
) { change, dragAmount ->
change.consume()
scope.launch { offsetX.snapTo(offsetX.value + dragAmount) }
}
}
.offset { IntOffset(offsetX.value.roundToInt(), 0) },
) {
content.invoke()
}
}
}
initialAlertList.forEachIndexed { index, alert ->
key (alert.id) {
SwipedContent (
isVisibility = { initialAlertList.contains(alert) },
onSwipe = { initialAlertList.remove(alert) }
) {
Card (
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp, horizontal = 5.dp)
.clickable(
onClick = {
editAlertIndexState.intValue = index
isShowPopUp.value = !isShowPopUp.value
},
indication = ripple(),
interactionSource = remember { MutableInteractionSource() }
),
shape = RoundedCornerShape(8.dp),
colors = CardDefaults.cardColors().copy(containerColor = Color.Transparent),
border = BorderStroke(width = 1.dp, color = Color.Gray),
) {
// someComponents here
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... -correctly
Выход и вход в анимацию AnimatedVisibility отображаются неправильно. ⇐ Android
Форум для тех, кто программирует под Android
1731206665
Anonymous
Я пытаюсь использовать функцию AnimatedVisibility и Modifier.pointerInput, чтобы добиться такого эффекта, чтобы пользователь мог провести по ней пальцем, чтобы удалить элемент в списке. Я обнаружил, что выход и вход в анимацию отображаются неправильно, что меня смутило. Элемент появлялся и исчезал без анимации. Я не знаю, что пошло не так. Мне интересно, почему это так, и есть ли способ помочь мне определить, почему ожидаемая анимация не работает. Заранее спасибо.
@Composable
fun SwipedContent (
swipeThreshold: Float = 500f,
isVisibility: () -> Boolean,
modifier: Modifier = Modifier,
onSwipe: () -> Unit,
content: @Composable () -> Unit
) {
val offsetX = remember { Animatable(0f) }
val scope = rememberCoroutineScope()
AnimatedVisibility (
visible = isVisibility.invoke(),
enter = fadeIn(tween(300)) + slideInHorizontally(
initialOffsetX = { it }
),
exit = fadeOut(tween(300)) + slideOutHorizontally(
targetOffsetX = { fullWidth ->
if (fullWidth > 0) {
fullWidth
} else {
-fullWidth
}
}
)
) {
Box (
modifier = modifier
.pointerInput(Unit) {
detectHorizontalDragGestures(
onDragEnd = {
if (offsetX.value > swipeThreshold || offsetX.value < -swipeThreshold) {
onSwipe.invoke()
} else {
scope.launch { offsetX.animateTo(0f) }
}
}
) { change, dragAmount ->
change.consume()
scope.launch { offsetX.snapTo(offsetX.value + dragAmount) }
}
}
.offset { IntOffset(offsetX.value.roundToInt(), 0) },
) {
content.invoke()
}
}
}
initialAlertList.forEachIndexed { index, alert ->
key (alert.id) {
SwipedContent (
isVisibility = { initialAlertList.contains(alert) },
onSwipe = { initialAlertList.remove(alert) }
) {
Card (
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp, horizontal = 5.dp)
.clickable(
onClick = {
editAlertIndexState.intValue = index
isShowPopUp.value = !isShowPopUp.value
},
indication = ripple(),
interactionSource = remember { MutableInteractionSource() }
),
shape = RoundedCornerShape(8.dp),
colors = CardDefaults.cardColors().copy(containerColor = Color.Transparent),
border = BorderStroke(width = 1.dp, color = Color.Gray),
) {
// someComponents here
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79174050/the-exit-and-enter-animate-of-animatedvisibility-are-not-displayed-correctly[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия