Skip to content

Commit ae51aa1

Browse files
update aspect ratio
1 parent d77a504 commit ae51aa1

File tree

4 files changed

+144
-18
lines changed

4 files changed

+144
-18
lines changed

app/src/main/java/com/smarttoolfactory/composecropper/preferences/AspectRatioSelection.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,46 @@
11
package com.smarttoolfactory.composecropper.preferences
22

3+
import androidx.compose.foundation.layout.padding
34
import androidx.compose.foundation.layout.width
45
import androidx.compose.runtime.*
56
import androidx.compose.ui.Modifier
67
import androidx.compose.ui.graphics.graphicsLayer
78
import androidx.compose.ui.unit.Dp
9+
import androidx.compose.ui.unit.dp
810
import com.smarttoolfactory.animatedlist.AnimatedInfiniteLazyRow
911
import com.smarttoolfactory.animatedlist.model.AnimationProgress
10-
import com.smarttoolfactory.cropper.model.AspectRatioModel
12+
import com.smarttoolfactory.cropper.model.CropAspectRatio
1113
import com.smarttoolfactory.cropper.model.aspectRatios
12-
import com.smarttoolfactory.cropper.widget.ShapeSelection
14+
import com.smarttoolfactory.cropper.widget.AspectRatioSelectionCard
1315

