Ric*_*ich 5 java android android-viewpager google-maps-android-api-2
我在ViewPager内部的Fragment中使用GoogleMap(v2 api).我遇到的最初问题是ViewPager正在捕获所有水平滚动手势,因此只有当用户在垂直或对角线方向上启动时才能拖动地图.所有水平拖动都被捕获ViewPager.我发现解决方案是创建派生ViewPager类并覆盖该canScroll方法.被拖动的视图将传递给此方法,因此您可以根据View的类型做出决策.
就我而言,我的Fragment是一个SupportMapFragment(来自com.google.android.gms.maps包),它给了我一个与之交互的GoogleMap对象.但是,我在ViewPager canScroll方法中收到的实际控件是类型maps.j.b.我已在我的自定义ViewPager类中修复了以下代码的问题.但是,当我对这个课程名称一无所知时,我觉得这个课程名称并不合适.什么是maps.jb?这是运行时动态创建的类吗?是否有可能在未来的框架更新中更改类型?仅给出View对象,是否有更强大的方法来检查拖动是否由地图控件启动?
@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
if(v.getClass().getName().equals("maps.j.b")) {
return true;
}
return super.canScroll(v, checkV, dx, x, y);
}
Run Code Online (Sandbox Code Playgroud)
这是在运行时动态创建的类吗?
它可能是 ProGuard 重命名的输出。
在框架的未来更新中,类型是否有可能改变?
据我所知,是的。我不知道 ProGuard 保证名称在构建之间保持不变。
请注意,这取决于库项目。当您承担新版本的库项目时,类名称可能会发生变化。但是,由于这与您自己的应用程序相关,因此在紧要关头,您可以坚持使用名称游戏,并且只需要在接受新版本的库项目时修复名称即可。
话虽这么说,我同意基于名字的匹配是令人讨厌的。
仅给定 View 对象,是否有更可靠的方法来检查拖动是否由地图控件发起?
好吧,因为这不是 a MapView,所以我们无法知道 a 到底maps.j.b是什么。我们知道它不是 a MapView,因为它没有被命名MapView,并且 Google 单独保留了该名称(-keep大概是通过 ProGuard 配置中的指令),因此我们可以从我们的应用程序中使用它。
你可以尝试用你MapFragment自己的来创建你自己的MapView,看看你是否得到 aMapView而不是 a (这可能是被使用的maps.j.b一些内部子类)。如果您传递了实际的对象,那么您可以直接进行相等检查以查看传入的对象是否是您的。MapViewSupportMapFragmentMapViewMapFragmentMapView
或者,你可以看看 ifinstanceof说 amaps.j.b是 a MapView。
随着时间的推移,这些都不能保证可靠,因为可以想象,谷歌可能会改变一些事情,比如MapView将它们包裹在某些东西中。然而,我的猜测是它比生成的类名更可能稳定。
maps.j.b继承自SurfaceView. 因此,半可靠地检测是否View传入的一种方法canScroll()是测试 if (v instanceof SurfaceView)。如果 Maps V2 稍后执行其他操作(例如,TextureView在 API 级别 11+ 上进行扩展)或者您的ViewPager页面有其他操作SurfaceView(例如,a VideoView),则此操作会失败。
我已经就此提出了一个问题,试图找到一些稳定的方法来将这一决定添加到 Maps V2 API 中。
| 归档时间: |
|
| 查看次数: |
1507 次 |
| 最近记录: |