Status Update
Placement/reordering animations in lists: Available since 1.1.0
Placement/reordering animations in grids: Available since 1.2.0
Placement/reordering animations in staggered grids: Available since 1.5.x betas
Additions/removals animations: In progress
Comments
cl...@google.com <cl...@google.com>
an...@google.com <an...@google.com>
ra...@twinhealth.com <ra...@twinhealth.com> #2
Branch: androidx-master-dev
commit 23a7d960caf43390a554700d3c56ada189a9d10e
Author: Louis Pullen-Freilich <lpf@google.com>
Date: Mon Aug 10 15:11:36 2020
IconButton / IconToggleButton API scrub
Test: ./gradlew updateApi
Bug:
Bug:
Relnote: "Adds enabled parameter to IconButton, and reorders parameters in IconToggleButton"
Change-Id: I0a9419b1a631cadad451395302ad87b7f9214f96
M ui/ui-material/api/current.txt
M ui/ui-material/api/public_plus_experimental_current.txt
M ui/ui-material/api/restricted_current.txt
M ui/ui-material/src/commonMain/kotlin/androidx/compose/material/IconButton.kt
an...@google.com <an...@google.com> #3
We are working on it, but nothing to share yet. Thanks
ro...@gmail.com <ro...@gmail.com> #4
Are we allowed to post potential workarounds on issue trackers?
I created this small POC repo, definitely not a solution and probably not ideal in the long run but works for my use case and thought I'd share:
ka...@gmail.com <ka...@gmail.com> #5
sh...@gmail.com <sh...@gmail.com> #6
Any update on LazyList Animations
ap...@google.com <ap...@google.com> #7
Branch: androidx-main
commit 957064e95fb19d2e6f1312ff4ca4f7407ee3ee42
Author: Andrey Kulikov <andreykulikov@google.com>
Date: Wed Oct 06 22:38:46 2021
Lazy list item reordering animation
Relnote: """Experimental ability to animate Lazy lists item positions was added.
There is a new modifier available within LazyItemScope called `Modifier.animateItemPlacement()`.
Usage example:
var list by remember { mutableStateOf(listOf("A", "B", "C")) }
LazyColumn {
item {
Button(onClick = { list = list.shuffled() }) {
Text("Shuffle")
}
}
items(list, key = { it }) {
Text("Item $it", Modifier.animateItemPlacement())
}
}
When you provide a key via `LazyListScope.item` or `LazyListScope.items` this modifier will enable item reordering animations. Aside from item reordering all other position changes caused by events like arrangement or alignment changes will also be animated.
"""
Bug: 150812265
Test: tests for the new behavior in LazyListAnimateItemPlacementTest
Change-Id: I59e7b8fd3a4a9eb19a15a4704da150bd187a6f24
A compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/PopularBooksDemo.kt
A compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemPlacementAnimator.kt
M compose/foundation/foundation/api/restricted_current.txt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScope.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
M compose/foundation/foundation/api/1.1.0-beta02.txt
M compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt
A compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListAnimateItemPlacementTest.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt
M compose/foundation/foundation/api/restricted_1.1.0-beta02.txt
M compose/foundation/foundation/api/public_plus_experimental_current.txt
M compose/foundation/foundation/api/current.txt
M compose/foundation/foundation/build.gradle
M compose/foundation/foundation/api/public_plus_experimental_1.1.0-beta02.txt
M compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyMeasuredItem.kt
ma...@gmail.com <ma...@gmail.com> #8
an...@google.com <an...@google.com> #9
ro...@gmail.com <ro...@gmail.com> #10
In which version of Compose will the modifier be available?
an...@google.com <an...@google.com> #11
in 1.1.0-beta03
sh...@gmail.com <sh...@gmail.com> #12
Since there is no key param available in LazyVerticalGrid items or item. How are we supposed to use it with them.
Would it still work if I wrape item content in key composable
an...@google.com <an...@google.com> #13
om...@gmail.com <om...@gmail.com> #14
an...@google.com <an...@google.com> #15
sl...@gmail.com <sl...@gmail.com> #16
co...@gmail.com <co...@gmail.com> #17
jd...@google.com <jd...@google.com> #18
+1, can you please provide an update? :)
I think that list animations are pretty important and we can't always animate lists the way we want using the current APIs.
For instance, I'm trying to nicely animate a list whose items are updated every once in a while (some items are updated, some are removed, some are added). I tried to achieve this using an AnimatedVisibility
block for each item (see TransitionManager.beginDelayedTransition
in the traditional view system:
- when an item is added, we first expand the location of the item (and move the siblings and resize their ancestors) then fade it in.
- when an item is removed, we first fade it out then shrink the location of the item.
We can simulate something similar by adding some delays in the AnimatedVisibility
enter & exit transition specs, but it does not work well when removing and adding elements at the same time. This is illustrated in the video below: if my list has a single item and that I remove it but add a different item at the same time, then the following happens:
- The list grows because of the new item that is added. At the same time we fade out the item that is removed.
- The list shrinks because of the item that is being removed. At the same time we fade in the item that is added.
The ideal animation would just fade out the first item, then directly fade in the new item given that we don't need to shrink/grow the list.
It would be really great if this was handled out of the box by LazyColumn
/LazyRow
, for instance like this:
// Because we are using a MutableStateList
// or any other observable list, LazyColumn
// can keep track of the updates and animate
// its items in/out & move them accordingly.
val items = remember {
mutableStateListOf<Item>(/* some default list */)
}
LazyColumn {
items(items, { it.id }) { item ->
MyItem(item)
}
item {
Button(onClick = {
if (items.isNotEmpty()) {
// This will automatically animate given that we
// know exactly which item has been removed.
items.removeAt(0)
}
}) {
Text("Remove First")
}
}
}
We could also have an API that takes any kind of List<T>
+ DiffUtil.ItemCallback<T>
(or similar) :)
ka...@gmail.com <ka...@gmail.com> #20
in the example given, the list expands/shrinks for item insertion/deletion however it still does NOT fade in / fade out over time, if I'm not mistaken ?
Original diffutil animations have the short delayed fade in / fade out animations together with expansion / shrink when they're enabled on the recyclerview.
an...@google.com <an...@google.com> #21
ka...@gmail.com <ka...@gmail.com> #22
ma...@quantox.com <ma...@quantox.com> #23
I have a question regarding item animations.
Some of my layouts are laid out like this (copied from docs as valid case):
LazyVerticalGrid(
// ...
) {
item { Item(0) }
item {
Item(1)
Divider()
}
item { Item(2) }
// ...
}
Since most of my items have Item and Divider inside item {} block, and .animateItemPlacement() should be put directly on content, what should I do in situation like this? Do I have to wrap Item and Divider in a Column, and then put animation on a Column or is there another way?
Thanks.
an...@google.com <an...@google.com> #24
Can I ask for future to file separate bugs for questions like this as any new comment it this bug is currently sending an email to everyone who +1ed this bug. Thanks!
ra...@twinhealth.com <ra...@twinhealth.com> #25
ka...@gmail.com <ka...@gmail.com> #26
People are trying to come up with hacky answers on Stackoverflow without much success or any convenience.
this might not even be in backlog...
kl...@gmail.com <kl...@gmail.com> #27
ka...@gmail.com <ka...@gmail.com> #28
kl...@gmail.com <kl...@gmail.com> #29
an...@google.com <an...@google.com> #30
il...@gmail.com <il...@gmail.com> #31
Can you please provide any status update / dates if possible?
rl...@gmail.com <rl...@gmail.com> #32
pe...@gmail.com <pe...@gmail.com> #33
jo...@google.com <jo...@google.com> #34
Hi, the Play store team is working on a feature which could greatly benefit from LazyColumn's addition/deletion animation support. Do you have an updated ETA that you can share with you? Thanks!
da...@gmail.com <da...@gmail.com> #35
ry...@google.com <ry...@google.com> #36
ka...@gmail.com <ka...@gmail.com> #37
its almost been 2 years now and even your internal teams at play store are asking for the item addition deletion animations, I was the first to bring this up in this thread first.
Is there any ETA on this ? It was a core functionality with DiffUtils which we shouldnt find workarounds as an implementation for Compose !
Could anyone from Google please share an ETA on this
an...@google.com <an...@google.com> #38
Hello. We are currently finializing the design for the underlying mechanism we will be using for the disappearance animations. Sorry, we can't give exact estimations, but I can reassure you this feature is in works
mo...@gmail.com <mo...@gmail.com> #39
ka...@gmail.com <ka...@gmail.com> #40
bro
ka...@gmail.com <ka...@gmail.com> #41
I kind of agree with the last poster, if we all "bro" the developers every year or month to bump the thread, they might feel pressured to finish the removal/addition animations. Anyways, hang in there champ, they're probably almost done with that last piece of work
se...@gmail.com <se...@gmail.com> #42
it...@gmail.com <it...@gmail.com> #43
ta...@gmail.com <ta...@gmail.com> #44
Yesterday was the 4th year open anniversary of this issue lol
it...@gmail.com <it...@gmail.com> #45
mu...@gmail.com <mu...@gmail.com> #46
ph...@gmail.com <ph...@gmail.com> #47
ap...@google.com <ap...@google.com> #49
Branch: androidx-main
commit 36578696db7997ec73d1f81ae55e6b61951e7895
Author: Andrey Kulikov <andreykulikov@google.com>
Date: Tue Jul 04 16:14:07 2023
Item disappearance animation for lazy lists
We add support for the disappearance animation for lazy list items. The appearance animation was added as an internal api as part of aosp/2644850. We are using the new graphics layer implementation we recently added as part of aosp/2969199 and a set of preceding cls. This new graphics layer implementation is automatically counting the amount of usages for each layer, meaning that even when the layer is technically released by its main user, the underlying drawn content is not discarded until all the parent layers stop drawing it as well. It allows us to continue drawing the item being removed for the duration of disappearance animation. This logic was added in aosp/2967570.
As part of this cl we made both appearance and disappearance animation support public for LazyColumn and LazyRow. Support for other lazy layouts will be added in the next cls. Support for other types of animations is tracked in
Fixes: 150812265
Relnote: Item appearance and disappearance animation support was added into `LazyColumn` and `LazyRow`. Previously it was possible to add `Modifier.animateItemPlacement()` modifier in order to support placement (reordering) animations. We deprecated this modifier and introduced a new non-experimental modifier called `Modifier.animateItem()` which allows you to support all three animation types: appearance (fade in), disappearance (fade out) and reordering.
Test: new LazyListItemDisappearanceAnimationTest
Change-Id: I2d7f7a376cea26c0a36a59a4586d2705ab04cab7
M compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/lookahead/LookaheadWithAnimateItemPlacement.kt
M compose/foundation/foundation/api/current.txt
M compose/foundation/foundation/api/restricted_current.txt
M compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LazyColumnDragAndDropDemo.kt
M compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
M compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/PopularBooksDemo.kt
M compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemAppearanceAnimationTest.kt
A compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemDisappearanceAnimationTest.kt
M compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemPlacementAnimationTest.kt
M compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListTest.kt
M compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScope.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyItemScopeImpl.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemAnimator.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasuredItem.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemPlacementAnimator.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemScopeImpl.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutAnimation.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemPlacementAnimator.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemScope.kt
an...@google.com <an...@google.com> #50
Item appearance and disappearance animation support was added into LazyColumn
and LazyRow
. Previously it was possible to add Modifier.animateItemPlacement()
modifier in order to support placement (reordering) animations. We deprecated this modifier and introduced a new non-experimental modifier called Modifier.animateItem()
which allows you to support all three animation types: appearance (fade in), disappearance (fade out) and reordering.
This change is expected to be released as part of 1.7.0-alpha06
release.
Port of this modifier into lazy grids is tracked here:
To staggered grids here:
Support of other animation types aside of fade in/fade out is tracked here:
ca...@gmail.com <ca...@gmail.com> #51
Failed to transform lifecycle-livedata-core-2.8.0-alpha04.aar (androidx.lifecycle:lifecycle-livedata-core:2.8.0-alpha04) to match attributes {artifactType=android-dex, asm-transformed-variant=NONE, dexing-enable-desugaring=true, dexing-enable-jacoco-instrumentation=false, dexing-is-debuggable=true, dexing-min-sdk=26, org.gradle.category=library, org.gradle.dependency.bundling=external, org.gradle.libraryelements=aar, org.gradle.status=release, org.gradle.usage=java-runtime}.
Caused by: [CIRCULAR REFERENCE: java.lang.NullPointerException]
When I try to use 1.7.0-alpha06, any recommendation?
ry...@google.com <ry...@google.com> #52
@
lo...@gmail.com <lo...@gmail.com> #53
Hello, in the doc, under the heading "Item animations", the last sentence that references this issue should be changed, or removed:
It still says:
Aside from reorderings, item animations for additions and removals is currently in development. You can track the progress in issue
. 150812265
jo...@google.com <jo...@google.com> #54
Thank you for letting us know! We've updated the documentation page :)
Description
Placement/reordering animations in lists: Available since 1.1.0
Placement/reordering animations in grids: Available since 1.2.0
Placement/reordering animations in staggered grids: Available since 1.5.x betas
Additions/removals animations: In progress