Skip to content

Commit

Permalink
优化细节
Browse files Browse the repository at this point in the history
  • Loading branch information
jenly1314 committed Jun 13, 2024
1 parent 7bd2d73 commit 8021cc9
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 23 deletions.
Binary file modified app/release/app-release.apk
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.unit.Velocity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import kotlin.math.absoluteValue

/**
* 主要用于处理和协调Header或Footer与内容多个元素之间的滚动事件。
Expand All @@ -26,10 +25,7 @@ internal class UltraSwipeRefreshNestedScrollConnection(
var refreshEnabled: Boolean = false
var loadMoreEnabled: Boolean = false

override fun onPreScroll(
available: Offset,
source: NestedScrollSource
): Offset = when {
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset = when {
// 当下拉刷新和上拉加载都未启用时,则不进行消费,直接拦截
!(refreshEnabled || loadMoreEnabled) -> Offset.Zero
// 当正在刷新或正在加载或处理正在完成时,交由[onPostScroll]去处理
Expand All @@ -49,29 +45,33 @@ internal class UltraSwipeRefreshNestedScrollConnection(
// 当下拉刷新和上拉加载都未启用时,则不进行消费,直接拦截
!(refreshEnabled || loadMoreEnabled) -> Offset.Zero
// 当正在刷新或正在加载或处理正在完成时,则不进行消费,直接拦截
state.isRefreshing || state.isLoading || state.isFinishing -> Offset.Zero
state.isRefreshing || state.isLoading || state.isFinishing -> available
// 当正在拖动时,则进行滚动处理
source == NestedScrollSource.Drag -> onScroll(available)
else -> Offset.Zero
}

private fun onScroll(available: Offset): Offset {
if (available.y.absoluteValue > 0.5f) {

if (available.y != 0f) {
if (state.indicatorOffset <= 0f && available.y < 0f && !loadMoreEnabled) {
return Offset.Zero
}
if (state.indicatorOffset >= 0f && available.y > 0f && !refreshEnabled) {
return Offset.Zero
}

state.isSwipeInProgress = true
val dragConsumed = available.y * dragMultiplier
coroutineScope.launch {
state.dispatchScrollDelta(dragConsumed)
if (state.headerState != UltraSwipeHeaderState.Refreshing && state.footerState != UltraSwipeFooterState.Loading) {
coroutineScope.launch {
state.isSwipeInProgress = true
val dragConsumed = available.y * dragMultiplier
state.dispatchScrollDelta(dragConsumed)

}
}

return available.copy(x = 0f)
}

return Offset.Zero
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import kotlin.math.absoluteValue

/**
* 创建一个[UltraSwipeRefreshState],该状态在重组时会被记住。
Expand Down Expand Up @@ -68,7 +69,7 @@ class UltraSwipeRefreshState(isRefreshing: Boolean, isLoading: Boolean) {
internal set

/**
* 当前是否正在滑动(仅在单次滑动操作中,仅会记录[_indicatorOffset]的值不为0时的状态,即:需要触发至少显示一次Header或Footer时,才会被判定为正在滑动)
* 当前是否正在滑动(仅在单次滑动操作中,仅会记录[_indicatorOffset]的值增量不为0时的状态
*/
var isSwipeInProgress: Boolean by mutableStateOf(false)
internal set
Expand Down Expand Up @@ -124,22 +125,22 @@ class UltraSwipeRefreshState(isRefreshing: Boolean, isLoading: Boolean) {
*/
internal suspend fun animateOffsetTo(offset: Float) {
mutatorMutex.mutate {
if(!isFinishing) {
if (!isFinishing) {
updateHeaderState()
updateFooterState()
}
_indicatorOffset.animateTo(offset) {
if (indicatorOffset == 0f && isFinishing) {
isFinishing = false
updateHeaderState()
updateFooterState()
}
_indicatorOffset.animateTo(offset)

if (isFinishing && indicatorOffset == 0f) {
isFinishing = false
updateHeaderState()
updateFooterState()
}
}
}

/**
* Dispatch scroll delta in pixels from touch events.
* 调度触摸事件滚动增量
*/
internal suspend fun dispatchScrollDelta(delta: Float) {
mutatorMutex.mutate(MutatePriority.UserInput) {
Expand All @@ -150,9 +151,9 @@ class UltraSwipeRefreshState(isRefreshing: Boolean, isLoading: Boolean) {
indicatorOffset.plus(delta).coerceIn(footerMinOffset, 0f)
} else {
indicatorOffset.plus(delta).coerceIn(footerMinOffset, headerMaxOffset)
}
}.takeIf { it.absoluteValue >= 0.5f } ?: 0f
)
if(!isFinishing) {
if (!isFinishing) {
updateHeaderState()
updateFooterState()
}
Expand Down

0 comments on commit 8021cc9

Please sign in to comment.