Skip to content

Commit 4f84daf

Browse files
add kdoc for MorphLayout and TransformLayout
1 parent 4ffc3f2 commit 4f84daf

File tree

2 files changed

+105
-84
lines changed

2 files changed

+105
-84
lines changed

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

Lines changed: 49 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,34 @@ import androidx.compose.foundation.layout.padding
66
import androidx.compose.runtime.*
77
import androidx.compose.ui.Alignment
88
import androidx.compose.ui.Modifier
9-
import androidx.compose.ui.draw.clipToBounds
109
import androidx.compose.ui.geometry.Offset
1110
import androidx.compose.ui.geometry.Rect
1211
import androidx.compose.ui.geometry.Size
13-
import androidx.compose.ui.graphics.graphicsLayer
14-
import androidx.compose.ui.input.pointer.pointerInput
1512
import androidx.compose.ui.platform.LocalDensity
1613
import androidx.compose.ui.unit.Dp
1714
import androidx.compose.ui.unit.DpSize
1815
import androidx.compose.ui.unit.IntSize
1916
import androidx.compose.ui.unit.dp
20-
import com.smarttoolfactory.gesture.PointerRequisite
21-
import com.smarttoolfactory.gesture.detectPointerTransformGestures
2217

2318
/**
2419
* Composable that changes dimensions of its content from handles, translates its position
2520
* when dragged inside bounds
21+
*
22+
* @param modifier is modifier of Composable used as [content]
23+
* @param containerModifier is modifier of SubcomposeLayout that measures content. Do not
24+
* set a **Size** modifier because [MorphSubcomposeLayout] measures with unbounded constraints
25+
* and size of this composable is changed. If you set a fixed size, size won't be calculated
26+
* accurately.
27+
* @param enabled flag for enabling morph operations and boroder and handle display
28+
* @param handleRadius radius of circular handles to implement morphing operations
29+
* @param handlePlacement determines how handles should be placed. They can be placed at corners
30+
* ot center of each side or both.
31+
* @param updatePhysicalSize when true this Composable's width inside parent is updated and
32+
* siblings get updated according to updated dimensions
33+
* @param onDown callback invoked when gesture has started
34+
* @param onMove callback notifies composable has a pointer down and invoking operations
35+
* @param onUp notifies last pointer down is now up
36+
* @param content is the composable that will be contained in this Composable
2637
*/
2738
@Composable
2839
fun MorphLayout(
@@ -123,43 +134,43 @@ private fun MorphLayout(
123134
onUp = onUp
124135
)
125136

126-
var zoom by remember { mutableStateOf(1f) }
127-
var offset by remember { mutableStateOf(Offset.Zero) }
137+
// var zoom by remember { mutableStateOf(1f) }
138+
// var offset by remember { mutableStateOf(Offset.Zero) }
128139

129140
val transformModifier = Modifier
130141
.padding(handleRadius)
131142
.fillMaxSize()
132-
.clipToBounds()
133-
.graphicsLayer {
134-
translationX = offset.x
135-
translationY = offset.y
136-
scaleX = zoom
137-
scaleY = zoom
138-
}
139-
.pointerInput(Unit) {
140-
detectPointerTransformGestures(
141-
requisite = PointerRequisite.GreaterThan,
142-
numberOfPointers = 1,
143-
onGesture = { _,
144-
gesturePan: Offset,
145-
gestureZoom: Float,
146-
_,
147-
_,
148-
_ ->
149-
val newScale = (zoom * gestureZoom).coerceIn(1f, 3f)
150-
val newOffset = offset + gesturePan
151-
zoom = newScale
152-
153-
val maxX = (size.width * (zoom - 1) / 2f)
154-
val maxY = (size.height * (zoom - 1) / 2f)
155-
156-
offset = Offset(
157-
newOffset.x.coerceIn(-maxX, maxX),
158-
newOffset.y.coerceIn(-maxY, maxY)
159-
)
160-
}
161-
)
162-
}
143+
// .clipToBounds()
144+
// .graphicsLayer {
145+
// translationX = offset.x
146+
// translationY = offset.y
147+
// scaleX = zoom
148+
// scaleY = zoom
149+
// }
150+
// .pointerInput(Unit) {
151+
// detectPointerTransformGestures(
152+
// requisite = PointerRequisite.GreaterThan,
153+
// numberOfPointers = 1,
154+
// onGesture = { _,
155+
// gesturePan: Offset,
156+
// gestureZoom: Float,
157+
// _,
158+
// _,
159+
// _ ->
160+
// val newScale = (zoom * gestureZoom).coerceIn(1f, 3f)
161+
// val newOffset = offset + gesturePan
162+
// zoom = newScale
163+
//
164+
// val maxX = (size.width * (zoom - 1) / 2f)
165+
// val maxY = (size.height * (zoom - 1) / 2f)
166+
//
167+
// offset = Offset(
168+
// newOffset.x.coerceIn(-maxX, maxX),
169+
// newOffset.y.coerceIn(-maxY, maxY)
170+
// )
171+
// }
172+
// )
173+
// }
163174

164175
ResizeImpl(
165176
modifier = editModifier,

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

Lines changed: 56 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,32 @@ import androidx.compose.foundation.layout.*
44
import androidx.compose.runtime.*
55
import androidx.compose.ui.Alignment
66
import androidx.compose.ui.Modifier
7-
import androidx.compose.ui.draw.clipToBounds
87
import androidx.compose.ui.geometry.Offset
98
import androidx.compose.ui.geometry.Rect
109
import androidx.compose.ui.geometry.Size
1110
import androidx.compose.ui.graphics.graphicsLayer
12-
import androidx.compose.ui.input.pointer.pointerInput
1311
import androidx.compose.ui.platform.LocalDensity
1412
import androidx.compose.ui.unit.Dp
1513
import androidx.compose.ui.unit.DpSize
1614
import androidx.compose.ui.unit.IntSize
1715
import androidx.compose.ui.unit.dp
18-
import com.smarttoolfactory.gesture.PointerRequisite
19-
import com.smarttoolfactory.gesture.detectPointerTransformGestures
2016
import kotlin.math.abs
2117

18+
/**
19+
* Composable that changes scale of its content from handles, translates its position
20+
* when dragged inside bounds
21+
*
22+
* @param modifier is modifier of Composable used as [content]
23+
24+
* @param enabled flag for enabling morph operations and boroder and handle display
25+
* @param handleRadius radius of circular handles to implement morphing operations
26+
* @param handlePlacement determines how handles should be placed. They can be placed at corners
27+
* ot center of each side or both.
28+
* @param onDown callback invoked when gesture has started
29+
* @param onMove callback notifies composable has a pointer down and invoking operations
30+
* @param onUp notifies last pointer down is now up
31+
* @param content is the composable that will be contained in this Composable
32+
*/
2233
@Composable
2334
fun TransformLayout(
2435
modifier: Modifier = Modifier,
@@ -103,11 +114,11 @@ private fun TransformLayout(
103114
)
104115
}
105116

106-
var innerTransform by remember {
107-
mutableStateOf(
108-
transform
109-
)
110-
}
117+
// var innerTransform by remember {
118+
// mutableStateOf(
119+
// transform
120+
// )
121+
// }
111122

112123

113124
var rectDraw by remember {
@@ -159,42 +170,42 @@ private fun TransformLayout(
159170
horizontal = handleRadius / abs(outerTransform.scaleX),
160171
vertical = handleRadius / abs(outerTransform.scaleY)
161172
)
162-
.clipToBounds()
163-
.graphicsLayer {
164-
translationX = innerTransform.translationX
165-
translationY = innerTransform.translationY
166-
scaleX = innerTransform.scaleX
167-
scaleY = innerTransform.scaleY
168-
}
169-
.pointerInput(Unit) {
170-
detectPointerTransformGestures(
171-
requisite = PointerRequisite.GreaterThan,
172-
numberOfPointers = 1,
173-
onGesture = { _,
174-
gesturePan: Offset,
175-
gestureZoom: Float,
176-
_,
177-
_,
178-
_ ->
179-
180-
val oldZoom = innerTransform.scaleX
181-
val offset =
182-
Offset(innerTransform.translationX, innerTransform.translationY)
183-
val zoom = (oldZoom * gestureZoom).coerceIn(1f, 3f)
184-
val newOffset = offset + gesturePan
185-
186-
val maxX = (size.width * (zoom - 1) / 2f)
187-
val maxY = (size.height * (zoom - 1) / 2f)
188-
189-
innerTransform = innerTransform.copy(
190-
translationX = newOffset.x.coerceIn(-maxX, maxX),
191-
translationY = newOffset.y.coerceIn(-maxY, maxY),
192-
scaleX = zoom,
193-
scaleY = zoom
194-
)
195-
}
196-
)
197-
}
173+
// .clipToBounds()
174+
// .graphicsLayer {
175+
// translationX = innerTransform.translationX
176+
// translationY = innerTransform.translationY
177+
// scaleX = innerTransform.scaleX
178+
// scaleY = innerTransform.scaleY
179+
// }
180+
// .pointerInput(Unit) {
181+
// detectPointerTransformGestures(
182+
// requisite = PointerRequisite.GreaterThan,
183+
// numberOfPointers = 1,
184+
// onGesture = { _,
185+
// gesturePan: Offset,
186+
// gestureZoom: Float,
187+
// _,
188+
// _,
189+
// _ ->
190+
//
191+
// val oldZoom = innerTransform.scaleX
192+
// val offset =
193+
// Offset(innerTransform.translationX, innerTransform.translationY)
194+
// val zoom = (oldZoom * gestureZoom).coerceIn(1f, 3f)
195+
// val newOffset = offset + gesturePan
196+
//
197+
// val maxX = (size.width * (zoom - 1) / 2f)
198+
// val maxY = (size.height * (zoom - 1) / 2f)
199+
//
200+
// innerTransform = innerTransform.copy(
201+
// translationX = newOffset.x.coerceIn(-maxX, maxX),
202+
// translationY = newOffset.y.coerceIn(-maxY, maxY),
203+
// scaleX = zoom,
204+
// scaleY = zoom
205+
// )
206+
// }
207+
// )
208+
// }
198209

199210
TransformImpl(
200211
modifier = editModifier,
@@ -244,4 +255,3 @@ private fun TransformImpl(
244255
}
245256
}
246257
}
247-

0 commit comments

Comments
 (0)