目前我在Android应用程序中使用谷歌地图v2,我遇到了地图的配色方案定制问题。我在网上看到了javascript可能https://developers.google.com/maps/customize和http://jsfiddle.net/SQvej/ js中的一些例子
var settingsItemsMap = {
zoom: 12,
center: new google.maps.LatLng(40.768516981, -73.96927308),
zoomControlOptions: {
style: google.maps.ZoomControlStyle.LARGE
},
styles:[
{ featureType: "water", stylers: [ { hue: "#F4B741"} ] },
{ featureType: "road", stylers: [ { hue: "#ff0000" } ] }
],
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById('map_canvas'), settingsItemsMap );
但没有找到Android地图的解决方案,有什么建议吗?
答案 0 :(得分:3)
答案 1 :(得分:3)
您可以使用MapBox的API来实现这一目标。 首先,注册一个帐户,按照您需要的方式设计地图,然后获取 MapID 和访问令牌。
接下来,复制此课程
public class MapBoxOnlineTileProvider extends UrlTileProvider {
public final String TAG = this.getClass().getCanonicalName();
private static final String FORMAT;
static {
FORMAT = "%s://api.tiles.mapbox.com/v4/%s/%d/%d/%d.png?access_token=%s";
}
private boolean mHttpsEnabled;
private String mMapIdentifier;
private String mAccessToken;
public MapBoxOnlineTileProvider(String mapIdentifier, String accessToken) {
this(mapIdentifier, accessToken, false);
}
public MapBoxOnlineTileProvider(String mapIdentifier, String accessToken, boolean https) {
super(256, 256);
this.mHttpsEnabled = https;
this.mMapIdentifier = mapIdentifier;
this.mAccessToken = accessToken;
}
/**
* The MapBox map identifier being used by this provider.
*
* @return the MapBox map identifier being used by this provider.
*/
public String getMapIdentifier() {
return this.mMapIdentifier;
}
/**
* Sets the identifier of the MapBox hosted map you wish to use.
*
* @param aMapIdentifier the identifier of the map.
*/
public void setMapIdentifier(String aMapIdentifier) {
this.mMapIdentifier = aMapIdentifier;
}
/**
* Whether this provider will use HTTPS when requesting tiles.
*
* @return {@link true} if HTTPS is enabled on this provider.
*/
public boolean isHttpsEnabled() {
return this.mHttpsEnabled;
}
/**
* Sets whether this provider should use HTTPS when requesting tiles.
*
* @param enabled
*/
public void setHttpsEnabled(boolean enabled) {
this.mHttpsEnabled = enabled;
}
/**
* The MapBox Acces Token found in Account Settings.
*/
public String getAccessToken() {
return mAccessToken;
}
public void setAccessToken(String mAccessToken) {
this.mAccessToken = mAccessToken;
}
@Override
public URL getTileUrl(int x, int y, int z) {
try {
String protocol = this.mHttpsEnabled ? "https" : "http";
final String url = String.format(FORMAT,
protocol, this.mMapIdentifier, z, x, y, this.mAccessToken);
Log.d(TAG, url);
return new URL(url);
} catch (MalformedURLException e) {
return null;
}
} }
现在,在您的活动中,地图准备就绪后:
String myMapID = "yourMapID";
String accesToken = "yourAccesToken";
MapBoxOnlineTileProvider provider = new MapBoxOnlineTileProvider(myMapID, accesToken);
map.addTileOverlay(new TileOverlayOptions()
.tileProvider(provider));
答案 2 :(得分:3)
从这里创建风格
https://mapstyle.withgoogle.com/
然后将该json保存在RAW文件夹下,然后在您的代码中调用该样式,如此
MapStyleOptions style = MapStyleOptions.loadRawResourceStyle(getActivity(), R.raw.my_map_style);
googleMap.setMapStyle(style);
答案 3 :(得分:1)
如果要求只是调暗或改变地图的整体颜色,那么您可以使用图块叠加。这将在地图上创建部分透明的图层(在本例中为绿色)。它位于瓷砖正上方,因此标记和其他对象不受影响。
@Override
public void onMapReady(GoogleMap googleMap) {
TileProvider coordTileProvider = new CoordTileProvider(getActivity());
map.addTileOverlay(new TileOverlayOptions().tileProvider(coordTileProvider));
}
班级CoordTileProvider
是:
public static class CoordTileProvider implements TileProvider {
private static final int TILE_SIZE_DP = 256;
private final float mScaleFactor;
private final Bitmap mBorderTile;
public CoordTileProvider(Context context) {
/* Scale factor based on density, with a 0.2 multiplier to increase tile generation
* speed */
mScaleFactor = context.getResources().getDisplayMetrics().density * 0.2f;
Paint paint = new Paint();
paint.setColor(Color.argb(150,200,255,200));
mBorderTile = Bitmap.createBitmap((int) (TILE_SIZE_DP * mScaleFactor),
(int) (TILE_SIZE_DP * mScaleFactor), android.graphics.Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(mBorderTile);
canvas.drawRect(0, 0, TILE_SIZE_DP * mScaleFactor, TILE_SIZE_DP * mScaleFactor,
paint);
}
@Override
public Tile getTile(int x, int y, int zoom) {
Bitmap coordTile = drawTileCoords(x, y, zoom);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
coordTile.compress(Bitmap.CompressFormat.PNG, 0, stream);
byte[] bitmapData = stream.toByteArray();
return new Tile((int) (TILE_SIZE_DP * mScaleFactor),
(int) (TILE_SIZE_DP * mScaleFactor), bitmapData);
}
private Bitmap drawTileCoords(int x, int y, int zoom) {
Bitmap copy = null;
synchronized (mBorderTile) {
copy = mBorderTile.copy(android.graphics.Bitmap.Config.ARGB_8888, true);
}
return copy;
}
}
答案 4 :(得分:0)