Fix the destination point of the animation

This commit is contained in:
Pierre-Yves Nicolas
2025-06-26 21:56:29 +02:00
parent d28ade8518
commit 3ca8854f45

View File

@@ -39,6 +39,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
const val PAGE_LIST_ELEMENT_SIZE_DP = 120 const val PAGE_LIST_ELEMENT_SIZE_DP = 120
@@ -52,6 +53,7 @@ fun CommonPageList(
currentPageIndex: Int? = null, currentPageIndex: Int? = null,
onLastItemPosition: ((Offset) -> Unit)? = null, onLastItemPosition: ((Offset) -> Unit)? = null,
) { ) {
val density = LocalDensity.current
LazyRow ( LazyRow (
state = listState, state = listState,
contentPadding = PaddingValues(4.dp), contentPadding = PaddingValues(4.dp),
@@ -77,15 +79,8 @@ fun CommonPageList(
else else
Modifier.width(maxImageSize) Modifier.width(maxImageSize)
val isLastItem = index == pageIds.lastIndex val isLastItem = index == pageIds.lastIndex
if (isLastItem && onLastItemPosition != null) { if (isLastItem) {
val density = LocalDensity.current modifier = modifier.addPositionCallback(onLastItemPosition, density, 1.0f)
modifier = modifier.onGloballyPositioned()
{ coordinates ->
with(density) {
onLastItemPosition(coordinates.localToWindow(
Offset(x = PAGE_LIST_ELEMENT_SIZE_DP.dp.toPx(), y = 0f)))
}
}
} }
Image( Image(
bitmap = bitmap, bitmap = bitmap,
@@ -99,11 +94,24 @@ fun CommonPageList(
} }
} }
if (pageIds.isEmpty()) { if (pageIds.isEmpty()) {
var modifier = Modifier.height(120.dp) Box(
if (onLastItemPosition != null) { modifier = Modifier
modifier = modifier.onGloballyPositioned() .height(120.dp)
{ coordinates -> onLastItemPosition(coordinates.localToWindow(Offset.Zero)) } .addPositionCallback(onLastItemPosition, density, 0.5f)
} ) {}
Box(modifier = modifier) {} }
}
fun Modifier.addPositionCallback(callback: ((Offset) -> Unit)?, density: Density, xFactor: Float): Modifier {
if (callback == null) {
return this
}
return this.onGloballyPositioned { coordinates ->
with(density) {
callback(coordinates.localToWindow(
Offset(
x = PAGE_LIST_ELEMENT_SIZE_DP.dp.toPx() * xFactor,
y = PAGE_LIST_ELEMENT_SIZE_DP.dp.toPx() / 2)))
}
} }
} }