11

Google MapView でアイテムの移動位置を表示するアプリケーションに取り組んでいます。アイテムを表すアイコンの位置を更新する方法が必要です (更新されたデータが入ってくると、アイコンの向きを 2 秒ごとに変更するだけでなく)。

現在、アプリに MapActivity を拡張するアクティビティがあります。これに、マップ上に線を描画する静的オーバーレイと、静的アイコンを描画する ItemizedOverlay をオーバーレイしました。

アニメーション化されたオーバーレイで使用されると主張する draw() メソッドがありますが、それをオーバーライドしてアニメーションを実行しても、何もアニメーション化されません。

オーバーレイをアニメーション化するようにアプリに指示する必要がありますか、それとも別の種類のオーバーレイを使用する必要がありますか?

4

4 に答える 4

4

あなたの問題について私が心に留めていることが2つあります。

まず、MapView でinvalidate()を使用して強制的に再描画することを検討しましたか? これはおそらく最も効率的な解決策ではありませんが、少なくとも作業できるものを得る必要があります。

次に、アクティビティを再度呼び出すことで、マップ上のアイテムを更新できます。ここにがあります。

于 2010-10-02T16:49:45.293 に答える
1

MapView とオーバーレイの組み込み機能を使用してアニメーションを描画すると、パフォーマンスが低下する可能性があります。私の提案は次のとおりです。

1) MapView を別のビューと結合します。MapView は必要な画面座標を提供し、別のビューがアニメーションのキャンバスとして機能します。両方のビューが同じ画面位置を占める必要があります (フレーム レイアウトを使用)。

2) アニメーション化するマップ マーカーの位置を取得したら、それをマップから削除し、2 番目のビューを使用してマーカーの動きのアニメーションを開始します。ここでは、特殊な Android アニメーション クラス (つまり、Animation、AnimationUtil、AnimationSet) を活用できます。

3) アニメーションが完了したら、マーカーを mapview オーバーレイに追加し、新しい位置に配置してオーバーレイを無効にします。

より最適なアプローチ (つまり、MapView キャンバスで直接アニメーションを使用する) があるかもしれませんが、最終的には、パフォーマンスの問題を防ぐために特殊なアニメーション メカニズムを使用する必要があります。

于 2010-10-27T16:57:21.593 に答える
0

アニメーションを表示するオプションとして、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);
}
于 2011-10-05T21:07:34.817 に答える
0

私はまだこのすべての Android に慣れていませんが、先日 Android Unleashed 2nd ed (maning Early Access Program バージョン) を読んでいました。そこではアニメーションについて説明されていました。

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

myItemizedOverlay.startAnimation( anim );

私は実際にそのようなことを試していないことに注意してください。おそらく startAnimation() の前に呼び出す必要があります。私が言ったように... 私の専門分野はほとんどありません(まだ!)。

このアプローチでは、無効化をまったくいじる必要はないと思います。

于 2010-10-20T23:57:40.283 に答える