2

我正在使用谷歌地图 API,并且我有一些代码试图在用户拖动地图后捕获地图中心的位置。

MapView mv = ...;

mv.setOnTouchListener(new OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            GeoPoint pt = mv.getMapCenter();
            //do something with the point
            return A;
        }
        return B;
    }
});

现在我的问题是返回值:

  • 如果 B 为假,地图会被拖动,但我只看到ACTION_DOWN事件并且ACTION_UP从未触发 - 我理解
  • 如果 B 为真,我收到ACTION_UP事件,但地图没有被拖动
  • 似乎A是真还是假并没有区别

我想要的是接收ACTION_UP事件并拖动地图。

我在这里想念什么?

4

2 回答 2

2

这是一个解决方案:不使用默认 MapView,而是使用具有 GestureDetector 的自定义 MapView,基本上,这可以让您为地图创建自定义事件侦听器,帮助您避免拖拽等问题,此外还可以为您提供与默认的 MapView 相比,有大量的交互选项。几个月前,我遇到了类似的问题,所以我决定实施我刚才提到的解决方案。下面是名为 TapControlledMapView 的自定义 MapView 的代码,底部提供了自定义侦听器的接口代码:http: //pastebin.com/kUrm9zFg

因此,要实现监听器,您需要做的就是在您的 mapactivity 类中使​​用以下代码(哦,如果您不知道这一点,您必须在 MapActivity 布局 XML 文件中声明以下内容,因为您使用的是自定义地图视图:

<?xml version="1.0" encoding="utf-8"?>
//The bottom line was the tricky business (You get ClassCastExceptions and whatnot)
<NAMEOFYOURPROJECT.TapControlledMapView (ex: com.android.googlemapsapp.TapControlledMapView)
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:apiKey="API_KEY_HERE"
/>

并在您的 MapActivity 类中使​​用以下代码。

mapView.setOnSingleTapListener(new OnSingleTapListener() {

@Override
 public boolean onSingleTap(MotionEvent arg1) {
 if(arg1.getAction() == MotionEvent.ACTION_UP)
 {
  GeoPoint pt = mv.getMapCenter();
  // do something with the point.
  return ***true***;
 }
return true;
});

让我知道事情的后续。

于 2012-08-30T00:23:38.217 回答
0

按照@ViswaPatel 的想法,我创建了一个新的MapView 类,扩展了MapView,它重写了onTouchEvent方法并管理了自己的监听器:

public class CustomMapView extends MapView {

    private OnTouchListener lst;

    public CustomMapView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomMapView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public CustomMapView(Context context, String apiKey) {
        super(context, apiKey);
    }

    public void setOnActionUpListener(OnTouchListener lst) {
        this.lst = lst;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        if (lst != null && event.getAction() == MotionEvent.ACTION_UP) {
            lst.onTouch(this, event); // return value ignored
        }
        return true;
    }
}

调用代码是:

  mv.setOnActionUpListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            final GeoPoint pt = mv.getMapView().getMapCenter();
            //doing my stuff here
            return true; //ignored anyway
        }
    });
}
于 2012-08-30T21:03:01.747 回答