【问题标题】:Why MapView onTouchListener is only fired once? [duplicate]为什么 MapView onTouchListener 只触发一次? [复制]
【发布时间】:2012-02-23 20:56:59
【问题描述】:

可能重复:
OnTouch in MapView only fires the first time

我想检测用户对地图的每一次触摸,因此我为 MapView 的一个实例注册了一个监听器。但是,这个监听器只被调用一次,之后如果我想让它再次工作,我需要关闭应用程序。我正在使用 OsmDroid。

        mMapView = (MapView) findViewById(R.id.mapview); 

    mMapView.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            System.out.println("OnTouch MapView Listener!");
            return false;
        }
    });

【问题讨论】:

    标签: android android-mapview ontouchlistener osmdroid


    【解决方案1】:

    您是否尝试过返回 true 而不是 false? Mabey 有一个问题,因为您实际上并没有使用它所徘徊的触摸事件,因此不再被调用。

    【讨论】:

    • 是的,我确实尝试过,但它不起作用。
    • 哼。也许您可以尝试使用 onTouchEvent 代替?您可以在 MapActivity 中重写此方法
    • 我不能@Override onTouchEvent 方法,因为活动只是扩展了 Activity,所以它给了我一个错误,上面写着“MainActivity 类型的方法 onTouchEvent(MotionEvent, MapView) 必须覆盖超类方法”。跨度>
    • 是的。您必须改为扩展 MapActivity。这将使您覆盖该方法
    • 我尝试扩展 MapActivity,但我相信由于我使用的是 OsmDroid,它不会让我这样做。有什么想法吗?
    【解决方案2】:

    我也永远无法让它工作不止一次。我最终添加了一个什么都不做的叠加层,并在叠加层中放置了一个 onTouchEvent()。这有效

    public class OsmdroidDemoMap extends Activity {
    
        private MapView mMapView;
        private MapController mMapController;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.osm_main);
            mMapView = (MapView) findViewById(R.id.mapview);
            mMapView.setTileSource(TileSourceFactory.MAPNIK);
            mMapView.setBuiltInZoomControls(true);
            mMapView.setMultiTouchControls(true);
            mMapController = mMapView.getController();
            mMapController.setZoom(13);
            GeoPoint gPt = new GeoPoint(51500000, -150000);
            mMapController.setCenter(gPt);
            MapOverlay movl = new MapOverlay(this);
            mMapView.getOverlays().add(movl);
        }
    
        public class MapOverlay extends org.osmdroid.views.overlay.Overlay {
    
            public MapOverlay(Context ctx) {super(ctx);}
    
            @Override
            protected void draw(Canvas c, MapView osmv, boolean shadow) { }
    
            @Override
            public boolean onTouchEvent(MotionEvent e, MapView mapView) {
                if(e.getAction() == MotionEvent.ACTION_DOWN)
                    Toast.makeText(OsmdroidDemoMap.this, "Touched", Toast.LENGTH_SHORT).show();
                return false;
            }
        }
    }
    

    【讨论】:

    • 我试过这样做,但mMapView.getOverlays().add(movl); 让我的地图每次触摸时都会倾斜。我怀疑原因是我也从 OsmDroid 实现了 ItemizedOverlay。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2015-05-20
    • 2023-03-15
    • 2021-08-14
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多