Skip to content

Commit 59cc5e7

Browse files
Merge branch 'feature/zoom-enhanced' into develop
2 parents 8fc483e + 9f035d1 commit 59cc5e7

55 files changed

Lines changed: 4955 additions & 541 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 324 additions & 27 deletions
Large diffs are not rendered by default.

app/build.gradle

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ plugins {
55

66
android {
77
namespace 'com.smarttoolfactory.composeimage'
8-
compileSdk 32
8+
compileSdk 33
99

1010
defaultConfig {
11-
applicationId "com.example.composeimage"
11+
applicationId "com.smarttoolfactory.composeimage"
1212
minSdk 21
13-
targetSdk 32
13+
targetSdk 33
1414
versionCode 1
1515
versionName "1.0"
1616

@@ -51,7 +51,7 @@ dependencies {
5151
implementation project(':image')
5252

5353
implementation 'androidx.core:core-ktx:1.8.0'
54-
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.0'
54+
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
5555

5656
implementation 'com.github.SmartToolFactory:Compose-Extended-Gestures:2.0.0'
5757

@@ -66,12 +66,12 @@ dependencies {
6666
implementation "androidx.compose.material:material-icons-core:$compose_version"
6767
implementation "androidx.compose.material:material-icons-extended:$compose_version"
6868
// Integration with activities
69-
implementation 'androidx.activity:activity-compose:1.5.0'
69+
implementation 'androidx.activity:activity-compose:1.5.1'
7070
// Integration with ViewModels
71-
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.5.0'
71+
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1'
7272

7373
// Material Design 3 for Compose
74-
implementation "androidx.compose.material3:material3:1.0.0-alpha14"
74+
implementation "androidx.compose.material3:material3:1.0.0-alpha16"
7575

7676
// Photo Picker
7777
implementation("com.google.modernstorage:modernstorage-photopicker:1.0.0-alpha06")
@@ -80,9 +80,13 @@ dependencies {
8080
implementation("io.coil-kt:coil-compose:2.1.0")
8181

8282
// ExoPlayer
83-
implementation 'com.google.android.exoplayer:exoplayer:2.18.0'
83+
implementation 'com.google.android.exoplayer:exoplayer:2.18.1'
8484

85-
def accompanist_version = "0.24.12-rc"
85+
86+
def nav_compose_version = "2.5.1"
87+
implementation "androidx.navigation:navigation-compose:$nav_compose_version"
88+
89+
def accompanist_version = "0.25.0"
8690
// Accompanist
8791
implementation "com.google.accompanist:accompanist-systemuicontroller:$accompanist_version"
8892
implementation "com.google.accompanist:accompanist-pager:$accompanist_version"

app/src/main/java/com/smarttoolfactory/composeimage/ContentScaleSelectionMenu.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import androidx.compose.ui.unit.sp
1717
val contentScaleOptions =
1818
listOf("None", "Fit", "Crop", "FillBounds", "FillWidth", "FillHeight", "Inside")
1919

20+
@OptIn(ExperimentalMaterial3Api::class)
2021
@Composable
2122
fun ContentScaleSelectionMenu(
2223
contentScale: ContentScale,
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.smarttoolfactory.composeimage
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.ui.Modifier
5+
import androidx.navigation.NavHostController
6+
import androidx.navigation.compose.NavHost
7+
import androidx.navigation.compose.composable
8+
import androidx.navigation.compose.rememberNavController
9+
import com.smarttoolfactory.composeimage.screen.*
10+
11+
12+
@Composable
13+
fun DemoNavGraph(
14+
modifier: Modifier = Modifier,
15+
navController: NavHostController = rememberNavController(),
16+
startDestination: String = Destinations.Home,
17+
) {
18+
19+
NavHost(
20+
modifier = modifier,
21+
navController = navController,
22+
startDestination = startDestination
23+
) {
24+
25+
composable(route = Destinations.Home) { navBackEntryStack ->
26+
DemoSelectionScreen { route: String ->
27+
navController.navigate(route)
28+
}
29+
}
30+
31+
composable(route = Destinations.Image) { navBackEntryStack ->
32+
ImageDemoScreen()
33+
}
34+
composable(route = Destinations.Zoom) { navBackEntryStack ->
35+
ZoomDemoScreen()
36+
}
37+
composable(route = Destinations.Transform) { navBackEntryStack ->
38+
TransformDemoScreen()
39+
}
40+
composable(route = Destinations.BeforeAfter) { navBackEntryStack ->
41+
BeforeAfterDemoScreen()
42+
}
43+
}
44+
}
45+
46+
object Destinations {
47+
const val Home = "selection_screen"
48+
const val Image = "image_screen"
49+
const val Zoom = "zoom_screen"
50+
const val Transform = "transform_screen"
51+
const val BeforeAfter = "before_after_screen"
52+
}

app/src/main/java/com/smarttoolfactory/composeimage/MainActivity.kt

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,21 @@ import com.google.accompanist.pager.ExperimentalPagerApi
1818
import com.google.accompanist.pager.HorizontalPager
1919
import com.google.accompanist.pager.PagerState
2020
import com.google.accompanist.pager.rememberPagerState
21-
import com.smarttoolfactory.composeimage.demo.*
21+
import com.smarttoolfactory.composeimage.demo.ImageWithConstraintsDemo
22+
import com.smarttoolfactory.composeimage.demo.ThumbnailDemo
23+
import com.smarttoolfactory.composeimage.demo.beforeafter.BeforeAfterImageDemo
24+
import com.smarttoolfactory.composeimage.demo.beforeafter.BeforeAfterLayoutDemo
25+
import com.smarttoolfactory.composeimage.demo.transform.EditScaleDemo
26+
import com.smarttoolfactory.composeimage.demo.transform.EditSizeDemo
27+
import com.smarttoolfactory.composeimage.demo.zoom.AnimatedZoomDemo
28+
import com.smarttoolfactory.composeimage.demo.zoom.EnhancedZoomCropDemo
29+
import com.smarttoolfactory.composeimage.demo.zoom.EnhancedZoomDemo
30+
import com.smarttoolfactory.composeimage.demo.zoom.ZoomDemo
2231
import com.smarttoolfactory.composeimage.ui.theme.ComposeImageTheme
2332
import kotlinx.coroutines.launch
2433

2534
class MainActivity : ComponentActivity() {
35+
2636
override fun onCreate(savedInstanceState: Bundle?) {
2737
super.onCreate(savedInstanceState)
2838
setContent {
@@ -32,13 +42,16 @@ class MainActivity : ComponentActivity() {
3242
modifier = Modifier.fillMaxSize(),
3343
color = MaterialTheme.colorScheme.background
3444
) {
35-
HomeContent()
45+
// Uncomment to display demos on pager in one screen
46+
// HomeContent()
47+
DemoNavGraph()
3648
}
3749
}
3850
}
3951
}
4052
}
4153

54+
@OptIn(ExperimentalMaterial3Api::class)
4255
@ExperimentalPagerApi
4356
@Composable
4457
private fun HomeContent() {
@@ -89,23 +102,30 @@ private fun HomeContent() {
89102
when (page) {
90103
0 -> ImageWithConstraintsDemo()
91104
1 -> ThumbnailDemo()
92-
2 -> EditScaleDemo()
93-
3 -> EditSizeDemo()
94-
4 -> ZoomDemo()
95-
5 -> BeforeAfterImageDemo()
96-
else -> BeforeAfterLayoutDemo()
105+
2 -> ZoomDemo()
106+
3 -> EnhancedZoomDemo()
107+
4 -> EnhancedZoomCropDemo()
108+
5 -> AnimatedZoomDemo()
109+
6 -> BeforeAfterImageDemo()
110+
7 -> BeforeAfterLayoutDemo()
111+
8 -> EditScaleDemo()
112+
else -> EditSizeDemo()
97113
}
98114
}
99115
}
100116
}
101117

118+
102119
internal val tabList =
103120
listOf(
104121
"Image Constraints",
105122
"Image Thumbnail",
106-
"Editable Scale",
107-
"Editable Size",
108123
"Zoom",
124+
"Enhanced Zoom",
125+
"Enhanced Zoom Crop",
126+
"Animated Zoom",
109127
"Before/After Image",
110128
"Before/After Layout",
129+
"Editable Scale",
130+
"Editable Size",
111131
)
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package com.smarttoolfactory.composeimage
2+
3+
import androidx.compose.foundation.layout.fillMaxWidth
4+
import androidx.compose.foundation.layout.padding
5+
import androidx.compose.material3.*
6+
import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.runtime.rememberCoroutineScope
9+
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.unit.dp
11+
import com.google.accompanist.pager.ExperimentalPagerApi
12+
import com.google.accompanist.pager.HorizontalPager
13+
import com.google.accompanist.pager.PagerState
14+
import com.google.accompanist.pager.rememberPagerState
15+
import kotlinx.coroutines.launch
16+
17+
@OptIn(ExperimentalMaterial3Api::class)
18+
@ExperimentalPagerApi
19+
@Composable
20+
fun PagerContent(content: Map<String, @Composable () -> Unit>) {
21+
22+
val pagerState: PagerState = rememberPagerState(initialPage = 0)
23+
24+
val coroutineScope = rememberCoroutineScope()
25+
26+
val tabList = content.keys.toList()
27+
val pages: List<@Composable () -> Unit> = content.values.toList()
28+
29+
Scaffold(
30+
topBar = {
31+
if(content.size <3){
32+
TabRow(
33+
modifier = Modifier.fillMaxWidth(),
34+
// Our selected tab is our current page
35+
selectedTabIndex = pagerState.currentPage,
36+
// Override the indicator, using the provided pagerTabIndicatorOffset modifier
37+
indicator = { tabPositions: List<TabPosition> ->
38+
TabRowDefaults.Indicator(
39+
modifier = Modifier.tabIndicatorOffset(
40+
tabPositions[pagerState.currentPage]
41+
),
42+
height = 4.dp
43+
)
44+
},
45+
) {
46+
// Add tabs for all of our pages
47+
tabList.forEachIndexed { index, title ->
48+
Tab(
49+
text = { Text(title) },
50+
selected = pagerState.currentPage == index,
51+
onClick = {
52+
coroutineScope.launch {
53+
pagerState.animateScrollToPage(index)
54+
}
55+
}
56+
)
57+
}
58+
}
59+
}else {
60+
ScrollableTabRow(
61+
modifier = Modifier.fillMaxWidth(),
62+
// Our selected tab is our current page
63+
selectedTabIndex = pagerState.currentPage,
64+
// Override the indicator, using the provided pagerTabIndicatorOffset modifier
65+
indicator = { tabPositions: List<TabPosition> ->
66+
TabRowDefaults.Indicator(
67+
modifier = Modifier.tabIndicatorOffset(
68+
tabPositions[pagerState.currentPage]
69+
),
70+
height = 4.dp
71+
)
72+
},
73+
edgePadding = 4.dp
74+
) {
75+
// Add tabs for all of our pages
76+
tabList.forEachIndexed { index, title ->
77+
Tab(
78+
text = { Text(title) },
79+
selected = pagerState.currentPage == index,
80+
onClick = {
81+
coroutineScope.launch {
82+
pagerState.animateScrollToPage(index)
83+
}
84+
}
85+
)
86+
}
87+
}
88+
}
89+
}
90+
) {
91+
HorizontalPager(
92+
modifier = Modifier.padding(it),
93+
state = pagerState,
94+
count = content.size
95+
) { page: Int ->
96+
pages[page].invoke()
97+
98+
}
99+
}
100+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.smarttoolfactory.composeimage
2+
3+
import androidx.compose.foundation.layout.padding
4+
import androidx.compose.material3.MaterialTheme
5+
import androidx.compose.material3.Text
6+
import androidx.compose.runtime.Composable
7+
import androidx.compose.ui.Modifier
8+
import androidx.compose.ui.text.font.FontWeight
9+
import androidx.compose.ui.unit.dp
10+
import androidx.compose.ui.unit.sp
11+
12+
@Composable
13+
fun TitleMedium(text:String){
14+
Text(
15+
text = text,
16+
fontSize = 16.sp,
17+
fontWeight = FontWeight.Bold,
18+
color = MaterialTheme.colorScheme.primary,
19+
modifier = Modifier.padding(8.dp)
20+
)
21+
}

app/src/main/java/com/smarttoolfactory/composeimage/demo/ImageScaleDemo.kt renamed to app/src/main/java/com/smarttoolfactory/composeimage/demo/ImageWithConstraintsDemo.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import com.smarttoolfactory.image.ImageWithConstraints
3333
@Composable
3434
fun ImageWithConstraintsDemo() {
3535

36+
println("🔥 ImageWithConstraintsDemo")
37+
3638
val imageBitmapLarge = ImageBitmap.imageResource(
3739
LocalContext.current.resources, R.drawable.landscape2
3840
)
@@ -199,7 +201,7 @@ private fun CropSample(
199201
Button(
200202
modifier = Modifier
201203
.padding(8.dp)
202-
.fillMaxSize(),
204+
.fillMaxWidth(),
203205
onClick = { showDialog = true }) {
204206
Text("Crop")
205207
}

app/src/main/java/com/smarttoolfactory/composeimage/demo/ThumbnailDemo.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import com.smarttoolfactory.image.*
3434
@Composable
3535
fun ThumbnailDemo() {
3636

37+
println("🍏 ThumbnailDemo")
38+
3739
val imageBitmapLarge = ImageBitmap.imageResource(
3840
LocalContext.current.resources,
3941
R.drawable.landscape4

app/src/main/java/com/smarttoolfactory/composeimage/demo/BeforeAfterImageDemo.kt renamed to app/src/main/java/com/smarttoolfactory/composeimage/demo/beforeafter/BeforeAfterImageDemo.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.smarttoolfactory.composeimage.demo
1+
package com.smarttoolfactory.composeimage.demo.beforeafter
22

33
import androidx.compose.animation.core.*
44
import androidx.compose.foundation.border

0 commit comments

Comments
 (0)