Right-to-left: fix target position of post-capture animation (#122)
This commit is contained in:
@@ -48,8 +48,10 @@ import androidx.compose.ui.graphics.asImageBitmap
|
|||||||
import androidx.compose.ui.layout.onGloballyPositioned
|
import androidx.compose.ui.layout.onGloballyPositioned
|
||||||
import androidx.compose.ui.platform.LocalConfiguration
|
import androidx.compose.ui.platform.LocalConfiguration
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
import androidx.compose.ui.platform.LocalDensity
|
||||||
|
import androidx.compose.ui.platform.LocalLayoutDirection
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.unit.Density
|
import androidx.compose.ui.unit.Density
|
||||||
|
import androidx.compose.ui.unit.LayoutDirection
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import org.fairscan.app.THUMBNAIL_SIZE_DP
|
import org.fairscan.app.THUMBNAIL_SIZE_DP
|
||||||
@@ -116,10 +118,12 @@ fun CommonPageList(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (state.document.isEmpty()) {
|
if (state.document.isEmpty()) {
|
||||||
|
val layoutDirection = LocalLayoutDirection.current
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.height(THUMBNAIL_SIZE_DP.dp)
|
.height(THUMBNAIL_SIZE_DP.dp)
|
||||||
.addPositionCallback(state.onLastItemPosition, LocalDensity.current, 0.5f)
|
.addPositionCallback(
|
||||||
|
state.onLastItemPosition, LocalDensity.current, 0.5f, layoutDirection)
|
||||||
) {}
|
) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -143,7 +147,9 @@ private fun PageThumbnail(
|
|||||||
Modifier.width(maxImageSize)
|
Modifier.width(maxImageSize)
|
||||||
if (index == state.document.lastIndex()) {
|
if (index == state.document.lastIndex()) {
|
||||||
val density = LocalDensity.current
|
val density = LocalDensity.current
|
||||||
imageModifier = imageModifier.addPositionCallback(state.onLastItemPosition, density, 1.0f)
|
val layoutDirection = LocalLayoutDirection.current
|
||||||
|
imageModifier = imageModifier.addPositionCallback(
|
||||||
|
state.onLastItemPosition, density, 1.0f, layoutDirection)
|
||||||
}
|
}
|
||||||
Box(modifier = modifier.height(PAGE_LIST_ELEMENT_SIZE_DP.dp)) {
|
Box(modifier = modifier.height(PAGE_LIST_ELEMENT_SIZE_DP.dp)) {
|
||||||
Card(
|
Card(
|
||||||
@@ -182,16 +188,28 @@ private fun BoxScope.PageNumberBadge(index: Int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Modifier.addPositionCallback(callback: ((Offset) -> Unit)?, density: Density, xFactor: Float): Modifier {
|
fun Modifier.addPositionCallback(
|
||||||
|
callback: ((Offset) -> Unit)?,
|
||||||
|
density: Density,
|
||||||
|
xFactor: Float,
|
||||||
|
layoutDirection: LayoutDirection
|
||||||
|
): Modifier {
|
||||||
if (callback == null) {
|
if (callback == null) {
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.onGloballyPositioned { coordinates ->
|
return this.onGloballyPositioned { coordinates ->
|
||||||
with(density) {
|
with(density) {
|
||||||
callback(coordinates.localToWindow(
|
val width = PAGE_LIST_ELEMENT_SIZE_DP.dp.toPx()
|
||||||
Offset(
|
|
||||||
x = PAGE_LIST_ELEMENT_SIZE_DP.dp.toPx() * xFactor,
|
val x = when (layoutDirection) {
|
||||||
y = PAGE_LIST_ELEMENT_SIZE_DP.dp.toPx() / 2)))
|
LayoutDirection.Ltr -> width * xFactor
|
||||||
|
LayoutDirection.Rtl -> width * (0.5f - xFactor)
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(
|
||||||
|
coordinates.localToWindow(Offset(x = x, y = width / 2))
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user