如何在openstreetmap android中制作触摸事件

如何在openstreetmap android中制作触摸事件,android,openstreetmap,ontouchlistener,Android,Openstreetmap,Ontouchlistener,我在OSM地图上痛苦。这是我新买的。我想用单键点击和长按的方式打印祝酒词。我尝试了所有我能做的事情。但是我没有找到正确的方法。这是我的密码。请给我正确的方法来解决这个问题。非常感谢。请 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.map1); final MapView mapView = (Map

我在OSM地图上痛苦。这是我新买的。我想用单键点击和长按的方式打印祝酒词。我尝试了所有我能做的事情。但是我没有找到正确的方法。这是我的密码。请给我正确的方法来解决这个问题。非常感谢。请

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map1);
    final MapView mapView = (MapView) findViewById(R.id.mapViewosm);
    mapView.setBuiltInZoomControls(true);

    MapController myMapController = mapView.getController();
    myMapController.setZoom(13);

    ScaleBarOverlay myScaleBarOverlay = new ScaleBarOverlay(this);
    mapView.getOverlays().add(myScaleBarOverlay);

    Drawable marker = getResources().getDrawable(
            android.R.drawable.star_big_on);
    int markerWidth = marker.getIntrinsicWidth();
    int markerHeight = marker.getIntrinsicHeight();
    marker.setBounds(0, markerHeight, markerWidth, 0);

    ResourceProxy resourceProxy = new DefaultResourceProxyImpl(
            getApplicationContext());

    myItemizedOverlay = new MyItemizedOverlay(marker, resourceProxy);
    mapView.getOverlays().add(myItemizedOverlay);

    GeoPoint myPoint1 = new GeoPoint(0 * 1000000, 0 * 1000000);
    myItemizedOverlay.addItem(myPoint1, "myPoint1", "myPoint1");
    GeoPoint myPoint2 = new GeoPoint(50 * 1000000, 50 * 1000000);
    myItemizedOverlay.addItem(myPoint2, "myPoint2", "myPoint2");

    myLocationOverlay = new MyLocationOverlay(this, mapView);
    mapView.getOverlays().add(myLocationOverlay);
    myLocationOverlay.enableMyLocation();

    myLocationOverlay.runOnFirstFix(new Runnable() {
        public void run() {
            mapView.getController().animateTo(
                    myLocationOverlay.getMyLocation());
        }
    });
    // 2nd
    // // --- Create Overlay
    // overlayItemArray = new ArrayList<OverlayItem>();
    //
    // DefaultResourceProxyImpl defaultResourceProxyImpl = new
    // DefaultResourceProxyImpl(
    // this);
    // MyItemizedIconOverlay myItemizedIconOverlay = new
    // MyItemizedIconOverlay(
    // overlayItemArray, null, defaultResourceProxyImpl);
    // mapView.getOverlays().add(myItemizedIconOverlay);
    // // ---
    // locationManager = (LocationManager)
    // getSystemService(Context.LOCATION_SERVICE);
    //
    // // for demo, getLastKnownLocation from GPS only, not from NETWORK
    // Location lastLocation = locationManager
    // .getLastKnownLocation(LocationManager.GPS_PROVIDER);
    // if (lastLocation != null) {
    // updateLoc(lastLocation);
    // }

    // 1st
     anotherOverlayItemArray = new ArrayList<OverlayItem>();
     anotherOverlayItemArray.add(new OverlayItem("0, 0", "0, 0",
     new GeoPoint(0, 0)));
     anotherOverlayItemArray.add(new OverlayItem("US", "US", new GeoPoint(
     38.883333, -77.016667)));
     ItemizedIconOverlay<OverlayItem> anotherItemizedIconOverlay = new
     ItemizedIconOverlay<OverlayItem>(
     this, anotherOverlayItemArray, myOnItemGestureListener);
     mapView.getOverlays().add(anotherItemizedIconOverlay);

}

// 1st
 OnItemGestureListener<OverlayItem> myOnItemGestureListener = new
 OnItemGestureListener<OverlayItem>() {

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

 Toast.makeText(getApplicationContext(), "long tap",
 Toast.LENGTH_SHORT).show();
 return true;
 }

 @Override
 public boolean onItemSingleTapUp(int index, OverlayItem item) {

 Toast.makeText(getApplicationContext(), "single tap",
 Toast.LENGTH_SHORT).show();
 Toast.makeText(
 Map.this,
 item.mDescription + "\n" + item.mTitle + "\n"
 + item.mGeoPoint.getLatitudeE6() + " : "
 + item.mGeoPoint.getLongitudeE6(),
 Toast.LENGTH_LONG).show();
 return true;
 }

 };
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.map1);
最终MapView MapView=(MapView)findViewById(R.id.mapViewosm);
mapView.SetBuilTinZoomControl(真);
MapController myMapController=mapView.getController();
myMapController.setZoom(13);
ScaleBarOverlay myScaleBarOverlay=新的ScaleBarOverlay(此);
mapView.getOverlays().add(myScaleBarOverlay);
可绘制标记=getResources().getDrawable(
android.R.drawable.star\u big\u on);
int-markerWidth=marker.getIntrinsicWidth();
int-markerHeight=marker.getIntrinsicHeight();
标记.立根(0,标记高度,标记宽度,0);
ResourceProxy ResourceProxy=新的DefaultResourceProxyImpl(
getApplicationContext());
myItemizedOverlay=新的myItemizedOverlay(标记,resourceProxy);
mapView.getOverlays().add(myItemizedOverlay);
地质点myPoint1=新的地质点(0*1000000,0*1000000);
添加项(myPoint1,“myPoint1”,“myPoint1”);
地质点myPoint2=新的地质点(50*1000000,50*1000000);
添加项(myPoint2、“myPoint2”、“myPoint2”);
myLocationOverlay=新建myLocationOverlay(此为地图视图);
mapView.getOverlays().add(myLocationOverlay);
myLocationOverlay.enableMyLocation();
myLocationOverlay.runOnFirstFix(新的Runnable()文件){
公开募捐{
mapView.getController().animateTo(
myLocationOverlay.getMyLocation());
}
});
//第二
///---创建覆盖
//overlayItemArray=新的ArrayList();
//
//DefaultResourceProxyImpl DefaultResourceProxyImpl=新建
//DefaultResourceProxyImpl(
//这),;
//MyItemIzedEdiconOverlay MyItemIzedEdiconOverlay=新建
//Myitemizedictionoverlay(
//overlayItemArray,null,defaultResourceProxyImpl);
//mapView.getOverlays().add(MyItemIzedEdiconOverlay);
// // ---
//locationManager=(locationManager)
//getSystemService(Context.LOCATION\u服务);
//
////对于演示,仅从GPS获取LastKnown位置,而不是从网络获取
//Location lastLocation=locationManager
//.getLastKnownLocation(LocationManager.GPS\U提供商);
//if(lastLocation!=null){
//updateLoc(最后位置);
// }
//第一
anotherOverlayItemArray=new ArrayList();
另一个OverlayItemArray.add(新的OverlayItem(“0,0”,“0,0”,
新的地质点(0,0));
另一个OverlayItemArray.add(新的OverlayItem(“美国”,“美国”,新的地质点(
38.883333, -77.016667)));
ItemizedEdiconOverlay另一个ItemizedEdiconOverlay=新建
项目法令概述(
这是另一个OverlayItemArray,myOnItemGestureListener);
mapView.getOverlays().add(AnotheritemizedEdiconOverlay);
}
//第一
OnItemEstureListener myOnItemGestureListener=新建
OnItemTestureListener(){
@凌驾
公共布尔值(int arg0,OverlayItem arg1){
//TODO自动生成的方法存根
Toast.makeText(getApplicationContext(),“长点击”,
吐司。长度(短)。show();
返回true;
}
@凌驾
公共布尔值onItemSingleTapUp(整型索引,覆盖项项){
Toast.makeText(getApplicationContext(),“单点击”,
吐司。长度(短)。show();
Toast.makeText(
地图,这个,
item.mDescription+“\n”+item.mTitle+“\n”
+item.mGeoPoint.getLatitudeE6()+“:”
+item.mGeoPoint.getLongitudeE6(),
Toast.LENGTH_LONG).show();
返回true;
}
};

我终于找到了这个问题的解决方案。这是我的答案

@Override
    public boolean onSingleTapConfirmed(MotionEvent e, MapView mapView) {

        Projection proj = mapView.getProjection();
        p = (GeoPoint) proj.fromPixels((int) e.getX(), (int) e.getY());
         proj = mapView.getProjection();
         loc = (GeoPoint) proj.fromPixels((int) e.getX(), (int) e.getY());
         String longitude = Double
         .toString(((double) loc.getLongitudeE6()) / 1000000);
         String latitude = Double
         .toString(((double) loc.getLatitudeE6()) / 1000000);
         Toast toast = Toast.makeText(getApplicationContext(),
         "Longitude: "
         + longitude + " Latitude: " + latitude, Toast.LENGTH_SHORT);
         toast.show();
        return true;
    }

private void addLocation(double lat, double lng) {
    // ---Add a location marker---

    p = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));

    Drawable marker = getResources().getDrawable(
            android.R.drawable.star_big_on);

    int markerWidth = marker.getIntrinsicWidth();
    int markerHeight = marker.getIntrinsicHeight();

    marker.setBounds(0, markerHeight, markerWidth, 0);

    ResourceProxy resourceProxy = new DefaultResourceProxyImpl(
            getApplicationContext());

    myItemizedOverlay = new MyItemizedOverlay(marker, resourceProxy);

    List<Overlay> listOfOverlays = mapView.getOverlays();
    listOfOverlays.clear();
    listOfOverlays.add(myItemizedOverlay);

    mapView.invalidate();
}
@覆盖
公共布尔值OnSingleTapConfiged(MotionEvent e,MapView MapView){
Projection proj=mapView.getProjection();
p=(地理点)项目从像素((int)e.getX(),(int)e.getY());
proj=mapView.getProjection();
loc=(地理点)proj.fromPixels((int)e.getX(),(int)e.getY());
字符串经度=双精度
.toString(((双)loc.getLongitudeE6())/1000000);
字符串纬度=双
.toString(((双)loc.getLatitudeE6())/1000000);
Toast Toast=Toast.makeText(getApplicationContext(),
“经度:”
+经度+“纬度:”+纬度,土司。长度(短);
toast.show();
返回true;
}
专用位置(双lat、双lng){
//---添加位置标记---
p=新地质点((内部)(纬度*1E6),(内部)(液化天然气*1E6));
可绘制标记=getResources().getDrawable(
android.R.drawable.star\u big\u on);
int-markerWidth=marker.getIntrinsicWidth();
int-markerHeight=marker.getIntrinsicHeight();
标记.立根(0,标记高度,标记宽度,0);
ResourceProxy ResourceProxy=新的DefaultResourceProxyImpl(
getApplicationContext());
myItemizedOverlay=新的myItemizedOverlay(标记,resourceProxy);
List ListoForLays=mapView.getOverlays();
listOfOverlays.clear();
添加(myItemizedOverlay);
mapView.invalidate();
}

在osm中,您可以使用MapEventsReceiver来检测抽头:

MapEventsReceiver mReceive = new MapEventsReceiver() {
        @Override
        public boolean singleTapConfirmedHelper(GeoPoint p) {

            // write your code here

            return false;
        }

        @Override
        public boolean longPressHelper(GeoPoint p) {
            // write your code here
            return false;
        }
    };
    MapEventsOverlay OverlayEvents = new MapEventsOverlay(getBaseContext(), mReceive);
    map.getOverlays().add(OverlayEvents);
资料来源: