【问题标题】:How do I respond to a tap on an Android MapView, but ignore pinch-zoom?如何响应 Android MapView 上的点击,但忽略捏缩放?
【发布时间】:2011-06-15 22:01:59
【问题描述】:

我在一个活动中有一个 MapView,它工作正常,地图显示,它响应点击,我可以轻松提取位置。但是,这个处理程序也会响应捏合缩放,因此如果用户尝试捏合缩放,应用会做出响应,就像他们点击了一样(这让他们非常困惑)。

我怎样才能响应 MapView 上的点击而只选择单击,特别是忽略捏缩放和双击?

我是否需要使用 OnTouchEvent() 而不是 OnTap()?如果是,我如何区分不同的触摸事件,以及如何访问 GeoPoint?

这是我的 MapActivity 中的代码:

class MapOverlay extends com.google.android.maps.Overlay
{
    @Override
    public boolean onTap(GeoPoint p, MapView map)
    {
        if ( p!=null )
        {
            // Do stuff with the geopoint
            return true;                                 // We handled the tap
        }
        else
        {
            return false;                                // We didn't handle the tap
        }
    }
}

【问题讨论】:

  • 你也许可以继续使用 onTap,它被设计为仅在点击覆盖项目时响应(而不是地图上的任何位置),并且仍然在 MapView 上设置一个触摸侦听器以忽略捏合,像这样:stackoverflow.com/questions/4626028/…
  • 有趣地拖动地图就可以了。所以 Drag 不会触发 onTap() 但点击会(如预期的那样)但也会捏和缩放。这不是我所期望的。
  • 我不想禁用捏合和缩放功能,我希望它能够工作,我只想让我的应用程序也能使用 onTap。

标签: android


【解决方案1】:

经过多次摸索和尝试各种方法后,这个方法目前运行良好。代码遵循运动事件。当我们得到一个 ACTION_DOWN 事件时,它会将 isPinch 标志标记为 false(我们还不知道它是否是捏),但是一旦我们得到一个涉及两个手指的触摸事件(即 ACTION_MOVE),isPinch 就会被设置为true,所以当 onTap() 事件触发时,它可以查看是否有捏。

class MapOverlay extends com.google.android.maps.Overlay
{
private boolean   isPinch  =  false;

@Override
public boolean onTap(GeoPoint p, MapView map){
    if ( isPinch ){
        return false;
    }else{
        Log.i(TAG,"TAP!");
        if ( p!=null ){
            handleGeoPoint(p);
            return true;            // We handled the tap
        }else{
            return false;           // Null GeoPoint
        }
    }
}

@Override
public boolean onTouchEvent(MotionEvent e, MapView mapView)
{
    int fingers = e.getPointerCount();
    if( e.getAction()==MotionEvent.ACTION_DOWN ){
        isPinch=false;  // Touch DOWN, don't know if it's a pinch yet
    }
    if( e.getAction()==MotionEvent.ACTION_MOVE && fingers==2 ){
        isPinch=true;   // Two fingers, def a pinch
    }
    return super.onTouchEvent(e,mapView);
}

}

【讨论】:

  • 太棒了!正是我想要的。我会给你+2! :)
  • 谢谢,在我意识到我遇到了完全相同的问题之前,我就发现了这个问题!很高兴马上得到解决方案 =)
  • 谢谢奥利。我在 HTC 手机上遇到了这个问题……现在我们的答案解决了……
猜你喜欢
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 2012-12-04
  • 2013-01-06
  • 1970-01-01
相关资源
最近更新 更多