GoogleMap在ViewPager中的片段内,将所有触摸事件保留在GoogleMap中

时间:2013-01-15 22:52:50

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

正如标题所述,我在一个片段中有一个GoogleMap控件(API v2),它本身就是ViewPager中的一个项目。当我在地图上拖动时,如果我的第一个拖动动作在水平轴上,则ViewPager会获取所有拖动事件。如果我在垂直平面上进行第一次拖动动作,则所有后续拖动都将委托给地图控件。我想让GoogleMap捕获所有拖动事件。我添加了一些调试,我看到当我点击地图控件时,当我开始在垂直平面上拖动时,没有onTouch事件甚至进入ViewPager,所以似乎GoogleMap第一次有机会处理事件或把它传下来我在GoogleMap类上找不到任何方法或监听器来告诉它处理所有触摸/移动/拖动事件。

2 个答案:

答案 0 :(得分:6)

解决方案是创建一个自定义ViewPager,重写canScroll方法并在我的xml中使用它。 canScroll方法以递归方式传递子视图树,然后决定是否允许View处理水平滚动或是否应由父ViewPager捕获

public class MyViewPager extends ViewPager {

    public MyViewPager (Context context) {
        super(context);
    }

    public MyViewPager (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        // Not satisfied with this method of checking...
        // working on a more robust solution
        if(v.getClass().getName().equals("maps.j.b")) {
            return true;
        }
        return super.canScroll(v, checkV, dx, x, y);
    }

}

并在你的布局......

<com.myproject.view.MyViewPager
    android:id="@+id/pager"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

答案 1 :(得分:3)

我遇到了同样的问题,这个解决方案几乎完成了这个技巧,所以感谢发布它。

我发现的唯一区别是视图类是maps.i.b,所以我用它代替:

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
    if (v.getClass().getName().startsWith("maps.")) {
        return true;
    }
    return super.canScroll(v, checkV, dx, x, y);
}