OnTouchListener可防止地图移动

时间:2012-08-29 23:19:14

标签: android ontouchevent ontouchlistener

我正在使用谷歌地图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事件并拖动地图。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

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

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

<?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;
});

让我知道它是怎么回事。

答案 1 :(得分: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
        }
    });
}