Skip to content

Commit 4ffc3f2

Browse files
add containerModifier to MorphLayout
1 parent e02f112 commit 4ffc3f2

File tree

2 files changed

+146
-7
lines changed

2 files changed

+146
-7
lines changed
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
package com.smarttoolfactory.composeimage.demo
2+
3+
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.background
5+
import androidx.compose.foundation.layout.*
6+
import androidx.compose.foundation.shape.RoundedCornerShape
7+
import androidx.compose.material.Text
8+
import androidx.compose.material3.ElevatedButton
9+
import androidx.compose.runtime.*
10+
import androidx.compose.ui.Modifier
11+
import androidx.compose.ui.graphics.Color
12+
import androidx.compose.ui.layout.ContentScale
13+
import androidx.compose.ui.platform.LocalDensity
14+
import androidx.compose.ui.res.painterResource
15+
import androidx.compose.ui.unit.dp
16+
import androidx.compose.ui.unit.sp
17+
import androidx.compose.ui.zIndex
18+
import com.smarttoolfactory.composeimage.R
19+
import com.smarttoolfactory.image.transform.HandlePlacement
20+
import com.smarttoolfactory.image.transform.MorphLayout
21+
22+
@Composable
23+
fun EditSizeDemo() {
24+
Column(
25+
modifier = Modifier
26+
.background(Color(0xff424242))
27+
.fillMaxSize()
28+
.padding(8.dp)
29+
) {
30+
31+
var enabled by remember { mutableStateOf(true) }
32+
33+
Spacer(modifier = Modifier.height(40.dp))
34+
35+
var zIndex1 by remember {
36+
mutableStateOf(0f)
37+
}
38+
39+
var zIndex2 by remember {
40+
mutableStateOf(0f)
41+
}
42+
43+
var zIndex3 by remember {
44+
mutableStateOf(0f)
45+
}
46+
47+
48+
val density = LocalDensity.current
49+
val size = (500 / density.density).dp
50+
51+
MorphLayout(
52+
modifier = Modifier.size(size),
53+
containerModifier = Modifier.zIndex(zIndex1),
54+
enabled = enabled,
55+
onDown = {
56+
zIndex1 = 1f
57+
},
58+
onUp = {
59+
zIndex1 = 0f
60+
}
61+
) {
62+
Image(
63+
painter = painterResource(id = R.drawable.landscape1),
64+
contentScale = ContentScale.FillBounds,
65+
contentDescription = "",
66+
)
67+
}
68+
69+
MorphLayout(
70+
containerModifier = Modifier.zIndex(zIndex2),
71+
handleRadius = 20.dp,
72+
enabled = enabled,
73+
handlePlacement = HandlePlacement.Side,
74+
onDown = {
75+
zIndex2 = 1f
76+
},
77+
onUp = {
78+
zIndex2 = 0f
79+
}
80+
) {
81+
Image(
82+
painter = painterResource(id = R.drawable.landscape2),
83+
contentScale = ContentScale.FillBounds,
84+
contentDescription = ""
85+
)
86+
}
87+
88+
MorphLayout(
89+
modifier = Modifier.size(width = 300.dp, height = 200.dp),
90+
containerModifier = Modifier.zIndex(zIndex3),
91+
enabled = enabled,
92+
handlePlacement = HandlePlacement.Both,
93+
onDown = {
94+
zIndex3 = 1f
95+
},
96+
onUp = {
97+
zIndex3 = 0f
98+
}
99+
) {
100+
Image(
101+
painter = painterResource(id = R.drawable.landscape3),
102+
contentScale = ContentScale.Fit,
103+
contentDescription = ""
104+
)
105+
}
106+
107+
MorphLayout(
108+
enabled = enabled
109+
) {
110+
Text(
111+
text = "Hello World",
112+
modifier = Modifier
113+
.background(
114+
Color.Red,
115+
RoundedCornerShape(25)
116+
)
117+
.padding(2.dp),
118+
fontSize = 20.sp,
119+
color = Color.White
120+
)
121+
}
122+
123+
124+
Spacer(modifier = Modifier.weight(1f))
125+
126+
ElevatedButton(
127+
modifier = Modifier
128+
.fillMaxWidth()
129+
.padding(8.dp),
130+
onClick = { enabled = !enabled }
131+
) {
132+
Text(if (enabled) "Disable" else "Enable")
133+
}
134+
Spacer(modifier = Modifier.height(50.dp))
135+
}
136+
}

image/src/main/java/com/smarttoolfactory/image/transform/MorphLayout.kt

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.smarttoolfactory.image.transform
22

3-
import androidx.compose.foundation.border
43
import androidx.compose.foundation.layout.Box
54
import androidx.compose.foundation.layout.fillMaxSize
65
import androidx.compose.foundation.layout.padding
@@ -11,10 +10,8 @@ import androidx.compose.ui.draw.clipToBounds
1110
import androidx.compose.ui.geometry.Offset
1211
import androidx.compose.ui.geometry.Rect
1312
import androidx.compose.ui.geometry.Size
14-
import androidx.compose.ui.graphics.Color
1513
import androidx.compose.ui.graphics.graphicsLayer
1614
import androidx.compose.ui.input.pointer.pointerInput
17-
import androidx.compose.ui.layout.onGloballyPositioned
1815
import androidx.compose.ui.platform.LocalDensity
1916
import androidx.compose.ui.unit.Dp
2017
import androidx.compose.ui.unit.DpSize
@@ -23,24 +20,30 @@ import androidx.compose.ui.unit.dp
2320
import com.smarttoolfactory.gesture.PointerRequisite
2421
import com.smarttoolfactory.gesture.detectPointerTransformGestures
2522

23+
/**
24+
* Composable that changes dimensions of its content from handles, translates its position
25+
* when dragged inside bounds
26+
*/
2627
@Composable
2728
fun MorphLayout(
2829
modifier: Modifier = Modifier,
30+
containerModifier: Modifier = Modifier,
2931
enabled: Boolean = true,
3032
handleRadius: Dp = 15.dp,
3133
handlePlacement: HandlePlacement = HandlePlacement.Corner,
34+
updatePhysicalSize: Boolean = false,
3235
onDown: () -> Unit = {},
3336
onMove: (DpSize) -> Unit = {},
3437
onUp: () -> Unit = {},
3538
content: @Composable () -> Unit
3639
) {
3740
MorphSubcomposeLayout(
38-
modifier = Modifier.border(4.dp, Color.Red),
41+
modifier = containerModifier,
3942
handleRadius = handleRadius,
40-
updatePhysicalSize = false,
43+
updatePhysicalSize = updatePhysicalSize,
4144
mainContent = {
4245
Box(
43-
modifier = modifier.border(2.dp, Color.Green).onGloballyPositioned { },
46+
modifier = modifier,
4447
contentAlignment = Alignment.Center
4548
) {
4649
content()
@@ -97,7 +100,7 @@ private fun MorphLayout(
97100

98101
with(LocalDensity.current) {
99102
touchRegionRadius = handleRadius.toPx()
100-
minDimension = (touchRegionRadius * 4)
103+
minDimension = (touchRegionRadius * if (handlePlacement == HandlePlacement.Corner) 4 else 6)
101104
size = updatedSize.toSize()
102105
}
103106

0 commit comments

Comments
 (0)