Search code examples
androidmapboxmapbox-android

move symbol with move camera in mapbox


I want to change and move my symbol with the camera move by onCameraMoveListener method in Mapbox, but I can't recognize the problems.in the map, just symbol with name"ID_ICONN" is shown and symbol move and changing the symbol it doesn't happen. and mapboxMap.addOnCameraIdleListener doesn't work at all . please help me. I'm an amateur in 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);
    }



}

Solution

  • Two main issues with your code.

    1. ID_ICON and ID_ICONN should have actual values and they need to be unique. Meaning, they can't be the same. If they're the same, the Mapbox Maps SDK for Android won't know which icon to actually use. I did
    private static final String RED_MARKER_ICON_ID = "RED_MARKER_ICON_ID";
    private static final String COMPASS_ICON_ID = "COMPASS_ICON_ID";
    
    1. Even if you run setLatLng(latitude,longitude), you need to run symbolManager.update(symbolStart); if you want to update an Annotation Plugin manager's annotation location.

    The following code below is for https://i.sstatic.net/B4p0d.jpg. I put your code into a Mapbox demo app example to just get it up and running more easily, rather than creating a completely new Android Studio project.

    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);
      }
    }