如何将地图上的标记移动到新坐标?
How To Move Marker On Map To New Coordinates?
我想做的事情:
在这段代码中,我实例化了一个带有相机位置的符号。我想要做的就是将地图上的符号动画化为我现在要硬编码的另一组坐标。我已经尝试了很多东西,但无法弄清楚如何让它发挥作用。
我试过的:我看过两个 Mapbox Android SDK 的例子,并尝试了这些例子的变体,只是为了让标记移动到另一个点,但我很迷茫:
此示例使用 Object Animator:
https://docs.mapbox.com/android/maps/examples/animate-marker-position/
此示例不使用任何 Animator,仅根据坐标更新元件:
https://docs.mapbox.com/android/maps/examples/api-response-icon-update/
我现在所在的位置:
我最终决定只更新符号,文档指示我使用它:
AnnotationManager.update(Annotation).
但我不确定如何。请帮助我被困了很长时间,我感到迷路了。谢谢。
我想要发生的事情的图片:
Animate Symbol To Point
P.S。
我应该试试 Object Animator 吗?
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Mapbox.getInstance(this, getString(R.string.access_token));
setContentView(R.layout.activity_main);
mapView = findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(@NonNull final MapboxMap mapboxMap) {
mapboxMap.setStyle(Style.LIGHT, new Style.OnStyleLoaded(){
@Override
public void onStyleLoaded(@NonNull Style style){
//Import Icon
Bitmap icon = BitmapFactory.decodeResource(getResources(),
R.drawable.blue_icon);
style.addImage(ID_IMAGE_SOURCE, icon);
style.addSource(new GeoJsonSource("source-id"));
//Create Symbol
SymbolManager symbolManager = new SymbolManager(mapView, mapboxMap, style);
symbolManager.setIconAllowOverlap(true);
symbolManager.setIconIgnorePlacement(true);
Symbol symbol = symbolManager.create(new SymbolOptions()
.withLatLng(new LatLng(33.718492, -117.796390))
.withIconImage(ID_IMAGE_SOURCE)
.withIconSize(.25f));
//Camera Position and Bounds
LatLngBounds latLngBounds = new LatLngBounds.Builder()
.include(new LatLng(33.717872, -117.796296))
.include(new LatLng(33.718342, -117.797975))
.build();
mapboxMap.animateCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds,
30));
已解决。需要来自 Android SDK 的动画师。太多了,从我原来的代码到 post 都在这里。如果您遇到同样的问题,请告诉我,我会提供帮助。
我发现使用交易品种管理器很容易更新标记的位置
//ADD VARIABLES
private SymbolManager symbolManager;
private Symbol originIcon;
在设置地图框样式时初始化图像和符号管理器
mapboxMap.setStyle(
new Style.Builder()
.fromUri(styleUrl)
// Add the SymbolLayer icon image to the map style
.withImage(ICON_ORIGIN, BitmapFactory.decodeResource(
this.getResources(), R.drawable.searchorigin)),
style -> {
// create symbol manager object
symbolManager = new SymbolManager(mapView, mapboxMap, style);
// set non-data-driven properties, such as:
symbolManager.setIconAllowOverlap(true);
symbolManager.setIconTranslate(new Float[]{-4f, 5f});
symbolManager.setIconRotationAlignment(ICON_ROTATION_ALIGNMENT_VIEWPORT);
});
然后使用符号管理器创建图标并更新位置
//CHECK IF THE MARKER IS INITIALIZE
if (originIcon == null) {
// Add symbol at specified lat/lon
originIcon = symbolManager.create(new SymbolOptions()
.withLatLng(new LatLng(location.latitude(), location.longitude()))
.withIconImage(ICON_ORIGIN)
.withIconSize(0.5f));
}else{
//UPDATE THE ICON BY USING SYMBOLMANAGER
originIcon.setLatLng(new LatLng(location.latitude(), location.longitude()));
symbolManager.update(originIcon);
}
我想做的事情: 在这段代码中,我实例化了一个带有相机位置的符号。我想要做的就是将地图上的符号动画化为我现在要硬编码的另一组坐标。我已经尝试了很多东西,但无法弄清楚如何让它发挥作用。
我试过的:我看过两个 Mapbox Android SDK 的例子,并尝试了这些例子的变体,只是为了让标记移动到另一个点,但我很迷茫:
此示例使用 Object Animator: https://docs.mapbox.com/android/maps/examples/animate-marker-position/
此示例不使用任何 Animator,仅根据坐标更新元件: https://docs.mapbox.com/android/maps/examples/api-response-icon-update/
我现在所在的位置: 我最终决定只更新符号,文档指示我使用它:
AnnotationManager.update(Annotation).
但我不确定如何。请帮助我被困了很长时间,我感到迷路了。谢谢。
我想要发生的事情的图片: Animate Symbol To Point
P.S。 我应该试试 Object Animator 吗?
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Mapbox.getInstance(this, getString(R.string.access_token));
setContentView(R.layout.activity_main);
mapView = findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(@NonNull final MapboxMap mapboxMap) {
mapboxMap.setStyle(Style.LIGHT, new Style.OnStyleLoaded(){
@Override
public void onStyleLoaded(@NonNull Style style){
//Import Icon
Bitmap icon = BitmapFactory.decodeResource(getResources(),
R.drawable.blue_icon);
style.addImage(ID_IMAGE_SOURCE, icon);
style.addSource(new GeoJsonSource("source-id"));
//Create Symbol
SymbolManager symbolManager = new SymbolManager(mapView, mapboxMap, style);
symbolManager.setIconAllowOverlap(true);
symbolManager.setIconIgnorePlacement(true);
Symbol symbol = symbolManager.create(new SymbolOptions()
.withLatLng(new LatLng(33.718492, -117.796390))
.withIconImage(ID_IMAGE_SOURCE)
.withIconSize(.25f));
//Camera Position and Bounds
LatLngBounds latLngBounds = new LatLngBounds.Builder()
.include(new LatLng(33.717872, -117.796296))
.include(new LatLng(33.718342, -117.797975))
.build();
mapboxMap.animateCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds,
30));
已解决。需要来自 Android SDK 的动画师。太多了,从我原来的代码到 post 都在这里。如果您遇到同样的问题,请告诉我,我会提供帮助。
我发现使用交易品种管理器很容易更新标记的位置
//ADD VARIABLES
private SymbolManager symbolManager;
private Symbol originIcon;
在设置地图框样式时初始化图像和符号管理器
mapboxMap.setStyle(
new Style.Builder()
.fromUri(styleUrl)
// Add the SymbolLayer icon image to the map style
.withImage(ICON_ORIGIN, BitmapFactory.decodeResource(
this.getResources(), R.drawable.searchorigin)),
style -> {
// create symbol manager object
symbolManager = new SymbolManager(mapView, mapboxMap, style);
// set non-data-driven properties, such as:
symbolManager.setIconAllowOverlap(true);
symbolManager.setIconTranslate(new Float[]{-4f, 5f});
symbolManager.setIconRotationAlignment(ICON_ROTATION_ALIGNMENT_VIEWPORT);
});
然后使用符号管理器创建图标并更新位置
//CHECK IF THE MARKER IS INITIALIZE
if (originIcon == null) {
// Add symbol at specified lat/lon
originIcon = symbolManager.create(new SymbolOptions()
.withLatLng(new LatLng(location.latitude(), location.longitude()))
.withIconImage(ICON_ORIGIN)
.withIconSize(0.5f));
}else{
//UPDATE THE ICON BY USING SYMBOLMANAGER
originIcon.setLatLng(new LatLng(location.latitude(), location.longitude()));
symbolManager.update(originIcon);
}