Skip to content

Commit

Permalink
Release 1.0.6
Browse files Browse the repository at this point in the history
  • Loading branch information
kevingermainbusiness committed Oct 4, 2022
1 parent 35a82f9 commit a2ae642
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,25 @@ import android.os.Bundle
import android.view.Window
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.Scaffold
import androidx.compose.material.ScaffoldState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.KeyboardArrowDown
import androidx.compose.material.icons.filled.KeyboardArrowUp
import androidx.compose.material.icons.filled.MoreHoriz
import androidx.compose.material.rememberScaffoldState
import androidx.compose.material3.*
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.unit.dp
import com.germainkevin.collapsingtopbar.*
import com.germainkevin.collapsingtopbar.CollapsingTopBar
import com.germainkevin.collapsingtopbar.CollapsingTopBarState
import com.germainkevin.collapsingtopbar.rememberCollapsingTopBarScrollBehavior
import com.germainkevin.collapsingtopbarcompose.ui.*
import com.germainkevin.collapsingtopbarcompose.ui.theme.CollapsingTopBarComposeTheme

Expand Down Expand Up @@ -71,6 +71,7 @@ class MainActivity : ComponentActivity() {
}
}

@OptIn(ExperimentalFoundationApi::class)
@Composable
private fun HomeScreen(
scaffoldState: ScaffoldState,
Expand All @@ -82,28 +83,27 @@ private fun HomeScreen(
isExpandedWhenFirstDisplayed = false,
centeredTitleWhenCollapsed = false,
centeredTitleAndSubtitle = true,
expandedTopBarMaxHeight = 200.dp,
expandedTopBarMaxHeight = 156.dp,
)
val isCollapsed = scrollBehavior.currentState == CollapsingTopBarState.COLLAPSED
val isExpanded = scrollBehavior.currentState == CollapsingTopBarState.EXPANDED
Scaffold(
Column(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
scaffoldState = scaffoldState,
topBar = {
CollapsingTopBar(
scrollBehavior = scrollBehavior,
colors = collapsingTopBarColors(window),
title = TitleText,
expandedTitle = ExpandedTitleText,
subtitle = { SubtitleText(contacts) },
navigationIcon = { NavigationIcon() },
actions = { MoreMenuIcons(scrollBehavior, isCollapsed, isExpanded) },
)
},
) { contentPadding ->
) {
CollapsingTopBar(
scrollBehavior = scrollBehavior,
colors = collapsingTopBarColors(window),
title = TitleText,
expandedTitle = ExpandedTitleText,
subtitle = { SubtitleText(contacts) },
navigationIcon = { NavigationIcon() },
actions = { MoreMenuIcons(scrollBehavior, isCollapsed, isExpanded) },
)
LazyColumn(
modifier = Modifier.background(MaterialTheme.colorScheme.background),
contentPadding = contentPadding,
modifier = Modifier
.weight(1f)
.background(MaterialTheme.colorScheme.background),
// contentPadding = contentPadding,
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
items(contacts) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import timber.log.Timber
import kotlin.math.roundToInt

/**
Expand Down Expand Up @@ -117,6 +116,8 @@ interface CollapsingTopBarScrollBehavior {
* collapsed
* */
val collapsedTitleAlpha: @Composable () -> State<Float>

var ignorePreScrollDetection: Boolean
}

class DefaultBehaviorOnScroll(
Expand Down Expand Up @@ -158,34 +159,31 @@ class DefaultBehaviorOnScroll(

override var offsetLimit: Float = (expandedTopBarMaxHeight - collapsedTopBarHeight).value

override var ignorePreScrollDetection: Boolean by mutableStateOf(false)

override val nestedScrollConnection = object : NestedScrollConnection {

override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {

if (!isAlwaysCollapsed) {

val availableY = available.y.toInt()
val newOffset = (topBarOffset + availableY)
val coerced = newOffset.coerceIn(minimumValue = -offsetLimit, maximumValue = 0f)
topBarOffset = coerced
val newHeight = expandedTopBarMaxHeight + topBarOffset.roundToInt().dp

if (topBarOffset == 0f) {
trackOffSetIsZero += 1
}

// Just keeping trackOffSetIsZero from storing high numbers that are above 3
if (trackOffSetIsZero > 6) {
trackOffSetIsZero = 3
}

if (!isExpandedWhenFirstDisplayed && trackOffSetIsZero >= 3) {
currentTopBarHeight = newHeight
} else if (isExpandedWhenFirstDisplayed) {
currentTopBarHeight = newHeight
if (!ignorePreScrollDetection) {
val availableY = available.y.toInt()
val newOffset = (topBarOffset + availableY)
val coerced = newOffset.coerceIn(minimumValue = -offsetLimit, maximumValue = 0f)
topBarOffset = coerced
val newHeight = expandedTopBarMaxHeight + topBarOffset.roundToInt().dp

incrementTopBarOffset()
plateauTopBarOffset()

if (!isExpandedWhenFirstDisplayed && trackOffSetIsZero >= 3) {
currentTopBarHeight = newHeight
} else if (isExpandedWhenFirstDisplayed) {
currentTopBarHeight = newHeight
}

defineCurrentState()
}

defineCurrentState()
}

return Offset.Zero
Expand All @@ -200,6 +198,19 @@ class DefaultBehaviorOnScroll(
getCollapsedTitleAlpha()
}

private fun incrementTopBarOffset() {
if (topBarOffset == 0f) {
trackOffSetIsZero += 1
}
}

private fun plateauTopBarOffset() {
// Just keeping trackOffSetIsZero from storing high numbers that are above 3
if (trackOffSetIsZero > 6) {
trackOffSetIsZero = 3
}
}

/**
* In order to know the alpha value between 0F and 1F of the "expandedTitle subtitle column",
* we will use the height of the [CollapsingTopBar] which is the [currentTopBarHeight].
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.*
import timber.log.Timber

/**
* The default collapsed height of the [CollapsingTopBar]
Expand Down Expand Up @@ -94,7 +94,7 @@ internal val collapsedTitle: @Composable (Boolean, Float, @Composable () -> Unit
val exitAnimation = if (centeredTitleAndSubtitle)
slideOutVertically() + fadeOut() else fadeOut()
AnimatedVisibility(
visible = collapsedTitleAlpha in 0F.. 1F,
visible = collapsedTitleAlpha in 0F..1F,
enter = enterAnimation,
exit = exitAnimation
) { title() }
Expand Down Expand Up @@ -168,29 +168,33 @@ fun CollapsingTopBarScrollBehavior.collapse(
onFinishedCollapsing: () -> Unit = {}
) {
if (!isAlwaysCollapsed) {
ignorePreScrollDetection = true
collapseJob?.cancel()
collapseJob = coroutineScope.launch {
// Making sure the [CollapsingTopBar] can smoothly change height size
// Check the [CollapsingTopBarScrollBehavior.nestedScrollConnection] implementation
// for better understanding
trackOffSetIsZero = 0

val ascendingDistance: IntRange =
collapsedTopBarHeight.value.toInt()..expandedTopBarMaxHeight.value.toInt()
val descendingDistance = ascendingDistance.sortedDescending()

for (currentHeight in descendingDistance) {
val valueDecreasedTo = currentTopBarHeight - steps
if (currentTopBarHeight - steps > collapsedTopBarHeight) {
currentTopBarHeight = valueDecreasedTo
defineCurrentState()
delay(delay)
}
if (valueDecreasedTo <= collapsedTopBarHeight) {
// topBarOffset = collapsedTopBarHeight.value
currentTopBarHeight = collapsedTopBarHeight
Timber.d("Reached final step : collapse()")
ignorePreScrollDetection = false
// Making sure the [CollapsingTopBar] can smoothly change height size
// Check the [CollapsingTopBarScrollBehavior.nestedScrollConnection] implementation
// for better understanding
trackOffSetIsZero = 0
defineCurrentState()
onFinishedCollapsing()
}
if (currentTopBarHeight - steps > collapsedTopBarHeight) {
// topBarOffset = valueDecreasedTo.value
currentTopBarHeight = valueDecreasedTo
defineCurrentState()
delay(delay)
}
}
}
}
Expand Down Expand Up @@ -219,22 +223,28 @@ fun CollapsingTopBarScrollBehavior.expand(
onFinishedExpanding: () -> Unit = {}
) {
if (!isAlwaysCollapsed) {
ignorePreScrollDetection = true
expandJob?.cancel()
expandJob = coroutineScope.launch {
trackOffSetIsZero = 3
val ascendingDistance: IntRange =
collapsedTopBarHeight.value.toInt()..expandedTopBarMaxHeight.value.toInt()
for (currentHeight in ascendingDistance) {
if (currentTopBarHeight + steps < expandedTopBarMaxHeight) {
currentTopBarHeight += steps
defineCurrentState()
delay(delay)
}
if (currentTopBarHeight + steps >= expandedTopBarMaxHeight) {
val valueIncreasedTo = currentTopBarHeight + steps
if (valueIncreasedTo >= expandedTopBarMaxHeight) {
// topBarOffset = expandedTopBarMaxHeight.value
currentTopBarHeight = expandedTopBarMaxHeight
Timber.d("Reached final step : expand()")
ignorePreScrollDetection = false
trackOffSetIsZero = 3
defineCurrentState()
onFinishedExpanding()
}
if (valueIncreasedTo < expandedTopBarMaxHeight) {
// topBarOffset = valueIncreasedTo.value
currentTopBarHeight = valueIncreasedTo
defineCurrentState()
delay(delay)
}
}
}
}
Expand Down

0 comments on commit a2ae642

Please sign in to comment.