使用Osmdroid进行双指捏合缩放

13

我写了一个地图应用程序,它有两个活动。其中一个活动显示Google地图视图,另一个活动使用osmdroid 3.0.5 jar显示相同的视图。

到目前为止,我只在模拟器上进行测试,并且在显示区域和覆盖数据方面,功能完全相同。但现在我在一个真实的Gingerbread设备上运行该应用程序,发现Google地图活动似乎支持捏合缩放,而Osmdroid则不支持。

我没有为Google或Osmdroid编写任何特定于捏合缩放的代码。两个活动都实现了OnTouchListener。两个活动都仅具有OnTouch的存根,例如:

@Override
public boolean onTouch(View v, MotionEvent e) {
    // chain it for now
    return false;
}

我在Osmdroid活动中的地图视图是这个类:org.osmdroid.views.MapView

有没有人知道如何在osmdroid中使捏合缩放功能工作,或者知道一个使用osmdroid的示例应用程序,我可以研究并适应到我的应用程序中?

4个回答

40
MapView.setBuiltInZoomControls(true);
MapView.setMultiTouchControls(true);

5
我发现当我用两个手指移动时,地图似乎缩放得很好,但是一旦我松开它们,地图就会跳到另一个位置。@Warpzit,这是否是你所说的“实现得不好”? - David Doria
在我的Defy Plus上运行得非常好。我还没有在其他设备上尝试过这个。 - Ilya Kogan
三星 S2 基于 KitKat 系统运行完美。谢谢。已点赞! - tony gil

5

Osmdroid具有缩放功能。您需要设置一个手势监听器来检查捏动动作,然后调用osmdroid中的缩放函数。我相信在osmdroid 3.0.5中,它类似于mOsm.getController.setZoomLevel(someNumber)(mOsm是地图视图的实例)。

我已经让相反的捏动手势(您的手指开始靠得很近然后才展开)能够缩放。我建议使用MotionEvent(就像您目前正在做的那样),并执行以下操作:

boolean finished = false;

@Override
public boolean onTouch(View v, MotionEvent e) {

    switch (e.getAction()) {

        case MotionEvent.ACTION_DOWN:
            finished = false;
            break;

        case MotionEvent.ACTION_MOVE:
            finished = false;
            break;

        case MotionEvent.ACTION_UP:
            //action is finishing at this point, so now I can do my refreshActionOnMap();
            if (!finished) 
                refreshActionOnMap();
            break;
    }
    return true;
}

我添加的代码处理了缩放操作,finished布尔值是我在程序中实现的,用于确定何时刷新地图。这应该能更好地帮助你。 这里有进一步的解释。
如果您正在寻找其他内容,请尝试阅读这里。显然从2010年6月起,Android就支持缩放操作。

谢谢提供的信息。我认为这些链接会很有用。我猜想Google Maps的活动(MapsActivity)必须在幕后实现了缩放功能。当然,他们的代码是闭源的,所以看来我需要做一些工作,而不是只复制他们的实现。对于这些链接点赞。 - NickT
我在我的程序中进行了实验,上面的代码对我有效。如果这更有帮助,那就再加一份赞吧! - digerati32
2
如果我不是这么蠢,它本来就能直接工作了!我错过了一行代码mMapVw.setMultiTouchControls(true); 我肯定不会用那个回答我的问题。所以为了防止其他人浪费时间,并感谢你让我思考,我会接受你的答案。 - NickT

2

是否可以不将地图缩放到中心,而是缩放到用户双指的中间位置。


你找到了好的解决方案吗?如果是,请回答我的问题https://dev59.com/gXDXa4cB1Zd3GeqP8x8D - Massimo Variolo
很遗憾,不过我也在这里提出了这个问题,或许有一天它会被解决 :) https://dev59.com/_m_Xa4cB1Zd3GeqPxBfu - Ismail Sahin

1

正如 shameus.burp 所说的,这个代码行 -

mapView.setMultiTouchControls(true); 

对我来说,捏合缩放功能可用(请在2021年检查)。

请注意,显示缩放控制器的函数(基本上是“-”和“+”按钮)-

MapView.setBuiltInZoomControls(true);

已被osmdroid废弃。

因此,您可以使用以下代码行 -

mapView.getZoomController().setVisibility(CustomZoomButtonsController.Visibility.ALWAYS);

默认情况下(不添加最后一行代码),osmdroid设置缩放控制器以显示和淡化。相当于

CustomZoomButtonsController.Visibility.SHOW_AND_FADEOUT 

选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接