Fix the destination point of the animation
This commit is contained in:
@@ -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)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user