安卓mapbox实现收藏地点功能

该博客介绍了如何在Android中使用Mapbox实现地图上的收藏地点功能,包括长按添加Marker,设置Marker的title和description,并允许用户通过长按移动Marker。
摘要由CSDN通过智能技术生成

功能:在地图上长按可添加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>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值