MapView中的Zoom和onTap正在混合,如何解决?

时间:2012-11-10 15:23:40

标签: android android-mapview android-maps android-overlay

我的应用程序中有一个MapView。 我有很多OverlayItems,带有一点标记。

如果我触摸一个overlayitem,onTap()方法会运行,我会得到一个小对话框。 它工作得很好,但有时当我尝试使用多点触控进行缩放时,我的手指位于叠加层的顶部,在完成缩放后会出现对话框。它有点儿,因为它不是那么符合人体工程学,因为你必须在缩放后关闭即将出现的对话框。

我该怎样阻止我的应用程序参加此活动? 我不希望onTap()在我缩放时运行。

我尝试使用onTouch事件和2个布尔但不能正常工作:

  @Override
    public boolean onTouchEvent(MotionEvent event, MapView mapView) {

         int action = event.getAction() & MotionEvent.ACTION_MASK;

         switch (action) {
                case MotionEvent.ACTION_DOWN: {
                    actionIsDown= true;
                    break;
                }

                case MotionEvent.ACTION_POINTER_DOWN: {

                    pointerIsDown=true;
                        break;
                }
                case MotionEvent.ACTION_POINTER_UP: {

                    pointerIsDown= false;
                        break;
                }
                case MotionEvent.ACTION_UP: {

                    actionIsDown= false;
                        break;
                }
         }


        return super.onTouchEvent(event, mapView);
    }

onTap:

    @Override
    protected boolean onTap(int index) 
    {



            if(pointerIsDown==false && actionIsDown==false){ //...dialog here

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您的代码无效,因为onTap()MotionEvent.ACTION_POINTER_UP发生MotionEvent.ACTION_UPMotionEvent.ACTION_POINTER_DOWN时会触发MotionEvent.ACTION_DOWN

要正确测试,您需要在UP操作期间检查是否使用了移动来缩放地图,然后将其保存到布尔值。

示例代码:

Geopoint center = new Geopoint(0,0);
Boolean ignoreTap = false;

@Override
public boolean onTouchEvent(MotionEvent event, MapView mapView) {

     int action = event.getAction() & MotionEvent.ACTION_MASK;

     switch (action) {
            case MotionEvent.ACTION_POINTER_DOWN: {
            case MotionEvent.ACTION_DOWN: {
                center = mapView.getMapCenter();
                ignoreTap = false;
                break;
            }

            case MotionEvent.ACTION_UP: {
            case MotionEvent.ACTION_POINTER_UP: {
                  if(center != mapView.getMapCenter())
                    ignoreTap = true;
                  break;
            }
     }
    return super.onTouchEvent(event, mapView);
}

onTap()

@Override
protected boolean onTap(int index) 
{
        if(!ignoreTap){ //...dialog here

Note:我正在使用地图中心测试缩放,因为多点触控缩放工作在手指中心之间的地图点周围,导致缩放时中心变化。你也可以使用地图经度范围。