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