【问题标题】:Mapview onTap not firing for OverlayItem onTapMapview onTap 未触发 OverlayItem onTap
【发布时间】:2012-09-19 06:02:42
【问题描述】:

我的应用程序中有一个地图视图,并且使用 touchEvents 一切正常。

然而,为了最大限度地提高应用程序的用户使用率,我一直在尝试添加 trackBall 界面功能,但遇到了问题。

当它处于焦点时,轨迹球会正确滚动 mapView,但是当用户以覆盖项为中心时,我无法触发 onTap 事件。

当我单击鼠标按钮(我正在使用模拟器)来模拟轨迹球用户的点击(F6 启用轨迹球)时,什么也没有发生。在这种情况下,onTrackBallEvent 代码永远不会被触发,我希望给定 API文档说在这种情况下应该触发 onTap,但它也不会被触发。

如果我没有以overlayItem 为中心,我确实会在onTrackBallEvent 中获得ACTION_DOWN 和ACTION_UP 事件,只有当地图以OverlayItem 为中心时才会触发onTrackBallEvent。不幸的是 onTap 事件也没有被触发。显然,当覆盖层位于屏幕中心下方并且用户单击轨迹球时,操作系统正在对这些点击进行操作,但如果我能弄清楚它是什么,我会很高兴。

有人知道我应该寻找什么活动吗?

【问题讨论】:

    标签: android android-mapview trackball


    【解决方案1】:

    这是一个相当古老的问题,但我想我会给我的 2 美分。出于某种原因,您需要在地图上的某处添加一个覆盖,然后 onTap() 覆盖才能在您单击的位置添加其他覆盖。我用过:

    public boolean onTap(GeoPoint p, MapView mapView) {
        boolean tappedAnOverlay = super.onTap(p, mapView);
        if (tappedAnOverlay) {
            // do your thing if hit an overlay
        }
        else {
            // no overlay found in that location
        }
    
        MapController mc = mapView.getController();
        mc.animateTo(p);
    
        return true;
    
    } 
    

    【讨论】:

      【解决方案2】:

      因为它适用于此。我检查屏幕上的命中点是否与某些叠加项目匹配。

              public boolean onTouchEvent(MotionEvent event, MapView mv) {
              final int action=event.getAction();
              final int x=(int)event.getX();
              final int y=(int)event.getY();
      
              if(!this.marker.equals(getResources().getDrawable(R.drawable.parada))){
                  if (action == MotionEvent.ACTION_DOWN) {
                              for (OverlayItem item : mItems) {
                              Point p = new Point(0,0);                       
                              mv.getProjection().toPixels(item.getPoint(), p);                        
                              if (hitTest(item, marker, x-p.x, y-p.y) && item.getSnippet()!= "parada") {
      

      【讨论】:

      • 我不是 100% 确定你在这里建议什么,这段代码看起来可以确定在视图中点击了哪个标记。但是,该事件在何时/何地被调用?
      • 我在 API 中没有看到这个签名
      • 没关系,我找到了...这是覆盖中的覆盖让你。但是我仍然很困惑为什么 onTap 没有像 API 所说的那样被触发。
      • 您好,每次触摸屏幕都会启动。你是从 MapActivity 扩展你的课程吗?是 Android 版 GoogleMap API 的一个类,包含事件处理程序。
      • 是的,我正在扩展 MapActivity,正如我所说,对于触摸事件,一切都运行良好......它的轨迹球点击覆盖项目,只是没有发生。
      【解决方案3】:

      请试试这个。这用于在地图视图上显示多个叠加层,可能会解决问题:https://github.com/donnfelker/android-mapviewballoons

      【讨论】:

      • 谢谢你的建议,但这不是我的问题。
      • 叠加层看起来很好,问题是在轨迹球模式下,在叠加层上,轨迹球点击事件似乎永远不会触发..或者至少似乎永远不会到达我的代码..它是认为轨迹球点击没有被传递到视图链上。 IE managedOverlay 正在使用它,当它在一个覆盖项目上时,我没有直接或简单的访问来扩展/覆盖这个类。
      猜你喜欢
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      相关资源
      最近更新 更多