Skip to content

Commit d4a3997

Browse files
Merge pull request #27 from MrRuslanYT/compose-swipedirection
Added swipedirections for compose
2 parents b2ef5b1 + 00282bd commit d4a3997

File tree

10 files changed

+399
-49
lines changed

10 files changed

+399
-49
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,12 +400,13 @@ fun FragulaNavHost(
400400
modifier: Modifier = Modifier,
401401
route: String? = null,
402402
onPageScrolled: (Int, Float, Int) -> Unit, // Scroll listener (position, offset, offsetPixels)
403+
swipeDirection: SwipeDirection = SwipeDirection.LEFT_TO_RIGHT, // Scroll direction
403404
scrollable: Boolean = true, // Controls user's scrolling
404405
scrimColor: Color = ScrimColor, // Color used for the dimming
405406
scrimAmount: Float = 0.15f, // Percentage of dimming (depends on drag offset)
407+
elevationAmount: Dp = 3.dp, // Elevation applied on the composable
406408
parallaxFactor: Float = 1.3f, // Parallax multiplier (depends on drag offset)
407409
animDurationMs: Int = 500, // Duration of swipe animation
408-
elevation: Dp = 3.dp, // Elevation applied on the composable
409410
builder: NavGraphBuilder.() -> Unit
410411
) {
411412
// ...

app/src/main/kotlin/com/fragula2/sample/compose/ComposeActivity.kt

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,46 @@ import androidx.activity.ComponentActivity
2222
import androidx.activity.compose.setContent
2323
import androidx.appcompat.graphics.drawable.DrawerArrowDrawable
2424
import androidx.compose.foundation.layout.fillMaxSize
25-
import androidx.compose.material.*
26-
import androidx.compose.runtime.*
25+
import androidx.compose.material.Icon
26+
import androidx.compose.material.IconButton
27+
import androidx.compose.material.MaterialTheme
28+
import androidx.compose.material.Scaffold
29+
import androidx.compose.material.Surface
30+
import androidx.compose.material.Text
31+
import androidx.compose.material.TopAppBar
32+
import androidx.compose.material.icons.Icons
33+
import androidx.compose.material.icons.filled.Settings
34+
import androidx.compose.runtime.Composable
35+
import androidx.compose.runtime.getValue
2736
import androidx.compose.runtime.mutableStateOf
2837
import androidx.compose.runtime.remember
38+
import androidx.compose.runtime.setValue
2939
import androidx.compose.ui.Modifier
3040
import androidx.compose.ui.platform.LocalContext
41+
import androidx.compose.ui.unit.dp
42+
import androidx.lifecycle.viewmodel.compose.viewModel
3143
import androidx.navigation.NavType
3244
import androidx.navigation.navArgument
45+
import com.fragula2.common.SwipeDirection
3346
import com.fragula2.compose.FragulaNavHost
3447
import com.fragula2.compose.rememberFragulaNavController
3548
import com.fragula2.compose.swipeable
3649
import com.fragula2.sample.compose.screen.DetailsScreen
3750
import com.fragula2.sample.compose.screen.ListScreen
3851
import com.fragula2.sample.compose.screen.ProfileScreen
52+
import com.fragula2.sample.compose.screen.SettingsScreen
3953
import com.fragula2.sample.compose.screen.TabScreen
4054
import com.fragula2.sample.compose.ui.FragulaTheme
55+
import com.fragula2.sample.compose.viewmodel.SettingsViewModel
56+
import com.fragula2.sample.utils.argbToColor
4157
import com.google.accompanist.drawablepainter.rememberDrawablePainter
4258

4359
class ComposeActivity : ComponentActivity() {
4460

4561
override fun onCreate(savedInstanceState: Bundle?) {
4662
super.onCreate(savedInstanceState)
4763
setContent {
64+
val settingsViewModel = viewModel<SettingsViewModel>()
4865
FragulaTheme {
4966
Surface(
5067
modifier = Modifier.fillMaxSize(),
@@ -58,11 +75,14 @@ class ComposeActivity : ComponentActivity() {
5875
arrowProgress = arrowProgress,
5976
onClick = {
6077
if (arrowProgress == 0f) {
61-
Toast.makeText(this, "Open", Toast.LENGTH_SHORT).show()
78+
Toast.makeText(this, "Open drawer", Toast.LENGTH_SHORT).show()
6279
} else {
6380
navController.popBackStack()
6481
}
6582
},
83+
onSettingsClick = {
84+
navController.navigate("settings")
85+
},
6686
)
6787
},
6888
) { paddingValues ->
@@ -76,6 +96,10 @@ class ComposeActivity : ComponentActivity() {
7696
else -> 0f
7797
}
7898
},
99+
swipeDirection = SwipeDirection.of(settingsViewModel.swipeDirection.value),
100+
scrimColor = settingsViewModel.scrimColor.value.argbToColor(),
101+
scrimAmount = settingsViewModel.scrimAmount.value,
102+
elevationAmount = settingsViewModel.elevationAmount.value.dp,
79103
) {
80104
swipeable("list") {
81105
ListScreen(navController)
@@ -113,6 +137,9 @@ class ComposeActivity : ComponentActivity() {
113137
text = backStackEntry.arguments?.getString("text") ?: "",
114138
)
115139
}
140+
swipeable("settings") {
141+
SettingsScreen(settingsViewModel)
142+
}
116143
}
117144
}
118145
}
@@ -125,6 +152,7 @@ class ComposeActivity : ComponentActivity() {
125152
private fun FragulaAppBar(
126153
arrowProgress: Float = 0f,
127154
onClick: () -> Unit = {},
155+
onSettingsClick: () -> Unit = {},
128156
) {
129157
TopAppBar(
130158
title = { Text("Fragula") },
@@ -139,5 +167,10 @@ private fun FragulaAppBar(
139167
)
140168
}
141169
},
170+
actions = {
171+
IconButton(onClick = onSettingsClick) {
172+
Icon(Icons.Default.Settings, null)
173+
}
174+
},
142175
)
143176
}
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
package com.fragula2.sample.compose.screen
2+
3+
import androidx.compose.foundation.BorderStroke
4+
import androidx.compose.foundation.background
5+
import androidx.compose.foundation.horizontalScroll
6+
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.PaddingValues
8+
import androidx.compose.foundation.layout.Row
9+
import androidx.compose.foundation.layout.fillMaxSize
10+
import androidx.compose.foundation.layout.fillMaxWidth
11+
import androidx.compose.foundation.layout.padding
12+
import androidx.compose.foundation.rememberScrollState
13+
import androidx.compose.foundation.shape.RoundedCornerShape
14+
import androidx.compose.foundation.verticalScroll
15+
import androidx.compose.material.Button
16+
import androidx.compose.material.ButtonDefaults
17+
import androidx.compose.material.MaterialTheme
18+
import androidx.compose.material.Text
19+
import androidx.compose.runtime.Composable
20+
import androidx.compose.runtime.getValue
21+
import androidx.compose.runtime.mutableStateOf
22+
import androidx.compose.runtime.remember
23+
import androidx.compose.runtime.setValue
24+
import androidx.compose.ui.Alignment
25+
import androidx.compose.ui.Modifier
26+
import androidx.compose.ui.graphics.Color
27+
import androidx.compose.ui.graphics.toArgb
28+
import androidx.compose.ui.unit.dp
29+
import com.fragula2.sample.compose.viewmodel.SettingsViewModel
30+
import com.fragula2.sample.utils.argbToColor
31+
32+
@Composable
33+
fun SettingsScreen(settingsViewModel: SettingsViewModel) {
34+
val directionsList = listOf(0f, 1f, 2f, 3f) // SwipeDirection values
35+
val scrimAmountList = listOf(0.15f, 0.30f, 0.45f, 0.60f, 0.75f, 0.90f, 1f)
36+
val elevationAmountList = listOf(0f, 1f, 3f, 6f, 9f, 12f, 15f, 18f)
37+
38+
Column(
39+
modifier = Modifier
40+
.background(MaterialTheme.colors.background)
41+
.padding(16.dp)
42+
.padding(bottom = 12.dp)
43+
.fillMaxSize()
44+
.verticalScroll(rememberScrollState()),
45+
) {
46+
Text(
47+
modifier = Modifier
48+
.padding(top = 20.dp)
49+
.align(Alignment.CenterHorizontally),
50+
text = "Swipe Direction",
51+
)
52+
FloatButtonsRow(
53+
modifier = Modifier.padding(top = 10.dp),
54+
values = directionsList,
55+
selectedFloat = settingsViewModel.swipeDirection.value.toFloat(),
56+
) { value ->
57+
settingsViewModel.swipeDirection.value = value.toInt()
58+
}
59+
60+
Text(
61+
modifier = Modifier
62+
.padding(top = 20.dp)
63+
.align(Alignment.CenterHorizontally),
64+
text = "Scrim Color",
65+
)
66+
ColorButtonsRow(
67+
modifier = Modifier.padding(top = 10.dp),
68+
selectedColor = settingsViewModel.scrimColor.value.argbToColor(),
69+
) { color ->
70+
settingsViewModel.scrimColor.value = color.toArgb()
71+
}
72+
73+
Text(
74+
modifier = Modifier
75+
.padding(top = 20.dp)
76+
.align(Alignment.CenterHorizontally),
77+
text = "Scrim Amount",
78+
)
79+
FloatButtonsRow(
80+
modifier = Modifier.padding(top = 10.dp),
81+
values = scrimAmountList,
82+
selectedFloat = settingsViewModel.scrimAmount.value,
83+
) { amount ->
84+
settingsViewModel.scrimAmount.value = amount
85+
}
86+
87+
Text(
88+
modifier = Modifier
89+
.padding(top = 20.dp)
90+
.align(Alignment.CenterHorizontally),
91+
text = "Elevation Amount",
92+
)
93+
FloatButtonsRow(
94+
modifier = Modifier.padding(top = 10.dp),
95+
values = elevationAmountList,
96+
selectedFloat = settingsViewModel.elevationAmount.value,
97+
) { amount ->
98+
settingsViewModel.elevationAmount.value = amount
99+
}
100+
}
101+
}
102+
103+
@Composable
104+
private fun ColorButtonsRow(
105+
modifier: Modifier = Modifier,
106+
selectedColor: Color,
107+
onColorClick: (value: Color) -> Unit = {},
108+
) {
109+
val colors = listOf(
110+
Color(0xFF000000),
111+
Color(0x00000000),
112+
Color.Red,
113+
Color.Green,
114+
Color.Blue,
115+
Color.Yellow,
116+
Color.Magenta,
117+
Color.White,
118+
)
119+
var selectedValue: Color by remember { mutableStateOf(selectedColor) }
120+
Row(
121+
modifier = modifier
122+
.fillMaxWidth()
123+
.horizontalScroll(rememberScrollState())
124+
.padding(16.dp),
125+
) {
126+
// Create a custom ButtonDefaults object to set contentPadding to zero
127+
for (color in colors) {
128+
Button(
129+
modifier = Modifier.padding(horizontal = 8.dp),
130+
onClick = {
131+
selectedValue = color
132+
onColorClick(color)
133+
},
134+
contentPadding = PaddingValues(0.dp),
135+
shape = RoundedCornerShape(8.dp),
136+
border = if (selectedValue == color) BorderStroke(2.dp, Color.Gray) else null,
137+
colors = ButtonDefaults.buttonColors(backgroundColor = color),
138+
) {}
139+
}
140+
}
141+
}
142+
143+
@Composable
144+
private fun FloatButtonsRow(
145+
modifier: Modifier = Modifier,
146+
values: List<Float>,
147+
selectedFloat: Float,
148+
onButtonClick: (value: Float) -> Unit = {},
149+
) {
150+
var selectedValue: Float by remember { mutableStateOf(selectedFloat) }
151+
Row(
152+
modifier = modifier
153+
.fillMaxWidth()
154+
.padding(16.dp)
155+
.horizontalScroll(rememberScrollState()),
156+
) {
157+
for (value in values) {
158+
Button(
159+
modifier = Modifier.padding(horizontal = 8.dp),
160+
onClick = {
161+
selectedValue = value
162+
onButtonClick(value)
163+
},
164+
shape = RoundedCornerShape(8.dp),
165+
border = if (selectedValue == value) BorderStroke(1.dp, Color.Gray) else null,
166+
) {
167+
Text(text = value.toString())
168+
}
169+
}
170+
}
171+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.fragula2.sample.compose.viewmodel
2+
3+
import androidx.compose.runtime.mutableStateOf
4+
import androidx.compose.ui.graphics.Color
5+
import androidx.compose.ui.graphics.toArgb
6+
import androidx.compose.ui.unit.dp
7+
import androidx.lifecycle.ViewModel
8+
import com.fragula2.common.SwipeDirection
9+
10+
class SettingsViewModel : ViewModel() {
11+
val swipeDirection = mutableStateOf(SwipeDirection.LEFT_TO_RIGHT.value)
12+
val elevationAmount = mutableStateOf(3.dp.value)
13+
val scrimColor = mutableStateOf(Color(0xFF000000).toArgb())
14+
val scrimAmount = mutableStateOf(0.15f)
15+
}

app/src/main/kotlin/com/fragula2/sample/utils/Extensions.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import android.widget.Toast
2323
import androidx.annotation.AttrRes
2424
import androidx.appcompat.app.ActionBar
2525
import androidx.appcompat.app.AppCompatActivity
26+
import androidx.compose.ui.graphics.Color
2627
import androidx.core.view.ViewCompat
2728
import androidx.core.view.WindowCompat
2829
import androidx.core.view.WindowInsetsCompat
@@ -70,4 +71,13 @@ fun View.applySystemWindowInsetsPadding(
7071

7172
insets
7273
}
74+
}
75+
76+
fun Int.argbToColor(): Color {
77+
val alpha = (this shr 24 and 0xFF) / 255f
78+
val red = (this shr 16 and 0xFF) / 255f
79+
val green = (this shr 8 and 0xFF) / 255f
80+
val blue = (this and 0xFF) / 255f
81+
82+
return Color(red, green, blue, alpha)
7383
}

