символ перемещения с перемещением камеры в картографическом окне - PullRequest
0 голосов
/ 08 мая 2020

Я хочу изменить и переместить свой символ при перемещении камеры с помощью метода onCameraMoveListener в Mapbox, но я не могу распознать проблемы. На карте отображается только символ с именем «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 Ответ

2 голосов
/ 08 мая 2020

Две основные проблемы с вашим кодом.

  1. ID_ICON и ID_ICONN должны иметь фактические значения и быть уникальными. Значит, они не могут быть одинаковыми. Если они одинаковы, Mapbox Maps SDK для Android не будет знать, какой значок на самом деле использовать. Я сделал
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, чтобы его было легче запустить и запустить, вместо того, чтобы создавать совершенно новый проект 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);
  }
}
...