Skip to content

Instantly share code, notes, and snippets.

@yasukotelin
Created May 11, 2022 08:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yasukotelin/10eca8262a45fbb056ec6805d6c95384 to your computer and use it in GitHub Desktop.
Save yasukotelin/10eca8262a45fbb056ec6805d6c95384 to your computer and use it in GitHub Desktop.
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import kotlin.math.abs
enum class ScrollDirection {
FORWARD, BACKWARD, IDLE,
}
/**
* LazyListStateのスクロール方向を保持、参照できるState Composable
*
* @param state LazyListState
* @param playOffset スクロールoffsetの遊びの領域。遊びの範囲内の場合はIDLEが返る。
* @return スクロール方向を返却する
*/
@Composable
fun rememberLazyListScrollDirection(state: LazyListState, playOffset: Int = 0): ScrollDirection {
var prevFirstVisibleItemScrollOffset by remember { mutableStateOf(0) }
var prevFirstVisibleItemIndex by remember { mutableStateOf(0) }
val offset = state.firstVisibleItemScrollOffset
val index = state.firstVisibleItemIndex
// indexが同じ場合はoffsetの比較
// indexが違う場合はその方向で判定
val direction = when {
prevFirstVisibleItemIndex == index -> {
when {
prevFirstVisibleItemScrollOffset == offset -> ScrollDirection.IDLE
abs(prevFirstVisibleItemScrollOffset - offset) <= playOffset -> ScrollDirection.IDLE
prevFirstVisibleItemScrollOffset < offset -> ScrollDirection.FORWARD
else -> ScrollDirection.BACKWARD
}
}
prevFirstVisibleItemIndex < index -> ScrollDirection.FORWARD
else -> ScrollDirection.BACKWARD
}
prevFirstVisibleItemScrollOffset = offset
prevFirstVisibleItemIndex = index
return direction
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment