Camera Controller

Introduction

This example shows how to show mapview and perform camera update actions:

  1. Display MapView Widget
  2. Various Camera Update operations:
    1. new Camera position
    2. new LatLng
    3. new LatLng Bounds
    4. new LatLng Zoom
    5. scrollBy
    6. zoomBy with focus
    7. zoomBy
    8. zoomIn
Android snapshot iOS snapshot

For all code examples, refer to Flutter Maps SDK Code Examples

AnimateCameraPage view source

1import 'package:flutter/material.dart';
2import 'package:nb_maps_flutter/nb_maps_flutter.dart';
3
4import 'main.dart';
5import 'page.dart';
6
7class AnimateCameraPage extends ExamplePage {
8  AnimateCameraPage()
9      : super(const Icon(Icons.map), 'Camera control, animated');
10
11  
12  Widget build(BuildContext context) {
13    return const AnimateCamera();
14  }
15}
16
17class AnimateCamera extends StatefulWidget {
18  const AnimateCamera();
19  
20  State createState() => AnimateCameraState();
21}
22
23class AnimateCameraState extends State<AnimateCamera> {
24  late NextbillionMapController mapController;
25
26  void _onMapCreated(NextbillionMapController controller) {
27    mapController = controller;
28  }
29
30  
31  Widget build(BuildContext context) {
32    return Column(
33      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
34      crossAxisAlignment: CrossAxisAlignment.stretch,
35      children: <Widget>[
36        Center(
37          child: SizedBox(
38            width: 300.0,
39            height: 200.0,
40            child: NBMap(
41              onMapCreated: _onMapCreated,
42              initialCameraPosition:
43                  const CameraPosition(target: LatLng(0.0, 0.0)),
44            ),
45          ),
46        ),
47        Row(
48          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
49          children: <Widget>[
50            Column(
51              children: <Widget>[
52                TextButton(
53                  onPressed: () {
54                    mapController
55                        .animateCamera(
56                          CameraUpdate.newCameraPosition(
57                            const CameraPosition(
58                              bearing: 270.0,
59                              target: LatLng(51.5160895, -0.1294527),
60                              tilt: 30.0,
61                              zoom: 17.0,
62                            ),
63                          ),
64                        )
65                        .then((result) => print(
66                            "mapController.animateCamera() returned $result"));
67                  },
68                  child: const Text('newCameraPosition'),
69                ),
70                TextButton(
71                  onPressed: () {
72                    mapController
73                        .animateCamera(
74                          CameraUpdate.newLatLng(
75                            const LatLng(56.1725505, 10.1850512),
76                          ),
77                          duration: Duration(seconds: 5),
78                        )
79                        .then((result) => print(
80                            "mapController.animateCamera() returned $result"));
81                  },
82                  child: const Text('newLatLng'),
83                ),
84                TextButton(
85                  onPressed: () {
86                    mapController.animateCamera(
87                      CameraUpdate.newLatLngBounds(
88                        LatLngBounds(
89                          southwest: const LatLng(-38.483935, 113.248673),
90                          northeast: const LatLng(-8.982446, 153.823821),
91                        ),
92                        left: 10,
93                        top: 5,
94                        bottom: 25,
95                      ),
96                    );
97                  },
98                  child: const Text('newLatLngBounds'),
99                ),
100                TextButton(
101                  onPressed: () {
102                    mapController.animateCamera(
103                      CameraUpdate.newLatLngZoom(
104                        const LatLng(37.4231613, -122.087159),
105                        11.0,
106                      ),
107                    );
108                  },
109                  child: const Text('newLatLngZoom'),
110                ),
111                TextButton(
112                  onPressed: () {
113                    mapController.animateCamera(
114                      CameraUpdate.scrollBy(150.0, -225.0),
115                    );
116                  },
117                  child: const Text('scrollBy'),
118                ),
119              ],
120            ),
121            Column(
122              children: <Widget>[
123                TextButton(
124                  onPressed: () {
125                    mapController.animateCamera(
126                      CameraUpdate.zoomBy(
127                        -0.5,
128                        const Offset(30.0, 20.0),
129                      ),
130                    );
131                  },
132                  child: const Text('zoomBy with focus'),
133                ),
134                TextButton(
135                  onPressed: () {
136                    mapController.animateCamera(
137                      CameraUpdate.zoomBy(-0.5),
138                    );
139                  },
140                  child: const Text('zoomBy'),
141                ),
142                TextButton(
143                  onPressed: () {
144                    mapController.animateCamera(
145                      CameraUpdate.zoomIn(),
146                    );
147                  },
148                  child: const Text('zoomIn'),
149                ),
150                TextButton(
151                  onPressed: () {
152                    mapController.animateCamera(
153                      CameraUpdate.zoomOut(),
154                    );
155                  },
156                  child: const Text('zoomOut'),
157                ),
158                TextButton(
159                  onPressed: () {
160                    mapController.animateCamera(
161                      CameraUpdate.zoomTo(16.0),
162                    );
163                  },
164                  child: const Text('zoomTo'),
165                ),
166                TextButton(
167                  onPressed: () {
168                    mapController.animateCamera(
169                      CameraUpdate.bearingTo(45.0),
170                    );
171                  },
172                  child: const Text('bearingTo'),
173                ),
174                TextButton(
175                  onPressed: () {
176                    mapController.animateCamera(
177                      CameraUpdate.tiltTo(30.0),
178                    );
179                  },
180                  child: const Text('tiltTo'),
181                ),
182              ],
183            ),
184          ],
185        )
186      ],
187    );
188  }
189}

Code summary

The above code snippet defines an AnimateCamera page, which displays a map using the NBMap widget from the nb_maps_flutter package. The widget allows the user to control the camera position of the map and animate various camera movements, like zooming, panning, and tilting.

  1. Display MapView Widget:

    1. The NBMap widget is used to display the map on the screen. It requires an onMapCreated callback to get access to the NextbillionMapController, which allows interaction with the map.
    2. The initialCameraPosition property sets the initial position of the camera when the map is first displayed.
  2. Camera Options: The AnimateCamera widget has several buttons that trigger different camera animations:

    1. newCameraPosition: Animates the camera to a new position with specified parameters like bearing, target, tilt, and zoom.
    2. newLatLng: Animates the camera to a new latitude and longitude position.
    3. newLatLngBounds: Animates the camera to fit a specific bounding box defined by southwest and northeast coordinates.
    4. newLatLngZoom: Animates the camera to a specific latitude and longitude position with a given zoom level.
    5. scrollBy: Animates the camera by scrolling the map by a given distance in pixels.
    6. zoomBy with focus: Zooms the camera by a given amount relative to the current zoom level, with a specified focus point (offset from the center of the map).
    7. zoomBy: Zooms the camera by a given amount relative to the current zoom level without any focus point.
    8. zoomIn: Animates the camera to zoom in by one zoom level.
    9. zoomOut: Animates the camera to zoom out by one zoom level.
    10. zoomTo: Animates the camera to a specific zoom level.
    11. bearingTo: Animates the camera to a specific bearing (rotation angle) in degrees.
    12. tiltTo: Animates the camera to a specific tilt angle in degrees.

The camera animations are triggered when the corresponding buttons are pressed, and the NextbillionMapController is used to perform the camera movements using the animateCamera method. The results of the camera animations are printed to the console.

To use this widget in your Flutter app, make sure you have installed the nb_maps_flutter package and added the necessary dependencies to your pubspec.yaml file.

DIDN'T FIND WHAT YOU LOOKING FOR?