fragula-common/api/fragula-common.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ public final class com/fragula2/common/SwipeDirection : java/lang/Enum {
55
public static final field RIGHT_TO_LEFT Lcom/fragula2/common/SwipeDirection;
66
public static final field TOP_TO_BOTTOM Lcom/fragula2/common/SwipeDirection;
77
public final fun getValue ()I
8+
public final fun isHorizontal ()Z
9+
public final fun isReversed ()Z
810
public static fun valueOf (Ljava/lang/String;)Lcom/fragula2/common/SwipeDirection;
911
public static fun values ()[Lcom/fragula2/common/SwipeDirection;
1012
}

fragula-common/src/main/kotlin/com/fragula2/common/SwipeDirection.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ enum class SwipeDirection(val value: Int) {
2222
TOP_TO_BOTTOM(2),
2323
BOTTOM_TO_TOP(3);
2424

25+
fun isHorizontal(): Boolean = (this == LEFT_TO_RIGHT || this == RIGHT_TO_LEFT)
26+
27+
fun isReversed(): Boolean = (this == RIGHT_TO_LEFT || this == BOTTOM_TO_TOP)
28+
2529
companion object {
2630

2731
fun of(value: Int): SwipeDirection {

fragula-compose/api/fragula-compose.api

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ public final class com/fragula2/compose/ComposableSingletons$SwipeBackNavigatorK
66
}
77

88
public final class com/fragula2/compose/FragulaNavHostKt {
9-
public static final fun FragulaNavHost-Pxy4DCs (Landroidx/navigation/NavHostController;Ljava/lang/String;Landroidx/compose/ui/Modifier;Ljava/lang/String;Lkotlin/jvm/functions/Function3;ZJFFIFLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V
10-
public static final fun FragulaNavHost-WhgD3PA (Landroidx/navigation/NavHostController;Landroidx/navigation/NavGraph;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;ZJFFIFLandroidx/compose/runtime/Composer;I)V
9+
public static final fun FragulaNavHost-8NhoAOM (Landroidx/navigation/NavHostController;Ljava/lang/String;Landroidx/compose/ui/Modifier;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Lcom/fragula2/common/SwipeDirection;ZJFFFILkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V
10+
public static final fun FragulaNavHost-SerJt_A (Landroidx/navigation/NavHostController;Landroidx/navigation/NavGraph;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Lcom/fragula2/common/SwipeDirection;ZJFFFILandroidx/compose/runtime/Composer;II)V
1111
public static final fun swipeable (Landroidx/navigation/NavGraphBuilder;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lkotlin/jvm/functions/Function3;)V
1212
public static synthetic fun swipeable$default (Landroidx/navigation/NavGraphBuilder;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)V
1313
}

0 commit comments

Comments
 (0)