Wie kann man einen Marker ziehbar machen in Mapbox Android SDK? Ist das überhaupt möglich?Mapbox Android SDK - Ziehbarer Marker
Wenn nicht, welche andere freie Open Map Engine unterstützt diese Funktion?
Danke!
Wie kann man einen Marker ziehbar machen in Mapbox Android SDK? Ist das überhaupt möglich?Mapbox Android SDK - Ziehbarer Marker
Wenn nicht, welche andere freie Open Map Engine unterstützt diese Funktion?
Danke!
Haben Sie Leaflet untersucht? Sie unterstützen Android, iOS und alle gängigen mobilen Plattformen. Soweit ich mich erinnere, wurde sogar Mapbox SDK über Leaflet gebaut.
Hier ist ein Link, den Sie sich beziehen können: http://leafletjs.com/examples/mobile.html
ich für eines meiner Projekte ziehbar Marker hatte zu implementieren. Die einzige Lösung, die ich gefunden habe, besteht darin, die existierende Marker-Klasse zu erweitern, indem man das Ziehereignis prüft und die Markerposition entsprechend aktualisiert.
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;
}
}
Später müssen Sie Zuhörer auf Touch-Ereignisse auf MapView hinzufügen und überprüfen, ob Ihr Marker (oder eine der vielen in Ihrer Markierersammlung) von dem Ereignis betroffen ist.
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);
}
});
Das Mapbox Android SDK ist nativ, nicht webbasiert und/oder basiert auf Leaflet. – incanus