在地图框中使用移动相机移动符号

move symbol with move camera in mapbox

我想通过 Mapbox 中的 onCameraMoveListener 方法更改和移动我的符号,但我无法识别 problems.in 地图,只显示名称为 "ID_ICONN" 的符号并且符号移动和改变它不会发生的符号。 mapboxMap.addOnCameraIdleListener 根本不起作用。请帮我。我是 android...

的业余爱好者
public class MainActivity extends AppCompatActivity {

    private MapView mapView;

    private CircleManager circleManager;
    private Style style;
    private SymbolManager symbolManager;
    private Symbol symbol;
    private static final String ID_ICON = "";
    private static final String ID_ICONN = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Mapbox.getInstance(this,
                "access token");
        setContentView(R.layout.activity_main);
        mapView = findViewById(R.id.mapMap);
        mapView.onCreate(savedInstanceState);

        mapView.getMapAsync(new OnMapReadyCallback() {
            LatLng takestanLatLong=new LatLng(36.071636,49.695322);

            @Override
            public void onMapReady(@NonNull final MapboxMap mapboxMap) {

                mapboxMap.setStyle(new Style.Builder().fromUri("mapbox://styles/mojtaba95/ck7i2kow65njg1irw6nb0x59s"), new Style.OnStyleLoaded() {


                    @Override
                    public void onStyleLoaded(@NonNull Style style) {
//get symbol image from drawble
                        style.addImage(ID_ICON, BitmapUtils.getBitmapFromDrawable(getResources().getDrawable(R.drawable.mapbox_marker_icon_default)));
                        style.addImage(ID_ICONN, BitmapUtils.getBitmapFromDrawable(getResources().getDrawable(R.drawable.mapbox_compass_icon)));

//initialize symbol manager
                        final SymbolManager symbolManager=new SymbolManager(mapView,mapboxMap,style);
                        symbolManager.setIconAllowOverlap(true);
                        symbolManager.setIconIgnorePlacement(true);
//create symbol
                        final Symbol symbolStart=symbolManager.create(new SymbolOptions()
                        .withLatLng(takestanLatLong)
                        .withIconImage(ID_ICON)
                        .withSymbolSortKey(5.0f)
                        .withIconSize(1.5f));

                        mapboxMap.addOnCameraMoveListener(new MapboxMap.OnCameraMoveListener() {
                            @Override
                            public void onCameraMove() {
//get the camera position
                                LatLng latlng=mapboxMap.getCameraPosition().target;
//set the symbol icon for move
                                symbolStart.setIconImage(ID_ICONN);
//set the camera new latlng for symbol
                                symbolStart.setLatLng(latlng);
                            }
                        });
                        mapboxMap.addOnCameraIdleListener(new MapboxMap.OnCameraIdleListener() {
                            @Override
                            public void onCameraIdle() {
//set the icon when move is finished
                                symbolStart.setIconImage(ID_ICON);



                            }
                        });

                        CircleManager circleManager = new CircleManager(mapView, mapboxMap,style);
                        CircleOptions circleOptions = new CircleOptions()
                                .withLatLng(takestanLatLong)
                                .withCircleColor(ColorUtils.colorToRgbaString(Color.YELLOW))
                                .withCircleRadius(5f)
                                .withDraggable(true);
                        circleManager.create(circleOptions);

                    }
                });

                CameraPosition position= new CameraPosition.Builder()
                        .target(takestanLatLong)
                        .zoom(15)
                        .tilt(10)
                        .build();
                mapboxMap.animateCamera(CameraUpdateFactory.newCameraPosition(position),6000 );

            }
        });

    }

    @Override
    public void onStart() {
        super.onStart();
        mapView.onStart();
    }


    @Override
    public void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    public void onStop() {
        super.onStop();
        mapView.onStop();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }



}

您的代码有两个主要问题。

  1. ID_ICONID_ICONN 应该有实际值,并且它们必须是唯一的。意思是,它们不能相同。如果它们相同,Android 的 Mapbox Maps SDK 将不知道实际使用哪个图标。我做到了
