功能:在地图上长按可添加Marker,可给Marker添加title及description,长按marker可移动
如下图所示:
DraggableMarkersTestFragment.java
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.mapbox.mapboxsdk.android.testapp.ui.CustomInfoWindow;
import com.mapbox.mapboxsdk.android.testapp.views.DraggableMarkerMapView;
import com.mapbox.mapboxsdk.api.ILatLng;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.overlay.Icon;
import com.mapbox.mapboxsdk.overlay.Marker;
import com.mapbox.mapboxsdk.tileprovider.tilesource.ITileLayer;
import com.mapbox.mapboxsdk.tileprovider.tilesource.MBTilesLayer;
import com.mapbox.mapboxsdk.tileprovider.tilesource.MapboxTileLayer;
import com.mapbox.mapboxsdk.views.MapView;
import com.mapbox.mapboxsdk.views.MapViewListener;
public class DraggableMarkersTestFragment extends Fragment
implements DraggableMarkerMapView.DraggableMarkerEventListener {
//DraggableMarkerView可移动标志点到其他地方
DraggableMarkerMapView mv;
Marker capitolMarker;
Marker museumMarker;
private static Marker marker;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// add custom map view
FrameLayout root = (FrameLayout)inflater.inflate(R.layout.fragment_draggablemarkermap, container, false);
mv = new DraggableMarkerMapView(getActivity().getApplicationContext());
mv.setAccessToken(getString(R.string.testAccessToken));
MBTilesLayer mbTileLayer = new MBTilesLayer("/mnt/sdcard/SJB/1/amsterdam998/m.mbtiles");
mv.setTileSource(new ITileLayer[]{mbTileLayer});
mv.setScrollableAreaLimit(mbTileLayer.getBoundingBox());
mv.setMinZoomLevel(mv.getTileProvider().getMinimumZoomLevel());
mv.setMaxZoomLevel(mv.getTileProvider().getMaximumZoomLevel());
mv.setCenter(mv.getTileProvider().getCenterCoordinate());
mv.setMapRotationEnabled(true);
mv.setZoom(14);
root.addView(mv);
mv.setLongClickable(true);
mv.setMapViewListener(new DraggableMarkerMapViewListener());
// listen for drag events from the custom MapView
mv.setDragEventListener(this);
return root;
}
@Override
public void onDragged(LatLng newPoint) {
marker.setPoint(newPoint);
}
@Override
public void onDragEnd() {
if (DraggableMarkersTestFragment.marker != null) { DraggableMarkersTestFragment.marker.setMarker(getResources().getDrawable(R.drawable.map_pin_favourite));
}
}
private class DraggableMarkerMapViewListener implements MapViewListener {
@Override
public void onShowMarker(MapView mapView, Marker marker) {
}
@Override
public void onHideMarker(MapView mapView, Marker marker) {
}
@Override
public void onTapMarker(MapView mapView, Marker marker) {
}
@Override
public void onLongPressMarker(MapView mapView, Marker marker) {
//长按Marker可进行移动
DraggableMarkersTestFragment.marker = marker;
((DraggableMarkerMapView) mapView).startDragging();
marker.setMarker(getResources().getDrawable(R.drawable.map_pin_favourite));
}
@Override
public void onTapMap(MapView mapView, ILatLng iLatLng) {
}
@Override
public void onLongPressMap(MapView mapView, ILatLng iLatLng) {
//长按地图添加Marker
Log.e("latitude", String.valueOf(iLatLng.getLatitude()));
Log.e("longitude", String.valueOf(iLatLng.getLongitude()));
Marker marker = new Marker(mapView, "", "", (LatLng) iLatLng);
//Bitmap bitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.map_pin_favourite);
//marker.setIcon(new Icon(new BitmapDrawable(bitmap)));
marker.setMarker(getResources().getDrawable(R.drawable.map_pin_favourite));
marker.showBubble(new CustomInfoWindow(mv),mv,true);//添加marker后自动弹出tooltip
//marker.setToolTip(new CustomInfoWindow(mv));
mapView.addMarker(marker);
}
}
}
CustomInfoWindow.java
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.mapbox.mapboxsdk.android.testapp.R;
import com.mapbox.mapboxsdk.overlay.Marker;
import com.mapbox.mapboxsdk.views.InfoWindow;
import com.mapbox.mapboxsdk.views.MapView;
public class CustomInfoWindow extends InfoWindow {
Button confirm;
EditText etName;
EditText etDescription;
public CustomInfoWindow(MapView mv) {
super(R.layout.infowindow_custom, mv);
}
/**
* Dynamically set the content in the CustomInfoWindow
* @param overlayItem The tapped Marker
*/
@Override
public void onOpen(final Marker overlayItem) {
confirm = (Button) mView.findViewById(R.id.confirm);
etName = (EditText) mView.findViewById(R.id.tooltip_title);
etDescription = (EditText) mView.findViewById(R.id.tooltip_description);
double longitude = overlayItem.getPosition().getLongitude();
double latitude = overlayItem.getPosition().getLatitude();
confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
overlayItem.setTitle(etName.getText().toString());
overlayItem.setDescription(etDescription.getText().toString());
close();
}
});
}
}
DraggableMarkerMapView.java
package com.mapbox.mapboxsdk.android.testapp.views;
import android.content.Context;
import android.os.AsyncTask;
import android.view.MotionEvent;
import com.mapbox.mapboxsdk.api.ILatLng;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.views.MapView;
/**
* Override MapBox MapView to implement draggable markers
*/
public class DraggableMarkerMapView extends MapView {
private DraggableMarkerEventListener mDragEventListener;
private boolean amDragging = false;
public DraggableMarkerMapView(final Context aContext) {
super(aContext);
}
public interface DraggableMarkerEventListener {
void onDragged(LatLng newPoint);
void onDragEnd();
}
public void startDragging() {
amDragging = true;
}
public void setDragEventListener(DraggableMarkerEventListener listener) {
mDragEventListener = listener;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (amDragging) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_SCROLL:
case MotionEvent.ACTION_MOVE:
if (mDragEventListener != null) {
// Must get x and y from event on UI thread so they'll be relative to view
(new ProcessMoveEvents(this)).execute(event.getX(), event.getY());
}
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_UP:
amDragging = false;
if (mDragEventListener != null) {
mDragEventListener.onDragEnd();
}
break;
}
return true;
}
return super.onTouchEvent(event);
}
/**
* Handle drag events on a background thread, as converting to LatLng is somewhat
* CPU-intensive. Pass in x and y to execute.
*/
private class ProcessMoveEvents extends AsyncTask<Float, Integer, LatLng> {
private MapView mapView;
public ProcessMoveEvents(MapView mapView) {
super();
this.mapView = mapView;
}
@Override
protected LatLng doInBackground(Float... xy) {
ILatLng newLatLng = mapView.getProjection().fromPixels(xy[0], xy[1]);
LatLng newPt = new LatLng(newLatLng.getLatitude(), newLatLng.getLongitude());
return newPt;
}
@Override
protected void onPostExecute(LatLng latLng) {
super.onPostExecute(latLng);
mDragEventListener.onDragged(latLng);
}
}
}
fragment_draggablemarkermap.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:mapbox="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
infowindow_custom.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<EditText
android:id="@+id/tooltip_title"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:hint="名称"
android:textSize="13sp"
/>
<EditText
android:id="@+id/tooltip_description"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:hint="描述"
android:textSize="13sp"
/>
<Button
android:id="@+id/confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="yes"
/>
</LinearLayout>