5

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

4

2 回答 2

6

解决方案是创建一个覆盖 canScroll 方法的自定义 ViewPager 并在我的 xml 中使用它。canScroll 方法递归地传递一个子视图树,然后决定是否允许视图处理水平滚动,或者它是否应该由父 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" />
于 2013-01-17T21:37:23.113 回答
3

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

我发现的唯一区别是视图类是 maps.ib,所以我改用它:

@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);
}
于 2013-03-15T20:37:33.470 回答