Android-карты: как определить центр карты после завершения перетаскивания

Есть ли способ через API андроидных карт, где я могу обнаружить центр карты после завершения анимации панорамирования? Я хочу использовать эту информацию для загрузки маркеров с сервера динамически. Благодаря BD

Solutions Collecting From Web of "Android-карты: как определить центр карты после завершения перетаскивания"

Я также искал решение «перетащить конец», которое обнаруживает центр карты в данный момент точно после того, как карта закончила движение. Я не нашел его, поэтому я сделал эту простую реализацию, которая отлично работает:

private class MyMapView extends MapView { private GeoPoint lastMapCenter; private boolean isTouchEnded; private boolean isFirstComputeScroll; public MyMapView(Context context, String apiKey) { super(context, apiKey); this.lastMapCenter = new GeoPoint(0, 0); this.isTouchEnded = false; this.isFirstComputeScroll = true; } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) this.isTouchEnded = false; else if (event.getAction() == MotionEvent.ACTION_UP) this.isTouchEnded = true; else if (event.getAction() == MotionEvent.ACTION_MOVE) this.isFirstComputeScroll = true; return super.onTouchEvent(event); } @Override public void computeScroll() { super.computeScroll(); if (this.isTouchEnded && this.lastMapCenter.equals(this.getMapCenter()) && this.isFirstComputeScroll) { // here you use this.getMapCenter() (eg call onEndDrag method) this.isFirstComputeScroll = false; } else this.lastMapCenter = this.getMapCenter(); } } 

Вот и все, надеюсь, это поможет! о /

Вы используете MapActivity ? Вот код, который я использовал:

 MapView mapView = (MapView)findViewById(R.id.map); Projection projection = mapView.getProjection(); int y = mapView.getHeight() / 2; int x = mapView.getWidth() / 2; GeoPoint geoPoint = projection.fromPixels(x, y); double centerLatitude = (double)geoPoint.getLatitudeE6() / (double)1E6; double centerLongitude = (double)geoPoint.getLongitudeE6() / (double)1E6; 

Вам также нужно добавить код, аналогичный этому:

 @Override public boolean dispatchTouchEvent(MotionEvent event) { boolean result = super.dispatchTouchEvent(event); if (event.getAction() == MotionEvent.ACTION_UP) reload_map_data(); /// call the first block of code here return result; } 

С августа 2016 года Карты для Android способны обнаруживать такие события, как onCameraMoveStarted (и причины для перемещения, например REASON_GESTURE , REASON_DEVELOPER_ANIMATION .

Следующий код (в основном взятый из документов ) дает представление о том, чего вы можете достичь:

 public class MyCameraActivity extends FragmentActivity implements OnCameraMoveStartedListener, OnCameraMoveListener, OnCameraMoveCanceledListener, OnCameraIdleListener, OnMapReadyCallback { private GoogleMap mMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_camera); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap map) { mMap = map; mMap.setOnCameraIdleListener(this); mMap.setOnCameraMoveStartedListener(this); mMap.setOnCameraMoveListener(this); mMap.setOnCameraMoveCanceledListener(this); // Show Sydney on the map. mMap.moveCamera(CameraUpdateFactory .newLatLngZoom(new LatLng(-33.87365, 151.20689), 10)); } @Override public void onCameraMoveStarted(int reason) { if (reason == OnCameraMoveStartedListener.REASON_GESTURE) { Toast.makeText(this, "The user gestured on the map.", Toast.LENGTH_SHORT).show(); } else if (reason == OnCameraMoveStartedListener .REASON_API_ANIMATION) { Toast.makeText(this, "The user tapped something on the map.", Toast.LENGTH_SHORT).show(); } else if (reason == OnCameraMoveStartedListener .REASON_DEVELOPER_ANIMATION) { Toast.makeText(this, "The app moved the camera.", Toast.LENGTH_SHORT).show(); } } @Override public void onCameraMove() { Toast.makeText(this, "The camera is moving.", Toast.LENGTH_SHORT).show(); } @Override public void onCameraMoveCanceled() { Toast.makeText(this, "Camera movement canceled.", Toast.LENGTH_SHORT).show(); } @Override public void onCameraIdle() { Toast.makeText(this, "The camera has stopped moving.", Toast.LENGTH_SHORT).show(); // Here you get the camera center GeoPoint geoPoint = projection.fromPixels(mMap.getHeight() / 2, mMap.getWidth() / 2); double centerLat = (double)geoPoint.getLatitudeE6() / (double)1E6; double centerLng = (double)geoPoint.getLongitudeE6() / (double)1E6; } }