我尝试在地图和标记之间添加背景;此图像应始终(!)留在所有标记后面。
我尝试了几种方法,例如除了背景图片之外,我的所有标记都有deviceID = browser.find_elements(By.XPATH, "//*[@aria-describedby= 'devices_billingId']/a")
deviceID.click()
,但似乎这只会对最后一个标记有所帮助。
然后我尝试了使用showInfoWindow()
的解决方案,但我需要保持相同的尺寸(例如设备尺寸的一半),与缩放系数无关。
Android上有解决方案吗?
答案 0 :(得分:5)
这很容易做到。
添加两个标记而不是一个。首先在lat_lng中将背景添加为位图。
这样的事情:
map.addMarker(new MarkerOptions()
.position(lat_lng)
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory.fromBitmap(bitmap)));
然后像往常一样在同一个lat_lng上添加你的标记。
对每个标记执行以上操作。
答案 1 :(得分:0)
您可以尝试此操作,根据缩放系数计算尺寸,并将这些尺寸应用于 GroundOverlay 。
float zoomLevel=mMap.getCameraPosition().zoom;
//calculate meters*********************
myBounds = mMap.getProjection().getVisibleRegion().latLngBounds;
myCenter= mMap.getCameraPosition().target;
if (myCenter.latitude==0 || myCenter.longitude==0) {
myCenter=new LatLng(myLocation.getLatitude(),myLocation.getLongitude());
}
LatLng ne = myBounds.northeast;
// r = radius of the earth in statute miles
double r = 3963.0;
// Convert lat or lng from decimal degrees into radians (divide by 57.2958)
double lat1 = myCenter.latitude / 57.2958;
double lon1 = myCenter.longitude / 57.2958;
final double lat2 = ne.latitude / 57.2958;
final double lon2 = ne.longitude / 57.2958;
// distance = circle radius from center to Northeast corner of bounds
double dis = r * Math.acos(Math.sin(lat1) * Math.sin(lat2) +
Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1));
//1 Meter = 0.000621371192237334 Miles
double meters_calc=dis/0.000621371192237334;
float factor=1;
if (zoomLevel==15) { // my default zoom level yours can be different
metersoverlay=meters_calc; // global variable metersoverlay set
}
else { // if my zoom level change then I have to calculate dimension scale factor
factor=(float) (meters_calc/metersoverlay);
}
//******************************* now we are ready to set dimension of background overlay
float dimensions=1000*factor;
loadingGroundOverlayBg.setDimensions(dimensions);
答案 2 :(得分:-1)
您最好的选择是使用GroundOverlay
来显示您的背景,在视图更改时添加和删除它,并根据地图的VisibleRegion
计算它的尺寸,以便它在缩放之间保持正确的大小。
<强>位置强>
有两种方法可以指定地面叠加层的位置:
使用位置:您必须提供地面叠加层的图像,固定锚点的LatLng以及叠加层的宽度(以米为单位)。默认情况下,锚点距离图像顶部50%,距离图像左侧50%。这可以改变。您可以选择提供叠加层的高度(以米为单位)。如果您没有提供叠加层的高度,它将自动计算以保留图像的比例。
使用边界:您必须提供包含图像的LatLngBounds。
以下示例使用OnCameraChangeListener
删除并添加GroundOverlay
,该ic_launcher
在地图中心显示GroundOverlay
drawable,占地图宽度的75%(删除和在onCameraChange
事件上添加public class MyMapActivity extends Activity implements OnCameraChangeListener {
GroundOverlay backgroundOverlay = null;
GoogleMap map;
// ...
@Override
public void onCameraChange(final CameraPosition cameraPosition) {
if (backgroundOverlay != null) {
backgroundOverlay.remove();
}
VisibleRegion visibleRegion = map.getProjection()
.getVisibleRegion();
Location nearLeftLocation = new Location("nearLeftLocation");
nearLeftLocation.setLatitude(visibleRegion.nearLeft.latitude);
nearLeftLocation.setLongitude(visibleRegion.nearLeft.longitude);
Location nearRightLocation = new Location("nearRightLocation");
nearRightLocation.setLatitude(visibleRegion.nearRight.latitude);
nearRightLocation.setLongitude(visibleRegion.nearRight.longitude);
float width = nearLeftLocation.distanceTo(nearRightLocation);
GroundOverlayOptions background = new GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher))
.position(cameraPosition.target, width * 0.75f);
backgroundOverlay = map.addGroundOverlay(background);
}
}
可确保图片的大小始终与缩放级别无关。)
setPosition
<强>更新强>
正如我在评论中所说,我们可以在现有setDimensions
上GroundOverlay
和GroundOverlay
,而不是在每次更改相机时添加/删除它。
我在几台设备上测试了它,它似乎减少了低端设备的闪烁,但仍然不是一个完美的解决方案(图像在缩放之间调整大小)。我非常确定这是我们使用public class MyMapActivity extends Activity implements OnCameraChangeListener {
GroundOverlay backgroundOverlay = null;
GoogleMap map;
// ...
@Override
public void onCameraChange(final CameraPosition cameraPosition) {
VisibleRegion visibleRegion = map.getProjection().getVisibleRegion();
Location nearLeftLocation = new Location("nearLeftLocation");
nearLeftLocation.setLatitude(visibleRegion.nearLeft.latitude);
nearLeftLocation.setLongitude(visibleRegion.nearLeft.longitude);
Location nearRightLocation = new Location("nearRightLocation");
nearRightLocation.setLatitude(visibleRegion.nearRight.latitude);
nearRightLocation.setLongitude(visibleRegion.nearRight.longitude);
float width = nearLeftLocation.distanceTo(nearRightLocation);
if (backgroundOverlay == null) {
GroundOverlayOptions background = new GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher))
.position(cameraPosition.target, width * 0.75f);
backgroundOverlay = map.addGroundOverlay(background);
} else {
backgroundOverlay.setPosition(cameraPosition.target);
backgroundOverlay.setDimensions(width * 0.75f);
}
}
}
s获得的最佳效果。
Tile
<强>更新强>
我找到了另一个解决方案。如果您的背景是纯透明半透明颜色,则可以使用TileOverlay将其设置为低于所有标记。
我们的想法是创建一个TileProvider,它总是返回一个非常小的(在我的例子中为2x2像素)图像,该图像将在所有标记下面绘制。为确保效果,TileProvider
返回的public class BackgroundTileProvider implements TileProvider {
private Tile tile;
@Override
public Tile getTile(int x, int y, int zoom) {
if (tile == null) {
// Create a very small (for performance) bitmap with alpha
Bitmap bmp = Bitmap.createBitmap(2, 2, Bitmap.Config.ARGB_8888);
// Draw the desired color to use as background
Canvas canvas = new Canvas(bmp);
canvas.drawColor(Color.argb(150, 255, 0, 0));
// Get the bytes and create the Tile
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
tile = new Tile(2, 2, stream.toByteArray());
}
return tile;
}
}
将始终相同。
以下是代码:
TileProvider tileProvider = new BackgroundTileProvider();
TileOverlay tileOverlay = map.addTileOverlay(
new TileOverlayOptions().tileProvider(tileProvider));
您需要将TileOverlay添加到地图中,如下所示:
{{1}}
结果如下: