【问题标题】:Moving icons on a Android MapView在 Android MapView 上移动图标
【发布时间】:2010-09-25 22:32:15
【问题描述】:

我正在开发一个在 Google MapView 上显示移动项目位置的应用程序。我需要一种方法来更新代表项目的图标的位置(以及随着更新数据的到来每两秒更改一次图标的朝向)。

我目前在应用程序中有一个扩展 MapActivity 的活动。为此,我覆盖了一个在地图上绘制一些线条的静态 Overlay 和一个绘制静态图标的 ItemizedOverlay。

有一个 draw() 方法声称被动画叠加层使用,但是重写它来做我的动画仍然不会使任何动画。

我需要告诉应用让我的叠加层动画化,还是需要使用不同类型的叠加层?

【问题讨论】:

    标签: android google-maps android-mapview itemizedoverlay


    【解决方案1】:

    关于您的问题,我想到了两点。

    首先,您是否考虑过在 MapView 上使用 invalidate() 来强制重绘?那是 可能不是最有效的解决方案,但它至少应该为您提供可以工作的东西。

    其次,您可以通过再次调用活动来刷新地图上的项目。这是example

    【讨论】:

    • 我已经考虑过无效选项。从我读过的内容来看,它的性能可能不太好,但我会试一试。我想知道的是:如何使覆盖层每秒失效约 20 次,以便从一个地方到另一个地方平滑地为图标设置动画?
    • 也许你应该考虑使用定时器线程,看看这个anddev.org/viewtopic.php?t=126
    • 我最终使用了一个常规视图并从 TimerThread 发布无效它来给我更新。碰巧的是,我不希望每帧都重绘地图,只是在另一个视图上重新绘制移动对象,所以我正在寻找使用绘图缓存来保存 MapView。也就是说,您关于计时器线程的答案非常正确。它使您可以安排每秒固定次数的刷新,这样您就可以保证良好的帧速率,而无需显示所有可能的帧。
    【解决方案2】:

    使用 MapView 和 Overlays 的内置功能来绘制动画可能会影响您的性能。我的建议是:

    1) 将 MapView 与另一个 View 结合。 MapView 将为您提供必要的屏幕坐标,另一个视图将用作动画的画布。两个视图应该占据相同的屏幕位置(使用框架布局);

    2) 一旦您获得了要制作动画的地图标记的位置 - 将其从地图中移除并开始使用第二个视图制作标记移动的动画。在这里,您可以利用专门的 android 动画类(即 Animation、AnimationUtil、AnimationSet)

    3) 完成动画后 - 将标记添加到地图视图叠加层,现在位于其新位置并使叠加层无效

    也许可以有更优化的方法(即直接在 MapView 画布上使用动画),但最重要的是 - 您应该使用专门的动画机制来防止性能问题。

    【讨论】:

      【解决方案3】:

      我对所有这些 Android Stuff 还是很陌生,但前几天我正在阅读 Android Unleashed 2nd ed(配备早期访问程序版本),其中涵盖了动画......听起来就是这样。

      Animation anim = new TranslateAnimation( startX, stopX, startY, stopY );
      anim.setDuration( 2000 /* 2 seconds */ );
      anim.init( overlayWid, overlayHei, parentWid, parentHei )
      
      myItemizedOverlay.startAnimation( anim );
      

      请注意,我实际上并没有尝试过任何类似的方法,但这就是书/JavaDoc 让我相信会起作用的方法。您可能需要在 startAnimation() 之前调用。就像我说的......几乎不是我的专业领域(还没有!)。

      我认为您根本不需要使用这种方法来处理无效问题。

      【讨论】:

      • 我相信你不能那样在 ItemizedOverlays 上使用动画。
      【解决方案4】:

      作为显示动画的选项,您可以使用 MapView 类的 addView 方法。 很简单:

      1. 只需创建一个视图(如 ImageView 或任何其他视图);
      2. 初始化视图布局,创建MapView.LayoutParams并将其传递给setLayoutParams方法;
      3. 将视图添加到 MapView。

      滚动地图时视图会自动移动。

      public static void addAnimationToMap(MapView map, int animationResourceId, GeoPoint geoPoint) {
      
          final ImageView view = new ImageView(map.getContext());
          view.setImageResource(animationResourceId);
      
          //Post to start animation because it doesn't start if start() method is called in activity OnCreate method.
          view.post(new Runnable() {
              @Override
              public void run() {
                  AnimationDrawable animationDrawable = (AnimationDrawable) view.getDrawable();
                  animationDrawable.start();
              }
          });
      
          map.addView(view);
      
          MapView.LayoutParams layoutParams = new MapView.LayoutParams(
                  MapView.LayoutParams.WRAP_CONTENT,
                  MapView.LayoutParams.WRAP_CONTENT,
                  geoPoint,
                  MapView.LayoutParams.BOTTOM_CENTER);
          view.setLayoutParams(layoutParams);
      }
      

      【讨论】:

        猜你喜欢
        • 2018-04-23
        • 1970-01-01
        • 2015-01-22
        • 2012-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-12
        • 2012-09-07
        相关资源
        最近更新 更多