2014-11-07 16 views

risposta

-4

Hai esplorato Leaflet? Supportano Android, IOS e tutte le piattaforme mobili standard. Per quanto mi ricordi, anche Mapbox SDK è stato costruito su Leaflet.

Ecco un link è possibile fare riferimento a: http://leafletjs.com/examples/mobile.html

+2

Mapbox Android SDK è nativo, non basato sul Web e/o basato su Leaflet. – incanus

5

ho dovuto implementare i marcatori trascinabili per uno dei miei progetti. L'unica soluzione che ho trovato è di estendere la classe Marker esistente con il controllo dei parametri per l'evento di trascinamento e l'aggiornamento della posizione del marcatore di conseguenza.

package com.example.map; 

import android.graphics.PointF; 
import android.graphics.Rect; 
import android.graphics.RectF; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 

import com.mapbox.mapboxsdk.api.ILatLng; 
import com.mapbox.mapboxsdk.geometry.LatLng; 
import com.mapbox.mapboxsdk.overlay.Marker; 
import com.mapbox.mapboxsdk.views.MapView; 
import com.mapbox.mapboxsdk.views.util.Projection; 

public class DraggableMarker extends Marker { 

    private static final String TAG = "map.DraggableMarker"; 

    private boolean mIsDragged; 
    private static final RectF mTempRect = new RectF(); 
    private static final PointF mTempPoint = new PointF(); 
    private float mDx, mDy; 

    public DraggableMarker(String title, String description, LatLng latLng) { 
     super(title, description, latLng); 
     mIsDragged = false; 
    } 

    public DraggableMarker(MapView mv, String aTitle, String aDescription, LatLng aLatLng) { 
     super(mv, aTitle, aDescription, aLatLng); 
     mIsDragged = false; 
    } 

    public boolean drag(View v, MotionEvent event) { 
     final int action = event.getActionMasked(); 
     if(action == MotionEvent.ACTION_DOWN) { 
      Projection pj = ((MapView)v).getProjection(); 
      RectF bound = getDrawingBounds(pj, mTempRect); 
      if(bound.contains(event.getX(), event.getY())) { 
       mIsDragged = true; 
       PointF p = getPositionOnScreen(pj, mTempPoint); 
       mDx = p.x - event.getX(); 
       mDy = p.y - event.getY(); 
      } 
     } 
     if(mIsDragged) { 
      if((action == MotionEvent.ACTION_CANCEL) || 
        (action == MotionEvent.ACTION_UP)) { 
       mIsDragged = false; 
      } else { 
       Projection pj = ((MapView)v).getProjection(); 
       ILatLng pos = pj.fromPixels(event.getX() + mDx, event.getY() + mDy); 
       setPoint(new LatLng(pos.getLatitude(), pos.getLongitude())); 
      } 
     } 

     return mIsDragged; 
    } 
} 

In seguito è necessario aggiungere ascoltatore in eventi di tocco su MapView e verificare se il marcatore (o uno dei tanti nella vostra collezione marcatore) è influenzata dall'evento.

mMarker = new DraggableMarker(mMapView, "", "", aCenter); 
mMarker.setIcon(new Icon(getActivity().getApplicationContext(), Icon.Size.SMALL, "marker-stroked", "FF0000")); 
mMapView.addMarker(mMarker); 

mMapView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return mMarker.drag(v, event); 
    } 
});