Simpler scrolling
This commit is contained in:
parent
ee6408a5b0
commit
4ab4ea1830
1 changed files with 15 additions and 22 deletions
|
@ -1,10 +1,10 @@
|
||||||
package com.surrus.peopleinspace
|
package com.surrus.peopleinspace
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.ViewConfiguration
|
import android.view.ViewConfiguration
|
||||||
import androidx.compose.foundation.gestures.ScrollableState
|
import androidx.compose.foundation.gestures.ScrollableState
|
||||||
import androidx.compose.foundation.gestures.scrollBy
|
import androidx.compose.foundation.gestures.scrollBy
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.ui.ExperimentalComposeUiApi
|
import androidx.compose.ui.ExperimentalComposeUiApi
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
@ -14,34 +14,27 @@ import androidx.compose.ui.input.pointer.pointerInteropFilter
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.core.view.InputDeviceCompat
|
import androidx.core.view.InputDeviceCompat
|
||||||
import androidx.core.view.MotionEventCompat
|
import androidx.core.view.MotionEventCompat
|
||||||
import androidx.core.view.ViewConfigurationCompat
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
fun processEvent(context: Context, scope: CoroutineScope, event: MotionEvent, scrollState: ScrollableState): Boolean {
|
|
||||||
if (event.action != MotionEvent.ACTION_SCROLL ||
|
|
||||||
!event.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
|
|
||||||
) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
val delta = -event.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
|
|
||||||
ViewConfigurationCompat.getScaledVerticalScrollFactor(
|
|
||||||
ViewConfiguration.get(context), context
|
|
||||||
)
|
|
||||||
scope.launch {
|
|
||||||
scrollState.scrollBy(delta)
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ExperimentalComposeUiApi::class)
|
@OptIn(ExperimentalComposeUiApi::class)
|
||||||
fun Modifier.scrollHandler(scrollState: ScrollableState): Modifier = composed {
|
fun Modifier.scrollHandler(scrollState: ScrollableState): Modifier = composed {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
|
val scaledVerticalScrollFactor =
|
||||||
|
remember { ViewConfiguration.get(context).getScaledVerticalScrollFactor() }
|
||||||
|
|
||||||
this.pointerInteropFilter(RequestDisallowInterceptTouchEvent()) { event ->
|
this.pointerInteropFilter(RequestDisallowInterceptTouchEvent()) { event ->
|
||||||
println(event)
|
if (event.action != MotionEvent.ACTION_SCROLL ||
|
||||||
processEvent(context, scope, event, scrollState)
|
!event.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
|
||||||
|
) {
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
val delta = -event.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
|
||||||
|
scaledVerticalScrollFactor
|
||||||
|
scope.launch {
|
||||||
|
scrollState.scrollBy(delta)
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue