This repository has been archived by the owner on Feb 22, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 9.8k
[google_maps_flutter_platform_interface] add custom tile support #3418
Merged
fluttergithubbot
merged 13 commits into
flutter:master
from
cyanglaz:gmap_custom_tiles_platform_interface
Jan 22, 2021
Merged
Changes from 7 commits
Commits
Show all changes
13 commits
Select commit
Hold shift + click to select a range
f34a94a
tile overlay
8313237
review
c88447d
fix
9322f98
reviews and formats
fd0b1e3
reviews
38d4d5a
cache tileOverlays
52dba31
update assert
c2e2a3f
review
a5a6dca
format
5cded00
refactor updateTileOverlays
375164d
update doc
8ff2313
pubspec
0469f42
Merge branch 'master' into gmap_custom_tiles_platform_interface
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
4 changes: 4 additions & 0 deletions
4
packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,7 @@ | ||
## 1.2.0 | ||
|
||
* Add TileOverlay support. | ||
|
||
## 1.1.0 | ||
|
||
* Add support for holes in Polygons. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,6 +15,10 @@ import 'package:google_maps_flutter_platform_interface/src/method_channel/method | |
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; | ||
import 'package:plugin_platform_interface/plugin_platform_interface.dart'; | ||
|
||
/// Callback method for when a [Tile] is requested from a [TileProvider]. | ||
typedef Future<Tile> MapGetTileCallback( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we still need this? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. removed |
||
String tileOverlayIdString, int x, int y, int zoom); | ||
|
||
/// The interface that platform-specific implementations of `google_maps_flutter` must extend. | ||
/// | ||
/// Avoid `implements` of this interface. Using `implements` makes adding any new | ||
|
@@ -115,6 +119,33 @@ abstract class GoogleMapsFlutterPlatform extends PlatformInterface { | |
throw UnimplementedError('updateCircles() has not been implemented.'); | ||
} | ||
|
||
/// Updates tile overlay configuration. | ||
/// | ||
/// Change listeners are notified once the update has been made on the | ||
/// platform side. | ||
/// | ||
/// The returned [Future] completes after listeners have been notified. | ||
Future<void> updateTileOverlays( | ||
TileOverlayUpdates tileOverlayUpdates, { | ||
@required int mapId, | ||
}) { | ||
throw UnimplementedError('updateTileOverlays() has not been implemented.'); | ||
} | ||
|
||
/// Clears the tile cache so that all tiles will be requested again from the | ||
cyanglaz marked this conversation as resolved.
Show resolved
Hide resolved
|
||
/// [TileProvider]. | ||
/// | ||
/// The current tiles from this tile overlay will also be | ||
/// cleared from the map after calling this method. The Google Maps SDK maintains a small | ||
/// in-memory cache of tiles. If you want to cache tiles for longer, you | ||
/// should implement an on-disk cache. | ||
Future<void> clearTileCache( | ||
TileOverlayId tileOverlayId, { | ||
@required int mapId, | ||
}) { | ||
throw UnimplementedError('clearTileCache() has not been implemented.'); | ||
} | ||
|
||
/// Starts an animated change of the map camera position. | ||
/// | ||
/// The returned [Future] completes after the change has been started on the | ||
|
@@ -246,6 +277,14 @@ abstract class GoogleMapsFlutterPlatform extends PlatformInterface { | |
throw UnimplementedError('takeSnapshot() has not been implemented.'); | ||
} | ||
|
||
/// Set the [TileOverlay] for the map. | ||
/// | ||
/// The [TileProvider] is called when a [Tile] is requested. | ||
void setTileOverlay( | ||
{@required int mapId, @required TileOverlay tileOverlay}) { | ||
throw UnimplementedError('onGetTile() has not been implemented.'); | ||
} | ||
|
||
// The following are the 11 possible streams of data from the native side | ||
// into the plugin | ||
|
||
|
41 changes: 41 additions & 0 deletions
41
packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/tile.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
// Copyright 2018 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
import 'dart:typed_data'; | ||
import 'package:meta/meta.dart' show immutable; | ||
|
||
/// Contains information about a Tile that is returned by a [TileProvider]. | ||
@immutable | ||
class Tile { | ||
/// Creates an immutable representation of a [Tile] to draw by [TileProvider]. | ||
const Tile(this.width, this.height, this.data); | ||
|
||
/// The width of the image encoded by data in logical pixels. | ||
final int width; | ||
|
||
/// The height of the image encoded by data in logical pixels. | ||
final int height; | ||
|
||
/// A byte array containing the image data. | ||
cyanglaz marked this conversation as resolved.
Show resolved
Hide resolved
|
||
/// | ||
/// The image data format accepted by platforms various based on platforms and versions. | ||
final Uint8List data; | ||
|
||
/// Converts this object to JSON. | ||
Map<String, dynamic> toJson() { | ||
final Map<String, dynamic> json = <String, dynamic>{}; | ||
|
||
void addIfPresent(String fieldName, dynamic value) { | ||
if (value != null) { | ||
json[fieldName] = value; | ||
} | ||
} | ||
|
||
addIfPresent('width', width); | ||
addIfPresent('height', height); | ||
addIfPresent('data', data); | ||
|
||
return json; | ||
} | ||
} |
161 changes: 161 additions & 0 deletions
161
...oogle_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/tile_overlay.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
// Copyright 2018 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
import 'dart:ui' show hashValues; | ||
import 'package:flutter/foundation.dart'; | ||
|
||
import 'types.dart'; | ||
import 'package:meta/meta.dart' show immutable, required; | ||
|
||
/// Uniquely identifies a [TileOverlay] among [GoogleMap] tile overlays. | ||
@immutable | ||
class TileOverlayId { | ||
/// Creates an immutable identifier for a [TileOverlay]. | ||
TileOverlayId(this.value) : assert(value != null); | ||
|
||
/// The value of the [TileOverlayId]. | ||
final String value; | ||
cyanglaz marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
@override | ||
bool operator ==(Object other) { | ||
if (other.runtimeType != runtimeType) { | ||
return false; | ||
} | ||
return other is TileOverlayId && other.value == value; | ||
} | ||
|
||
@override | ||
int get hashCode => value.hashCode; | ||
|
||
@override | ||
String toString() => '${objectRuntimeType(this, 'TileOverlayId')}($value)'; | ||
} | ||
|
||
/// A set of images which are displayed on top of the base map tiles. | ||
/// | ||
/// These tiles may be transparent, allowing you to add features to existing maps. | ||
/// | ||
/// ## Tile Coordinates | ||
/// | ||
/// Note that the world is projected using the Mercator projection | ||
/// (see [Wikipedia](https://en.wikipedia.org/wiki/Mercator_projection)) with the left (west) side | ||
/// of the map corresponding to -180 degrees of longitude and the right (east) side of the map | ||
/// corresponding to 180 degrees of longitude. To make the map square, the top (north) side of the | ||
/// map corresponds to 85.0511 degrees of latitude and the bottom (south) side of the map | ||
/// corresponds to -85.0511 degrees of latitude. Areas outside this latitude range are not rendered. | ||
/// | ||
/// At each zoom level, the map is divided into tiles and only the tiles that overlap the screen are | ||
/// downloaded and rendered. Each tile is square and the map is divided into tiles as follows: | ||
/// | ||
/// * At zoom level 0, one tile represents the entire world. The coordinates of that tile are | ||
/// (x, y) = (0, 0). | ||
/// * At zoom level 1, the world is divided into 4 tiles arranged in a 2 x 2 grid. | ||
/// * ... | ||
/// * At zoom level N, the world is divided into 4N tiles arranged in a 2N x 2N grid. | ||
/// | ||
/// Note that the minimum zoom level that the camera supports (which can depend on various factors) | ||
/// is GoogleMap.getMinZoomLevel and the maximum zoom level is GoogleMap.getMaxZoomLevel. | ||
/// | ||
/// The coordinates of the tiles are measured from the top left (northwest) corner of the map. | ||
/// At zoom level N, the x values of the tile coordinates range from 0 to 2N - 1 and increase from | ||
/// west to east and the y values range from 0 to 2N - 1 and increase from north to south. | ||
/// | ||
class TileOverlay { | ||
/// Creates an immutable representation of a [TileOverlay] to draw on [GoogleMap]. | ||
const TileOverlay({ | ||
@required this.tileOverlayId, | ||
this.fadeIn = true, | ||
this.tileProvider, | ||
this.transparency = 0.0, | ||
this.zIndex, | ||
this.visible = true, | ||
this.tileSize = 256, | ||
}) : assert(transparency >= 0.0 && transparency <= 1.0); | ||
|
||
/// Uniquely identifies a [TileOverlay]. | ||
final TileOverlayId tileOverlayId; | ||
|
||
/// Whether the tiles should fade in. The default is true. | ||
final bool fadeIn; | ||
|
||
/// The tile provider to use for this tile overlay. | ||
final TileProvider tileProvider; | ||
|
||
/// The transparency of the tile overlay. The default transparency is 0 (opaque). | ||
final double transparency; | ||
|
||
/// The tile overlay's zIndex, i.e., the order in which it will be drawn where | ||
/// overlays with larger values are drawn above those with lower values | ||
final int zIndex; | ||
|
||
/// The visibility for the tile overlay. The default visibility is true. | ||
final bool visible; | ||
|
||
/// Specifies the number of logical pixels (not points) that the returned tile images will prefer | ||
/// to display as. iOS only. | ||
/// | ||
/// Defaults to 256, which is the traditional size of Google Maps tiles. | ||
/// As an example, an application developer may wish to provide retina tiles (512 pixel edge length) | ||
/// on retina devices, to keep the same number of tiles per view as the default value of 256 | ||
/// would give on a non-retina device. | ||
final int tileSize; | ||
|
||
/// Creates a new [TileOverlay] object whose values are the same as this instance, | ||
/// unless overwritten by the specified parameters. | ||
TileOverlay copyWith({ | ||
TileOverlayId tileOverlayId, | ||
bool fadeInParam, | ||
double transparencyParam, | ||
int zIndexParam, | ||
bool visibleParam, | ||
int tileSizeParam, | ||
}) { | ||
return TileOverlay( | ||
tileOverlayId: tileOverlayId, | ||
fadeIn: fadeInParam ?? fadeIn, | ||
transparency: transparencyParam ?? transparency, | ||
zIndex: zIndexParam ?? zIndex, | ||
visible: visibleParam ?? visible, | ||
tileSize: tileSizeParam ?? tileSize, | ||
); | ||
} | ||
|
||
/// Converts this object to JSON. | ||
Map<String, dynamic> toJson() { | ||
final Map<String, dynamic> json = <String, dynamic>{}; | ||
|
||
void addIfPresent(String fieldName, dynamic value) { | ||
if (value != null) { | ||
json[fieldName] = value; | ||
} | ||
} | ||
|
||
addIfPresent('tileOverlayId', tileOverlayId.value); | ||
addIfPresent('fadeIn', fadeIn); | ||
addIfPresent('transparency', transparency); | ||
addIfPresent('zIndex', zIndex); | ||
addIfPresent('visible', visible); | ||
addIfPresent('tileSize', tileSize); | ||
|
||
return json; | ||
} | ||
|
||
@override | ||
bool operator ==(Object other) { | ||
if (other.runtimeType != runtimeType) { | ||
return false; | ||
} | ||
return other is TileOverlay && | ||
tileOverlayId == other.tileOverlayId && | ||
fadeIn == other.fadeIn && | ||
transparency == other.transparency && | ||
zIndex == other.zIndex && | ||
visible == other.visible && | ||
tileSize == other.tileSize; | ||
} | ||
|
||
@override | ||
int get hashCode => hashValues( | ||
tileOverlayId, fadeIn, transparency, zIndex, visible, tileSize); | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need to update
_tileOverlays
here?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done, also removed setTileOverlays