在地图框中使用移动相机移动符号
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);
}
}
您的代码有两个主要问题。
ID_ICON
和 ID_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";
- 即使您 运行
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);
}
}
我想通过 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);
}
}
您的代码有两个主要问题。
ID_ICON
和ID_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";
- 即使您 运行
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);
}
}