use 50/50 split for pager vs dock zones
This commit is contained in:
+6
-7
@@ -36,18 +36,16 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
|
|||||||
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
|
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
|
||||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
||||||
import androidx.compose.ui.input.pointer.pointerInput
|
import androidx.compose.ui.input.pointer.pointerInput
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
import androidx.compose.ui.layout.onSizeChanged
|
||||||
import androidx.compose.ui.unit.dp
|
|
||||||
|
|
||||||
private val EDGE_ZONE_WIDTH = 48.dp
|
private const val PAGER_ZONE_FRACTION = 0.5f
|
||||||
|
|
||||||
fun Modifier.zonedDrawerSwipe(
|
fun Modifier.zonedDrawerSwipe(
|
||||||
pagerState: PagerState,
|
pagerState: PagerState,
|
||||||
openDrawer: () -> Unit,
|
openDrawer: () -> Unit,
|
||||||
): Modifier =
|
): Modifier =
|
||||||
composed {
|
composed {
|
||||||
val edgeZonePx = with(LocalDensity.current) { EDGE_ZONE_WIDTH.toPx() }
|
var widthPx by remember { mutableFloatStateOf(1f) }
|
||||||
|
|
||||||
var gestureStartX by remember { mutableFloatStateOf(0f) }
|
var gestureStartX by remember { mutableFloatStateOf(0f) }
|
||||||
var gestureStartPage by remember { mutableIntStateOf(0) }
|
var gestureStartPage by remember { mutableIntStateOf(0) }
|
||||||
var drawerOpened by remember { mutableStateOf(false) }
|
var drawerOpened by remember { mutableStateOf(false) }
|
||||||
@@ -65,9 +63,9 @@ fun Modifier.zonedDrawerSwipe(
|
|||||||
// available.x > 0 means user is swiping right
|
// available.x > 0 means user is swiping right
|
||||||
if (available.x > 0f) {
|
if (available.x > 0f) {
|
||||||
val wasOnFirstPage = gestureStartPage == 0
|
val wasOnFirstPage = gestureStartPage == 0
|
||||||
val isInEdgeZone = gestureStartX < edgeZonePx
|
val isInPagerZone = gestureStartX < widthPx * PAGER_ZONE_FRACTION
|
||||||
|
|
||||||
if (wasOnFirstPage || !isInEdgeZone) {
|
if (wasOnFirstPage || !isInPagerZone) {
|
||||||
drawerOpened = true
|
drawerOpened = true
|
||||||
openDrawer()
|
openDrawer()
|
||||||
return Offset(available.x, 0f)
|
return Offset(available.x, 0f)
|
||||||
@@ -79,6 +77,7 @@ fun Modifier.zonedDrawerSwipe(
|
|||||||
}
|
}
|
||||||
|
|
||||||
this
|
this
|
||||||
|
.onSizeChanged { widthPx = it.width.toFloat() }
|
||||||
.pointerInput(Unit) {
|
.pointerInput(Unit) {
|
||||||
awaitEachGesture {
|
awaitEachGesture {
|
||||||
val down = awaitFirstDown(requireUnconsumed = false)
|
val down = awaitFirstDown(requireUnconsumed = false)
|
||||||
|
|||||||
Reference in New Issue
Block a user