2011-11-19 21 views
13

マップマーカーをマップに追加するときにマップマーカーをアニメーション化したいと考えています。マーカーをアニメーションで地図に追加するとき、マーカーをアニメーション化する方法は?

ユーザーは、彼の周りのマーカーで地図を参照する必要があります。新しいマーカーはそれぞれ跳ね返ります。

+1

使用MapOverlayとマーカーを膨らませるために、フレームのレイアウト、そして自分のイメージビューオブジェクトは、マップの活動でその上でアニメーションを開始します。 – Noby

+0

このリンクはあなたの質問に答えます: http:// stackoverflow。com/questions/7407475/can-i-use-animationマップビュー上にオーバーレイ表示 –

答えて

0

あなたは、マップマーカーとしてのMapViewに新しいレイアウトを追加することができます。

public void AddAnimMarkerToMap(MapView map, GeoPoint geoPoint, int id, int animResId) 
{ 
    var layoutParams = new MapView.LayoutParams(ViewGroup.LayoutParams.WrapContent, 
               ViewGroup.LayoutParams.WrapContent, 
               geoPoint, 
               MapView.LayoutParams.Center); 

    var ll = new LinearLayout(map.Context) { Id = id, Orientation = Orientation.Vertical }; 
    ll.SetGravity(GravityFlags.Center); 

    var iv = new ImageView(map.Context); 
    iv.SetImageResource(animResId); 

    ll.AddView(iv); 
    map.AddView(ll, layoutParams); 

    var markerAnimation = (AnimationDrawable)iv.Drawable; 
    markerAnimation.Start(); 
    ll.LayoutParameters = layoutParams; 
} 

おそらくあなたはレイアウトをwrapingせずに直接ImageViewのを追加することができます。 animResIdは、フレームアニメーションの描画可能リソースです(Android Mylocationマーカーと同様)。

http://developer.android.com/guide/topics/resources/animation-resource.html#Frame

12

あなたはonMarkerClick()を実装し、ユーザーがそれをクリックするたびに、マーカーバウンスを行うことができます。 以下のコードの実装を試してみてください。私はそれを試して、それは完全にうまく動作します。あなたはまた、onClickイベント以外にも、アプリケーション内のマーカーを追加する時にこれを使用することができます

private Marker mPerth; 
private Marker mPerth = mMap.addMarker(new MarkerOptions() 
      .position(PERTH) 
      .title("Perth") 
      .snippet("Population: 1,738,800"));   
@Override 
public boolean onMarkerClick(final Marker marker) 
    { 
     // This causes the marker at Perth to bounce into position when it is clicked. 
    if (marker.equals(mPerth)) { 
     final Handler handler = new Handler(); 
     final long start = SystemClock.uptimeMillis(); 
     Projection proj = mMap.getProjection(); 
     Point startPoint = proj.toScreenLocation(PERTH); 
     startPoint.offset(0, -100); 
     final LatLng startLatLng = proj.fromScreenLocation(startPoint); 
     final long duration = 1500; 
     final Interpolator interpolator = new BounceInterpolator(); 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       long elapsed = SystemClock.uptimeMillis() - start; 
       float t = interpolator.getInterpolation((float) elapsed/duration); 
       double lng = t * PERTH.longitude + (1 - t) * startLatLng.longitude; 
       double lat = t * PERTH.latitude + (1 - t) * startLatLng.latitude; 
       marker.setPosition(new LatLng(lat, lng)); 
       if (t < 1.0) { 
        // Post again 16ms later. 
        handler.postDelayed(this, 16); 
       } 
      } 
     }); 
    } 
    // We return false to indicate that we have not consumed the event and that we wish 
    // for the default behavior to occur (which is for the camera to move such that the 
    // marker is centered and for the marker's info window to open, if it has one). 
    return false; 
} 

。 私はあなたが欲しいだけこれを願っています。

+0

あなたは私のヒーローです、ありがとう! –

+0

同じコードを試しましたが、行内にエラーが発生しました。インターポレーターのインターポレーター= new LinearInterpolator(); 「互換性のないタイプ」 –

0

マーカーをスクリーンまたは最初の位置に固定して、アニメーションを開始します。この方法で使用

注.setAnchorは、「私は今、このマップはデモエキストラサンプルを微調整することにより、一つのマーカーのために働いて持っていると私はドン2013年5月

にGoogleマップAPI V2に追加されましたこの実装のパフォーマンスが気に入っています。最も重要な部分は、マーカーをスクリーンから外したり、開始位置から外したりすることです。私は上記の画面を使用しています。

マーカーをスクリーンから外します.setAnchor(.5f、(マーカーの上のスクリーンのサイズ/マーカーのサイズ))//私のテスト用の電話機のマップデモパースの場合、約6fです。アニメーションを同じ値に戻すように変更します。テスト用の携帯電話では6fでした。

private void addMarkersToMap() { 
    // A few more markers for good measure. 
mPerth = mMap.addMarker(new MarkerOptions().position(PERTH) 
      .title("Perth").snippet("Population: 1,738,800") 
      .anchor(.5f, 6f) 
      ); 

変更、それは(マーカーのマーカー/サイズ以上の画面の大きさ)(私のテスト携帯電話で6F)に弾むようなアニメーション。私はちょうどonfickハンドラを使用しています。これは、すでに6fにバウンスされたバウンスと長い期間でバウンスするように設定されているためです。マップにすべてのマーカーが追加された後、私はクリックハンドラーを起動します。

this.onMarkerClick(mPerth); 

変更されたonMarkerClickハンドラが6f以上の期間で変更されました。

@Override 
public boolean onMarkerClick(final Marker marker) { 
    if (marker.equals(mPerth)) { 
     // This causes the marker at Perth to bounce into position when it 
     // is clicked. 
     final Handler handler = new Handler(); 
     final long start = SystemClock.uptimeMillis(); 
     final long duration = 2500; 

     final Interpolator interpolator = new BounceInterpolator(); 

     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       long elapsed = SystemClock.uptimeMillis() - start; 
       float t = Math.max(
         1 - interpolator.getInterpolation((float) elapsed 
           /duration), 0); 

       marker.setAnchor(0.5f, 1.0f + 6 * t); 

       if (t > 0.0) { 
        // Post again 16ms later. 
        handler.postDelayed(this, 16); 
       } 
      } 
     }); 
    } else if (marker.equals(mAdelaide)) { 
     // This causes the marker at Adelaide to change color. 
     marker.setIcon(BitmapDescriptorFactory.defaultMarker(new Random() 
       .nextFloat() * 360)); 
    } 
    // We return false to indicate that we have not consumed the event and 
    // that we wish 
    // for the default behavior to occur (which is for the camera to move 
    // such that the 
    // marker is centered and for the marker's info window to open, if it 
    // has one). 
    return false; 
} 

グッドラック

関連する問題