private static final String RED_MARKER_ICON_ID = "RED_MARKER_ICON_ID";
private static final String COMPASS_ICON_ID = "COMPASS_ICON_ID";
  1. 即使您 运行 setLatLng(latitude,longitude),如果您想要更新注释插件管理器的注释位置,您也需要 运行 symbolManager.update(symbolStart);

以下代码适用于https://imgur.com/a/7c3UzK0。我将您的代码放入 Mapbox 演示应用程序示例中,以便更轻松地启动和 运行ning,而不是创建一个全新的 Android Studio 项目。

public class MainActivity extends AppCompatActivity {

  private MapView mapView;
  private static final String RED_MARKER_ICON_ID = "RED_MARKER_ICON_ID";
  private static final String COMPASS_ICON_ID = "COMPASS_ICON_ID";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Mapbox.getInstance(this,
        "access token");
    setContentView(R.layout.activity_main);
    mapView = findViewById(R.id.mapMap);
    mapView.onCreate(savedInstanceState);

    mapView.getMapAsync(new OnMapReadyCallback() {
      LatLng takestanLatLong = new LatLng(36.071636, 49.695322);

      @Override
      public void onMapReady(@NonNull final MapboxMap mapboxMap) {

        mapboxMap.setStyle(new Style.Builder().fromUri(Style.MAPBOX_STREETS), new Style.OnStyleLoaded() {


          @Override
          public void onStyleLoaded(@NonNull Style style) {

            //get symbol image from drawable
            style.addImage(RED_MARKER_ICON_ID, BitmapUtils.getBitmapFromDrawable(getResources().getDrawable(R.drawable.mapbox_marker_icon_default)));
            style.addImage(COMPASS_ICON_ID, BitmapUtils.getBitmapFromDrawable(getResources().getDrawable(R.drawable.mapbox_compass_icon)));


            //initialize symbol manager
            final SymbolManager symbolManager = new SymbolManager(mapView, mapboxMap, style);
            symbolManager.setIconAllowOverlap(true);
            symbolManager.setIconIgnorePlacement(true);

            //create symbol
            final Symbol symbolStart = symbolManager.create(new SymbolOptions()
                .withLatLng(takestanLatLong)
                .withIconImage(RED_MARKER_ICON_ID)
                .withSymbolSortKey(5.0f)
                .withIconSize(1.5f));

            mapboxMap.addOnCameraMoveListener(new MapboxMap.OnCameraMoveListener() {
              @Override
              public void onCameraMove() {

                //get the camera position
                LatLng latlng = mapboxMap.getCameraPosition().target;

                //set the symbol icon for move
                symbolStart.setIconImage(COMPASS_ICON_ID);

                //set the camera new latlng for symbol
                symbolStart.setLatLng(latlng);

                symbolManager.update(symbolStart);
              }
            });
            mapboxMap.addOnCameraIdleListener(new MapboxMap.OnCameraIdleListener() {
              @Override
              public void onCameraIdle() {

                //set the icon when move is finished
                symbolStart.setIconImage(RED_MARKER_ICON_ID);
                symbolManager.update(symbolStart);

              }
            });

            CircleManager circleManager = new CircleManager(mapView, mapboxMap, style);
            CircleOptions circleOptions = new CircleOptions()
                .withLatLng(takestanLatLong)
                .withCircleColor(ColorUtils.colorToRgbaString(Color.YELLOW))
                .withCircleRadius(5f)
                .withDraggable(true);
            circleManager.create(circleOptions);

          }
        });

        CameraPosition position = new CameraPosition.Builder()
            .target(takestanLatLong)
            .zoom(15)
            .tilt(10)
            .build();
        mapboxMap.animateCamera(CameraUpdateFactory.newCameraPosition(position), 6000);

      }
    });

  }

  @Override
  public void onStart() {
    super.onStart();
    mapView.onStart();
  }


  @Override
  public void onResume() {
    super.onResume();
    mapView.onResume();
  }

  @Override
  public void onPause() {
    super.onPause();
    mapView.onPause();
  }

  @Override
  public void onStop() {
    super.onStop();
    mapView.onStop();
  }

  @Override
  public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    mapView.onDestroy();
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mapView.onSaveInstanceState(outState);
  }
}