Java GoogleMap在ViewPager中的一个片段内,将所有触摸事件保留在GoogleMap中
正如标题所述,我在一个片段中有一个GoogleMap控件(API v2),该片段本身就是ViewPager中的一个项。当我在地图上拖动时,如果我的第一个拖动运动在水平轴上,ViewPager将获取所有拖动事件。如果在垂直平面上进行第一次拖动,则所有后续拖动都将委托给贴图控件。我想让谷歌地图捕捉所有的拖动事件。我添加了一些调试,我发现当我点击map控件并开始在垂直平面上拖动时,甚至没有任何onTouch事件进入ViewPager,因此Google地图似乎第一次有机会处理事件或传递事件。我在GoogleMap类中找不到任何方法或侦听器来告诉它处理所有触摸/移动/拖动事件。解决方案是创建一个覆盖canScroll方法的自定义ViewPager,并在我的xml中使用它。canScroll方法递归地传递子视图树,然后决定是否允许该视图处理水平滚动,或者是否应由父ViewPager捕获该视图Java GoogleMap在ViewPager中的一个片段内,将所有触摸事件保留在GoogleMap中,java,android,google-maps-android-api-2,Java,Android,Google Maps Android Api 2,正如标题所述,我在一个片段中有一个GoogleMap控件(API v2),该片段本身就是ViewPager中的一个项。当我在地图上拖动时,如果我的第一个拖动运动在水平轴上,ViewPager将获取所有拖动事件。如果在垂直平面上进行第一次拖动,则所有后续拖动都将委托给贴图控件。我想让谷歌地图捕捉所有的拖动事件。我添加了一些调试,我发现当我点击map控件并开始在垂直平面上拖动时,甚至没有任何onTouch事件进入ViewPager,因此Google地图似乎第一次有机会处理事件或传递事件。我在Goog
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" />
我也遇到了同样的问题,这个解决方案几乎成功了,所以感谢您发布它 我发现的唯一区别是视图类是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);
}
似乎地图类名将根据Google Play Services的版本而改变,所以您的答案是+1!