Skip to content

Commit c4f1d0b

Browse files
author
Masumori
committed
Refactor: create list of animation and remove unnecessary lines.
1 parent 62a81ea commit c4f1d0b

3 files changed

Lines changed: 31 additions & 123 deletions

File tree

example-app/src/main/java/com/mapconductor/example/pages/animation/AnimationMapComponent.kt

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.mapconductor.example.pages.animation
33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.key
55
import androidx.compose.ui.Modifier
6-
import com.mapconductor.core.circle.Circle
76
import com.mapconductor.core.circle.OnCircleEventHandler
87
import com.mapconductor.core.map.MapViewState
98
import com.mapconductor.core.map.OnMapEventHandler
@@ -21,7 +20,7 @@ fun AnimationMapComponent(
2120
onCircleClick: OnCircleEventHandler = {},
2221
onMarkerDrag: OnMarkerEventHandler = {},
2322
) {
24-
mapViewState?.let { it ->
23+
mapViewState?.let {
2524
MapViewContainer(
2625
modifier = modifier,
2726
state = it,
@@ -30,14 +29,8 @@ fun AnimationMapComponent(
3029
onCircleClick = onCircleClick,
3130
onMarkerDrag = onMarkerDrag,
3231
) {
33-
// Center marker (not draggable)
34-
key(viewModel.centerMarker.id) {
35-
Marker(viewModel.centerMarker)
36-
}
37-
38-
// Edge marker (draggable)
39-
key(viewModel.edgeMarker.id) {
40-
Marker(viewModel.edgeMarker)
32+
key(viewModel.bounceMarker.id) {
33+
Marker(viewModel.bounceMarker)
4134
}
4235
}
4336
}

example-app/src/main/java/com/mapconductor/example/pages/animation/AnimationMapPage.kt

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
package com.mapconductor.example.pages.animation
22

3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.Row
36
import androidx.compose.foundation.layout.calculateEndPadding
47
import androidx.compose.foundation.layout.calculateStartPadding
58
import androidx.compose.foundation.layout.fillMaxSize
69
import androidx.compose.foundation.layout.padding
10+
import androidx.compose.material3.Button
711
import androidx.compose.material3.Text
812
import androidx.compose.runtime.Composable
913
import androidx.compose.runtime.collectAsState
1014
import androidx.compose.ui.Alignment
1115
import androidx.compose.ui.Modifier
12-
import androidx.compose.ui.res.stringResource
1316
import androidx.compose.ui.unit.LayoutDirection
1417
import androidx.compose.ui.unit.dp
15-
import com.mapconductor.example.R
16-
import com.mapconductor.example.toast.ToastHost
1718
import com.mapconductor.example.ui.DemoMapPageScaffold
1819
import com.mapconductor.example.ui.MessageCard
1920

@@ -32,10 +33,7 @@ fun AnimationMapPage(
3233
AnimationMapComponent(
3334
mapViewState = mapViewState.value,
3435
viewModel = viewModel,
35-
onMapClick = viewModel::onMapClick,
3636
onMarkerClick = viewModel::onMarkerClick,
37-
onCircleClick = viewModel::onCircleClick,
38-
onMarkerDrag = viewModel::onMarkerDrag,
3937
)
4038

4139
// Message Card
@@ -48,17 +46,21 @@ fun AnimationMapPage(
4846
start = paddingValues.calculateStartPadding(LayoutDirection.Ltr) + 16.dp,
4947
end = paddingValues.calculateEndPadding(LayoutDirection.Ltr) + 16.dp,
5048
),
51-
title = "Messages",
49+
title = "Animation list",
5250
) {
53-
Text(
54-
text = stringResource(R.string.circle_example_description),
51+
Column(
5552
modifier = Modifier.fillMaxSize(),
56-
)
53+
verticalArrangement = Arrangement.spacedBy(8.dp),
54+
) {
55+
Row {
56+
Button(
57+
modifier = Modifier.weight(1f),
58+
onClick = { viewModel.onMarkerClick(viewModel.bounceMarker) },
59+
) {
60+
Text("Bounce")
61+
}
62+
}
63+
}
5764
}
58-
59-
ToastHost(
60-
messages = viewModel.messages.collectAsState().value,
61-
onDismiss = { viewModel.removeToast(it) },
62-
)
6365
}
6466
}
Lines changed: 11 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
11
package com.mapconductor.example.pages.animation
22

3-
import androidx.compose.runtime.MutableState
4-
import androidx.compose.runtime.derivedStateOf
53
import androidx.compose.runtime.getValue
6-
import androidx.compose.runtime.mutableStateOf
74
import androidx.compose.ui.graphics.Color
8-
import androidx.compose.ui.unit.dp
95
import androidx.lifecycle.ViewModel
10-
import com.mapconductor.core.circle.CircleClickEvent
11-
import com.mapconductor.core.circle.CircleState
126
import com.mapconductor.core.features.GeoPoint
137
import com.mapconductor.core.map.MapCameraPosition
148
import com.mapconductor.core.map.MapViewState
159
import com.mapconductor.core.marker.DefaultIcon
1610
import com.mapconductor.core.marker.MarkerAnimation
1711
import com.mapconductor.core.marker.MarkerState
18-
import com.mapconductor.core.spherical.calculatePositionAtDistance
19-
import com.mapconductor.core.spherical.haversineDistance
2012
import com.mapconductor.example.toast.ToastMessage
2113
import kotlinx.coroutines.flow.MutableStateFlow
2214
import kotlinx.coroutines.flow.StateFlow
@@ -28,24 +20,11 @@ interface AnimationPageViewModel {
2820
val messages: StateFlow<List<ToastMessage>>
2921

3022
val circleCenter: GeoPoint
31-
val radiusMeters: Double
32-
val centerMarker: MarkerState
33-
val edgeMarker: MarkerState
34-
val circleState: CircleState
23+
val bounceMarker: MarkerState
3524

3625
fun onMapViewChanged(state: MapViewState<*>)
3726

3827
fun onMarkerClick(clicked: MarkerState)
39-
40-
fun onMapClick(clicked: GeoPoint)
41-
42-
fun onCircleClick(event: CircleClickEvent)
43-
44-
fun onMarkerDrag(dragged: MarkerState)
45-
46-
fun showToast(text: String)
47-
48-
fun removeToast(toastMessage: ToastMessage)
4928
}
5029

5130
class AnimationPageViewModelImpl :
@@ -62,7 +41,6 @@ class AnimationPageViewModelImpl :
6241
Color.LightGray.copy(alpha = 0.2f),
6342
Color.Magenta.copy(alpha = 0.2f),
6443
)
65-
private var tapIdx = 0
6644

6745
override val initCameraPosition =
6846
MapCameraPosition(
@@ -79,58 +57,23 @@ class AnimationPageViewModelImpl :
7957

8058
override val circleCenter = GeoPoint.fromLatLong(21.382314, -157.933097)
8159

82-
override val centerMarker =
60+
private val _bounceMarker =
8361
MarkerState(
84-
id = "center_marker",
62+
id = "bounce_marker",
8563
position = circleCenter,
8664
icon =
8765
DefaultIcon(
88-
fillColor = Color.Red,
66+
fillColor = colors[0],
8967
strokeColor = Color.White,
90-
label = "C",
68+
label = "B",
9169
),
92-
draggable = false,
93-
)
94-
95-
private val _edgeMarker: MutableState<MarkerState> =
96-
mutableStateOf(
97-
MarkerState(
98-
id = "edge_marker",
99-
position =
100-
calculatePositionAtDistance(
101-
center = circleCenter,
102-
distanceMeters = 1000.0,
103-
bearingDegrees = 90.0, // East
104-
),
105-
icon =
106-
DefaultIcon(
107-
fillColor = Color.Green,
108-
strokeColor = Color.White,
109-
label = "E",
110-
),
111-
draggable = true,
112-
),
70+
// If the marker is set animation on creating an instance,
71+
// the marker will be animated when the map will be opened.
72+
animation = MarkerAnimation.Bounce,
11373
)
114-
override val edgeMarker: MarkerState
115-
get() = _edgeMarker.value
116-
117-
override val radiusMeters by derivedStateOf {
118-
haversineDistance(circleCenter, _edgeMarker.value.position)
119-
}
12074

121-
private val _circleState: MutableState<CircleState> =
122-
mutableStateOf(
123-
CircleState(
124-
id = "circle",
125-
center = circleCenter,
126-
radiusMeters = 1000.0, // Initial radius
127-
strokeColor = Color.Blue.copy(alpha = 0.5f),
128-
strokeWidth = 2.dp,
129-
fillColor = this.colors[0],
130-
),
131-
)
132-
override val circleState: CircleState
133-
get() = _circleState.value
75+
override val bounceMarker: MarkerState
76+
get() = _bounceMarker
13477

13578
private val _mapViewState = MutableStateFlow<MapViewState<*>?>(null)
13679
override val mapViewState: StateFlow<MapViewState<*>?> = _mapViewState.asStateFlow()
@@ -140,37 +83,7 @@ class AnimationPageViewModelImpl :
14083
}
14184

14285
override fun onMarkerClick(clicked: MarkerState) {
86+
// When you want to activate the marker, set the animation for the marker.
14387
clicked.animation = MarkerAnimation.Bounce
14488
}
145-
146-
override fun onMapClick(clicked: GeoPoint) {
147-
showToast("Map clicked at: ${clicked.toUrlValue()}")
148-
}
149-
150-
override fun onCircleClick(event: CircleClickEvent) {
151-
this.tapIdx = (this.tapIdx + 1) % this.colors.size
152-
event.state.fillColor = this.colors[this.tapIdx]
153-
showToast("Circle clicked - Radius: ${radiusMeters.toInt()}m")
154-
}
155-
156-
override fun onMarkerDrag(dragged: MarkerState) {
157-
_edgeMarker.value.position = dragged.position
158-
159-
// Update circle radius
160-
_circleState.value.radiusMeters = radiusMeters // haversineDistance(circleCenter, _edgeMarker.value.position)
161-
162-
// showToast("Radius updated: ${radiusMeters.toInt()}m")
163-
}
164-
165-
override fun showToast(text: String) {
166-
this._messages.value = this._messages.value + ToastMessage(text = text)
167-
}
168-
169-
override fun removeToast(toastMessage: ToastMessage) {
170-
this._messages.value = this._messages.value.filter { it != toastMessage }
171-
}
172-
173-
override fun onCleared() {
174-
super.onCleared()
175-
}
17689
}

0 commit comments

Comments
 (0)