2011-11-19 25 views
13

Tôi muốn tạo hiệu ứng đánh dấu bản đồ khi chúng được thêm vào bản đồ.Làm cách nào để tạo hiệu ứng đánh dấu khi được thêm vào bản đồ trên Android?

Người dùng sẽ thấy bản đồ có các điểm đánh dấu xung quanh mình. Mỗi điểm đánh dấu mới sẽ bị trả lại.

+1

Sử dụng MapOverlay và Frame bố trí để tăng điểm đánh dấu, sau đó được xem đối tượng hình ảnh của bạn sau đó bắt đầu hoạt hình trên đó trong hoạt động bản đồ. – Noby

+0

Tôi nghĩ rằng liên kết này trả lời câu hỏi của bạn: http: // stackoverflow.com/questions/7407475/can-i-use-animationdrawable-in-an-overlay-on-a-mapview –

Trả lời

0

Bạn có thể thêm bất kỳ bố trí mới để MapView như đánh dấu bản đồ:

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; 
} 

lẽ bạn có thể thêm ImageView trực tiếp mà không wraping bố trí. animResId là tài nguyên có thể vẽ hình động của khung (tương tự như điểm đánh dấu Android Mylocation).

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

12

Bạn có thể thực hiện các onMarkerClick() và làm cho điểm đánh dấu thư bị trả lại bất cứ khi nào người dùng nhấp vào nó. Chỉ cần thử thực hiện bên dưới mã. Tôi đã thử nó và nó hoạt động hoàn toàn tốt đẹp.

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; 
} 

Bạn cũng có thể sử dụng tại thời điểm thêm điểm đánh dấu trong ứng dụng của bạn bên cạnh onClick sự kiện. Tôi hy vọng điều này bạn chỉ muốn.

+0

Bạn là anh hùng của tôi, cảm ơn! –

+0

Tôi đã thử cùng một mã, nhưng nhận được lỗi trong dòng, Interpolator nội suy = new LinearInterpolator(); "Loại không tương thích" –

0

Neo màn hình tắt điểm đánh dấu hoặc tại vị trí bắt đầu của bạn, sau đó bắt đầu hoạt ảnh.

Lưu ý .setAnchor sử dụng trong phương pháp này đã được thêm vào google map api v2 tháng năm 2013

Tôi chỉ là bây giờ đã làm việc này cho một điểm đánh dấu bằng cách tinh chỉnh các mẫu extras bản đồ giới thiệu và tôi don' t như hiệu suất của việc thực hiện này. Phần quan trọng nhất là neo màn hình tắt hoặc điểm đánh dấu ở vị trí bắt đầu của bạn. Tôi đang sử dụng tắt màn hình ở trên.

Neo màn hình tắt điểm đánh dấu .setAnchor (.5f, (kích thước của màn hình trên điểm đánh dấu/kích thước của điểm đánh dấu)) // cho bản đồ perth là khoảng 6f cho điện thoại thử nghiệm của tôi. Thay đổi hình động để trả lại cùng một giá trị là 6f cho điện thoại thử nghiệm của tôi.

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) 
      ); 

Thay đổi hình ảnh động để nó nẩy lên (kích thước của màn hình trên marker/size của marker) (6f trên điện thoại thử nghiệm của tôi). Tôi chỉ sử dụng trình xử lý onclick vì nó đã được thiết lập để trả lại với các chỉnh sửa bị trả về 6f và thời lượng dài hơn. Vì vậy, sau khi tất cả các điểm đánh dấu đã được thêm vào bản đồ, tôi sẽ tắt trình xử lý nhấp chuột.

this.onMarkerClick(mPerth); 

Trình xử lý onMarkerClick đã thay đổi với thời lượng 6f và dài hơn.

@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; 
} 

Good Luck

Các vấn đề liên quan