在处理触摸SurfaceView在活动地图API V2(Handling touch events

2019-08-05 06:35发布

我在创建事件处理程序,而用户四处移动地图时将触发的问题。 有一个OnCameraChangeListener ,但地图移动停止触发。

我创建了SurfaceView了地图,现在我不知道该如何处理onScroll从事件OnGestureListener

下面是示例代码:

SurfaceView sv = new SView();
sv.setZOrderOnTop(true);
mapView.addView(sv);

...

public class SView extends SurfaceView implements Runnable, android.view.GestureDetector.OnGestureListener {
...
@Override
public boolean onTouchEvent(MotionEvent event) {
    //this worked in Overlay in Maps API v1
    if(gestureDetector.onTouchEvent(event)) {
        return true;
    }
    return false;
}
...

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    Log.i("test","onScroll");
    return false;
}

...
}

如果我设置return trueonTouchEventonScroll被称作但比我无法移动地图(这是显而易见的,该事件被消耗),我不知道如何分派事件到地图对象。

任何人都知道如何更新SurfaceView当MAP感动?

Answer 1:

我已经实现了一些其他的解决办法来解决这个问题。 我所做的 - 是我把自定义的RelativeLayout在我的GoogleMap的。 之后onInterceptTouchEvent回调就像一个魅力和基础地图接收触摸事件如预期

这里是我的xml:

<com.my.package.name.map.MapRelativeLayout
    android:id="@+id/map_root_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

     <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment"/>

</com.my.package.name.map.MapRelativeLayout>

和自定义的相对布局:

package com.my.package.name.map;

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

public class MapRelativeLayout extends RelativeLayout
{
    private GestureDetector gestureDetector;

    public MapRelativeLayout(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        gestureDetector = new GestureDetector(context, new GestureListener());
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev)
    {
        gestureDetector.onTouchEvent(ev);
        return false;
    }

    private class GestureListener extends GestureDetector.SimpleOnGestureListener {

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            return false;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY)
        {
            return false;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                float distanceX, float distanceY)
        {
            //do whatever you want here
            return false;
        }
    }
}


Answer 2:

来源: Android的ListView控件:最主要的原因滚动不执行

你有没有打过电话super.onTouchEvent(event)在你onTouchEvent方法是什么?

编辑 -我想你想返回false你也onScroll方法。

那么你onTouchEvent方法应该是:

 @Override public boolean onTouchEvent(MotionEvent event) { if (gestureDetector.onTouchEvent(event)) { return true; } return super.onTouchEvent(event); } 

其他可能有用的链接:

  • Android的:如何判断一个视图滚动
  • 添加GestureOverlayView我SurfaceView类,如何添加,查看层次?
  • Android的onFling没有响应
  • OnGestureListener onDown方法不会被调用
  • 覆盖的onTouchEvent与滚动型竞争


文章来源: Handling touch events in SurfaceView over Maps API v2