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);
}
}
Two main issues with your code.
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 didprivate static final String RED_MARKER_ICON_ID = "RED_MARKER_ICON_ID";
private static final String COMPASS_ICON_ID = "COMPASS_ICON_ID";
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);
}
}