首页 > 解决方案 > Xamarin Android - 在“OpenStreetMap for Android (osmdroid)”中设置触摸标记

问题描述

我正在使用这个库: https ://github.com/osmdroid/osmdroid

我正在尝试将touch事件标记添加到我的 MapView (OSMDroid),但未能成功。

我尝试使用此指南,但没有成功: http ://android-er.blogspot.com/2012/05/implement-onitemgesturelistener-on.html

示例代码如下:

OnItemGestureListener<OverlayItem> myOnItemGestureListener
    = new OnItemGestureListener<OverlayItem>(){

  @Override
  public boolean onItemLongPress(int arg0, OverlayItem arg1) {
   // TODO Auto-generated method stub
   return false;
  }

  @Override
  public boolean onItemSingleTapUp(int index, OverlayItem item) {
   Toast.makeText(AndroidOpenStreetMapViewActivity.this, 

     item.mDescription+item.mTitle+item.mGeoPoint.getLatitudeE6() +":" 

+item.mGeoPoint.getLongitudeE6(), 


  Toast.LENGTH_LONG).show();

   return true;

  }

我正在尝试用 C# 编写上面的代码,你可以看到它。但是当触摸屏设备方法 OnSingleTapConfirmed 在类 MapOverlay Called.Problem In Value MotionEvent 中添加标记。发布错误。添加标记的精确值 MotionEvent。请帮助几天解决涉及的问题

  public class MapOverlay : Overlay
    {
        Context _ctx;


        public MapOverlay(Context ctx ) : base(ctx)
        {
            _ctx = ctx;

        }

        protected MapOverlay(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
        {

        }
        //the mistake Position MotionEvent For Add Marker
        public override bool OnSingleTapConfirmed(MotionEvent e, Osmdroid.Views.MapView mapView)
        {

             mapView.SetBuiltInZoomControls(true);
            var myMapController = mapView.Controller;
            myMapController.SetZoom(2);
            var myoverlayPointt = new OverlayItem("MyTitle", "MyText",
              //the mistake Position MotionEvent For Add Marker
              new Osmdroid.Util.GeoPoint(e.RawX,e.RawY));

            var myoverlays = new List<OverlayItem>();
            myoverlays.Add(myoverlayPointt);


            var myItemIconOverlays = new Osmdroid.Views.Overlay.
                ItemizedIconOverlay(_ctx, myoverlays, null);
            mapView.Overlays.Add(myItemIconOverlays);
            ScaleBarOverlay myScaleBarOverlay = new ScaleBarOverlay(_ctx);
            mapView.Overlays.Add(myScaleBarOverlay);

            return true;
        }

        public override void Draw(Canvas c, Osmdroid.Views.MapView osmv, bool shadow)
        {
        }


    }

    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        Osmdroid.Views.MapView mapview;
        private MapOverlay mmapOverlay = null;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.layout2);
        mapview = FindViewById<Osmdroid.Views.MapView>(Resource.Id.mapView1);

            var myMapController = mapview.Controller;
            myMapController.SetZoom(7);
            //Add Marker
            var myoverlayPoint = new OverlayItem("MyTitle", "MyText",
                new Osmdroid.Util.GeoPoint(29.62427, 52.53181));


            var myoverlays = new List<OverlayItem>();

            myoverlays.Add(myoverlayPoint);

            var myItemIconOverlays = new Osmdroid.Views.Overlay.
                ItemizedIconOverlay(this, myoverlays, null);
            mapview.Overlays.Add(myItemIconOverlays);
            ScaleBarOverlay myScaleBarOverlay = new ScaleBarOverlay(this);
            mapview.Overlays.Add(myScaleBarOverlay);
            //called class when Run Touch In Map
            this.mmapOverlay = new MapOverlay(this);
            mapview.Overlays.Add(mmapOverlay);

        }

    }

标签: androidxamarinxamarin.androidmarkerosmdroid

解决方案



推荐阅读