1416
@Composable
1517
internal fun AnimatedAspectRatioSelection(
1618
modifier: Modifier = Modifier,
1719
initialSelectedIndex: Int = 2,
18-
onAspectRatioChange: (AspectRatioModel) -> Unit
20+
onAspectRatioChange: (CropAspectRatio) -> Unit
1921
) {
2022

2123
var currentIndex by remember { mutableStateOf(initialSelectedIndex) }
2224

2325
AnimatedInfiniteLazyRow(
24-
modifier = modifier,
26+
modifier = modifier.padding(horizontal = 10.dp),
2527
items = aspectRatios,
28+
inactiveItemPercent = 80,
2629
initialFirstVisibleIndex = initialSelectedIndex - 2
27-
) { animationProgress: AnimationProgress, index: Int, item: AspectRatioModel, width: Dp ->
30+
) { animationProgress: AnimationProgress, index: Int, item: CropAspectRatio, width: Dp ->
2831

2932
val scale = animationProgress.scale
3033
val color = animationProgress.color
3134
val selectedLocalIndex = animationProgress.itemIndex
3235

33-
ShapeSelection(modifier = Modifier
36+
AspectRatioSelectionCard(modifier = Modifier
3437
.graphicsLayer {
38+
scaleX = scale
3539
scaleY = scale
3640
}
3741
.width(width),
3842
color = color,
39-
shapeModel = item
43+
cropShape = item
4044
)
4145

4246
if (currentIndex != selectedLocalIndex) {

cropper/src/main/java/com/smarttoolfactory/cropper/model/AspectRatios.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ import com.smarttoolfactory.cropper.util.createRectShape
66
* Aspect ratio list with pre-defined aspect ratios
77
*/
88
val aspectRatios = listOf(
9-
AspectRatioModel("9:16", createRectShape(AspectRatio(9 / 16f)), AspectRatio(9 / 16f)),
10-
AspectRatioModel("2:3", createRectShape(AspectRatio(2 / 3f)), AspectRatio(2 / 3f)),
11-
AspectRatioModel("Full", createRectShape(AspectRatio.Unspecified), AspectRatio.Unspecified),
12-
AspectRatioModel("1:1", createRectShape(AspectRatio(1 / 1f)), AspectRatio(1 / 1f)),
13-
AspectRatioModel("16:9", createRectShape(AspectRatio(16 / 9f)), AspectRatio(16 / 9f)),
14-
AspectRatioModel("1.91:1", createRectShape(AspectRatio(1.91f / 1f)), AspectRatio(1.91f / 1f)),
15-
AspectRatioModel("3:2", createRectShape(AspectRatio(3 / 2f)), AspectRatio(3 / 2f)),
16-
AspectRatioModel("3:4", createRectShape(AspectRatio(3 / 4f)), AspectRatio(3 / 4f)),
17-
AspectRatioModel("3:5", createRectShape(AspectRatio(3 / 5f)), AspectRatio(3 / 5f))
9+
CropAspectRatio("9:16", createRectShape(AspectRatio(9 / 16f)), AspectRatio(9 / 16f)),
10+
CropAspectRatio("2:3", createRectShape(AspectRatio(2 / 3f)), AspectRatio(2 / 3f)),
11+
CropAspectRatio("Full", createRectShape(AspectRatio.Unspecified), AspectRatio.Unspecified),
12+
CropAspectRatio("1:1", createRectShape(AspectRatio(1 / 1f)), AspectRatio(1 / 1f)),
13+
CropAspectRatio("16:9", createRectShape(AspectRatio(16 / 9f)), AspectRatio(16 / 9f)),
14+
CropAspectRatio("1.91:1", createRectShape(AspectRatio(1.91f / 1f)), AspectRatio(1.91f / 1f)),
15+
CropAspectRatio("3:2", createRectShape(AspectRatio(3 / 2f)), AspectRatio(3 / 2f)),
16+
CropAspectRatio("3:4", createRectShape(AspectRatio(3 / 4f)), AspectRatio(3 / 4f)),
17+
CropAspectRatio("3:5", createRectShape(AspectRatio(3 / 5f)), AspectRatio(3 / 5f))
1818
)

cropper/src/main/java/com/smarttoolfactory/cropper/model/AspectRatioModel.kt renamed to cropper/src/main/java/com/smarttoolfactory/cropper/model/CropAspectRatio.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import androidx.compose.ui.graphics.Shape
88
* for setting overlay in state and UI
99
*/
1010
@Immutable
11-
data class AspectRatioModel(
11+
data class CropAspectRatio(
1212
override val title: String,
1313
override val shape: Shape,
1414
val aspectRatio: AspectRatio = AspectRatio.Unspecified
15-
):ShapeModel(title, shape)
15+
):CropShape(title, shape)
1616

1717
/**
1818
* Value class for containing aspect ratio
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package com.smarttoolfactory.cropper.widget
2+
3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.*
5+
import androidx.compose.foundation.shape.RoundedCornerShape
6+
import androidx.compose.material.Text
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.ui.Alignment
9+
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.draw.drawWithContent
11+
import androidx.compose.ui.draw.shadow
12+
import androidx.compose.ui.graphics.Color
13+
import androidx.compose.ui.graphics.drawOutline
14+
import androidx.compose.ui.graphics.drawscope.Stroke
15+
import androidx.compose.ui.graphics.drawscope.translate
16+
import androidx.compose.ui.platform.LocalDensity
17+
import androidx.compose.ui.platform.LocalLayoutDirection
18+
import androidx.compose.ui.unit.dp
19+
import androidx.compose.ui.unit.sp
20+
import com.smarttoolfactory.cropper.model.CropShape
21+
22+
@Composable
23+
fun AspectRatioSelectionCard(
24+
modifier: Modifier = Modifier,
25+
color: Color,
26+
cropShape: CropShape
27+
) {
28+
Box(
29+
modifier = modifier
30+
.background(Color.White)
31+
.padding(4.dp)
32+
) {
33+
Column(horizontalAlignment = Alignment.CenterHorizontally) {
34+
val density = LocalDensity.current
35+
val layoutDirection = LocalLayoutDirection.current
36+
Box(modifier = Modifier
37+
.fillMaxWidth()
38+
.padding(4.dp)
39+
.aspectRatio(1f)
40+
.drawWithContent {
41+
42+
val outline = cropShape.shape.createOutline(
43+
size = size,
44+
layoutDirection = layoutDirection,
45+
density = density
46+
)
47+
48+
val width = size.width
49+
val height = size.height
50+
val outlineWidth = outline.bounds.width
51+
val outlineHeight = outline.bounds.height
52+
53+
translate(
54+
left = (width - outlineWidth) / 2,
55+
top = (height - outlineHeight) / 2
56+
) {
57+
drawOutline(
58+
outline = outline,
59+
color = color,
60+
style = Stroke(3.dp.toPx())
61+
)
62+
}
63+
}
64+
)
65+
if(cropShape.title.isNotEmpty()){
66+
Text(text = cropShape.title, color = color, fontSize = 14.sp)
67+
}
68+
}
69+
}
70+
}
71+
72+
@Composable
73+
fun AspectRatioSelectionCard(
74+
modifier: Modifier = Modifier,
75+
isSelected: Boolean,
76+
activeColor: Color = Color.Red,
77+
inactiveColor: Color = Color.LightGray,
78+
cropShape: CropShape
79+
) {
80+
Box(
81+
modifier = modifier
82+
.shadow(1.dp, RoundedCornerShape(8.dp))
83+
.background(Color.White)
84+
.padding(4.dp)
85+
) {
86+
Column(horizontalAlignment = Alignment.CenterHorizontally) {
87+
val density = LocalDensity.current
88+
val layoutDirection = LocalLayoutDirection.current
89+
val color = if (isSelected) activeColor else inactiveColor
90+
Box(modifier = Modifier
91+
.fillMaxWidth()
92+
.padding(4.dp)
93+
.aspectRatio(1f)
94+
.drawWithContent {
95+
96+
val outline = cropShape.shape.createOutline(
97+
size = size,
98+
layoutDirection = layoutDirection,
99+
density = density
100+
)
101+
102+
val width = size.width
103+
val height = size.height
104+
val outlineWidth = outline.bounds.width
105+
val outlineHeight = outline.bounds.height
106+
107+
translate(
108+
left = (width - outlineWidth) / 2,
109+
top = (height - outlineHeight) / 2
110+
) {
111+
drawOutline(
112+
outline = outline,
113+
color = color,
114+
style = Stroke(3.dp.toPx())
115+
)
116+
}
117+
}
118+
)
119+
Text(text = cropShape.title, color = color, fontSize = 14.sp)
120+
}
121+
}
122+
}

0 commit comments

Comments
 (0)