Android Google地图 - 所有标记背后的自定义背景

时间:2015-11-02 12:53:33

标签: android google-maps

我尝试在地图和标记之间添加背景;此图像应始终(!)留在所有标记后面。

我尝试了几种方法,例如除了背景图片之外,我的所有标记都有deviceID = browser.find_elements(By.XPATH, "//*[@aria-describedby= 'devices_billingId']/a") deviceID.click() ,但似乎这只会对最后一个标记有所帮助。

然后我尝试了使用showInfoWindow()的解决方案,但我需要保持相同的尺寸(例如设备尺寸的一半),与缩放系数无关。

Android上有解决方案吗?

3 个答案:

答案 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计算它的尺寸,以便它在缩放之间保持正确的大小。

来自the documentation

  

<强>位置

     

有两种方法可以指定地面叠加层的位置:

     
      
  • 使用位置:您必须提供地面叠加层的图像,固定锚点的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

<强>更新

正如我在评论中所说,我们可以在现有setDimensionsGroundOverlayGroundOverlay,而不是在每次更改相机时添加/删除它。

我在几台设备上测试了它,它似乎减少了低端设备的闪烁,但仍然不是一个完美的解决方案(图像在缩放之间调整大小)。我非常确定这是我们使用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}}

结果如下:

enter image description here