【问题标题】:PathOverlay touch events are passed through every PathOverlayPathOverlay 触摸事件通过每个 PathOverlay 传递
【发布时间】:2014-02-13 17:39:26
【问题描述】:

我制作在线地图并尝试添加可触摸的路径/轨迹(当用户触摸它们时我会改变它们的颜色)。在一张地图上,我有 6-7 个 PathOverlays,并添加了 onDown 事件处理:

private class PathOverlayExtended extends PathOverlay 
{
    public PathOverlayExtended(int color, Context ctx, long trackId, HistoryDetailFragment currentFragment) {
        super(color, ctx);
        trackIndex = trackId;
        fragment = currentFragment;
    }
    private long trackIndex;
    private HistoryDetailFragment fragment;

    @Override
    public boolean onDown(final MotionEvent event, final MapView mapView) {
    fragment.onRoadClicked(trackIndex);
        return super.onDown(event,mapView);
    }

}

然后我触摸屏幕上的一条路径,它会捕获事件并继续遍历每条路径。重要提示:它总是从相同的路径开始(最后添加到 Olerlays 的路径)。

当我将“return super.onDown(event,mapView)”替换为“return true”时,只有最后一条路径会捕获事件,这不是我触摸的那个(而是最后添加到叠加层的那个) .

如何检查/区分我触摸了哪条路径?

【问题讨论】:

  • 您必须对其进行编码......它希望通过魔法发生。如果您的路径中有很多点,只需将位置与屏幕位置进行比较,然后测试距离是否足够近。如果你有很长的路径段,那就更难了,因为你必须检查每条线段到点的距离。

标签: android dictionary touch overlay osmdroid


【解决方案1】:

我找不到解决问题的好方法,所以最后我决定按以下方式解决。

首先,我创建了自己的继承 PathOverlay 的 PathOverlayExtended 类。然后我添加了一些变量 - 路径区域的边界(最大和最小纬度和经度)。

其次,我检查了点击坐标是否符合这些界限。这样,我只能得到那些可以理解为与我的水龙头相关的路径。

最后,我检查了从点击坐标到每个线段的距离,并选择了最小的那个。就是这样。

我使用了 viesturz 的回答,对我帮助很大:

https://code.google.com/p/osmdroid/issues/detail?id=36

感谢所有回答!

【讨论】:

    【解决方案2】:

    我实现了类似的东西来检测填充多边形上的触摸。 它正在使用 Android 区域。

    原理是将已经绘制好的Path“放到”一个“Region”中: region.setPath(mPath, new Region((int) bounds.left, (int) bounds.top, (int) bounds.right, (int) bounds.bottom));

    然后您检查触摸点是否在此区域中: region.contains(point.x, point.y);

    不知道这个“包含”方法是如何实现的,但它可以工作,而且看起来非常有效。魔法。我想它也应该适用于折线。

    您可以在此处查看完整代码: http://code.google.com/p/osmbonuspack/source/browse/trunk/OSMBonusPack/src/org/osmdroid/bonuspack/overlays/Polygon.java

    【讨论】:

    • 看起来很有趣。我将仔细研究它并尝试在我的代码中使用它。谢谢!
    • 我试过了。坏,坏,坏,它不能正常工作。如果该点在路径“内部”,则 region.contains 返回 true,就好像路径已关闭一样。
    • 所以对于多边形来说没问题,但对于折线来说是 KO。没有魔法了,Ifor 的解决方案可能是唯一的。
    • 感谢您调查此问题并与我们分享结论。
    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多