【问题标题】:Handling touch events in SurfaceView over Maps API v2通过 Maps API v2 处理 SurfaceView 中的触摸事件
【发布时间】:2013-01-02 12:21:35
【问题描述】:

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

我在地图上创建了SurfaceView,现在我不知道如何处理来自OnGestureListeneronScroll 事件。

这里是示例代码:

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

...
}

如果我在onTouchEvent 中设置return true,则会调用onScroll,但我无法移动地图(这很明显,事件已被消耗),而且我不知道如何向下调度事件映射对象。

有人知道如何在地图移动时更新SurfaceView

【问题讨论】:

    标签: android google-maps google-maps-android-api-2


    【解决方案1】:

    我已经实施了一些其他解决方案来解决这个问题。我所做的 - 是将我的 GoogleMap 放在自定义的 RelativeLayout 中。 之后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;
            }
        }
    }
    

    【讨论】:

    • 这听起来像是一种 hacky 方式。如何从我的地图片段 java 类中调用 OnInterceptTouchEvent()?
    • @Quantumdroid onInterceptTouchEvent 被 Android 调用。你不需要手动调用它
    • 我按原样实现了您的代码(作为与我的主要活动分开的类),但是当我移动我的地图时从未调用过 onIntercepTouchEvent。
    • @Quantumdroid 您是否将地图包装到此自定义布局中?
    • 我做到了。我听从了你的指示。除了添加 Log.i("",""); onCameraChange();查看事件是否被触发。但没有运气。
    【解决方案2】:

    发件人:Android ListView: overriding causes scrolling do not executed

    您是否尝试过在您的 onTouchEvent方法?

    编辑 - 我想你也想在你的 onScroll 方法中返回 false

    那么你的onTouchEvent 方法应该是:

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

    其他可能有用的链接:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-10
      • 2015-06-16
      • 1970-01-01
      • 2016-05-20
      • 2010-12-02
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      相关资源
      最近更新 更多