2010-09-25 47 views
10

Tôi đang làm việc trên một ứng dụng hiển thị vị trí của các mục đang di chuyển trên Google MapView. Tôi cần một cách để cập nhật vị trí của các biểu tượng đại diện cho các mục (cũng như thay đổi khuôn mặt của các biểu tượng sau mỗi hai giây khi dữ liệu cập nhật có sẵn).Di chuyển các biểu tượng trên Android MapView

Tôi hiện đang có một hoạt động trong ứng dụng mở rộng MapActivity. Về điều này tôi đã phủ lên một Lớp phủ tĩnh vẽ một số dòng trên bản đồ và một ItemizedOverlay vẽ một biểu tượng tĩnh.

Có một phương thức draw() tuyên bố sẽ được sử dụng bởi lớp phủ hoạt ảnh, nhưng việc ghi đè nó để làm hoạt ảnh của tôi vẫn không tạo ra bất kỳ thứ gì hoạt hình.

Tôi có cần phải nói cho ứng dụng làm cho lớp phủ của tôi hoạt ảnh hoặc tôi có cần sử dụng loại lớp phủ khác không?

Trả lời

4

Có hai điều bạn cần lưu ý về sự cố của mình.

Trước tiên, bạn có cân nhắc sử dụng invalidate() trên MapView để buộc vẽ lại không? Đó là có lẽ không phải là giải pháp hiệu quả nhất, nhưng ít nhất nó cũng giúp bạn có được một thứ mà bạn có thể làm việc.

Thứ hai, bạn có thể làm mới các mục trên bản đồ của mình bằng cách gọi lại hoạt động. Đây là một số example.

+0

Tôi đã xem xét tùy chọn vô hiệu. Từ những gì tôi đã đọc, nó có thể trở nên tồi tệ về hiệu suất, nhưng tôi sẽ cho nó một shot. Điều tôi tự hỏi là: làm cách nào để vô hiệu hóa lớp phủ ~ 20 lần mỗi giây để tạo hiệu ứng động các biểu tượng từ vị trí này đến vị trí khác? – Hober

+1

có thể bạn nên xem xét sử dụng một chuỗi hẹn giờ, hãy xem http://www.anddev.org/viewtopic.php?t=126 –

+0

Tôi đã kết thúc bằng cách sử dụng Chế độ xem thông thường và postInvalidating nó từ một TimerThread để cung cấp cho tôi các bản cập nhật. Khi điều đó xảy ra, tôi không muốn bản đồ được vẽ lại mọi khung hình, chỉ các đối tượng chuyển động trên chế độ xem khác này, vì vậy tôi đang tìm cách sử dụng bộ nhớ cache vẽ để lưu MapView. Điều đó nói rằng, câu trả lời của bạn về chủ đề hẹn giờ là khá nhiều quyền. Nó cho phép bạn lên lịch làm mới cho số lần cố định mỗi giây để bạn có thể đảm bảo tốc độ khung hình tốt mà không hiển thị mọi khung có thể. – Hober

0

Tôi vẫn còn khá mới mẻ đối với tất cả nội dung Android này, nhưng tôi đã đọc Android Unleashed 2nd ed (phiên bản chương trình truy cập sớm) vào một ngày khác, nơi nó bao gồm Ảnh động ...

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

myItemizedOverlay.startAnimation(anim); 

Lưu ý rằng tôi chưa thực sự thử bất kỳ loại nào, nhưng đó là những gì sách/JavaDoc dẫn tôi tin sẽ hoạt động. Có thể bạn sẽ cần gọi trước startAnimation(). Như tôi đã nói ... hầu như không có chuyên môn của tôi (chưa!).

Tôi không nghĩ rằng bạn sẽ cần phải gây rối với bất hợp pháp chút nào với cách tiếp cận này.

+0

Tôi tin rằng bạn không thể sử dụng hoạt ảnh trên ItemizedOverlays theo cách đó. – Tom

1

Sử dụng các khả năng tích hợp của MapView và Lớp phủ để vẽ hoạt ảnh có khả năng sẽ làm mất hiệu suất của bạn. Đề xuất của tôi là:

1) Kết hợp MapView với Chế độ xem khác. MapView sẽ cung cấp cho bạn tọa độ màn hình cần thiết và một chế độ xem khác sẽ đóng vai trò là canvas cho hoạt ảnh. Cả hai khung nhìn nên chiếm cùng vị trí màn hình (sử dụng bố cục khung);

2) Khi bạn nhận được vị trí của điểm đánh dấu bản đồ bạn muốn tạo hiệu ứng động - hãy xóa nó khỏi bản đồ và bắt đầu thực hiện hoạt ảnh của các chuyển động của người đánh dấu bằng cách sử dụng chế độ xem thứ hai. Ở đây bạn có thể tận dụng các lớp học android hình ảnh động chuyên ngành (ví dụ: Animation, AnimationUtil, AnimationSet)

3) Khi bạn đã thực hiện với hình ảnh động - thêm điểm đánh dấu để MapView lớp phủ, bây giờ ở vị trí mới của nó và làm mất hiệu lực overlay

Có thể có có thể là cách tiếp cận tối ưu hơn (tức là sử dụng hoạt ảnh trực tiếp trên canvas MapView), nhưng dòng dưới cùng - bạn nên sử dụng cơ chế hoạt ảnh chuyên biệt để ngăn chặn các vấn đề về độ hòa sắc.

0

Tùy chọn hiển thị hoạt ảnh, bạn có thể sử dụng phương thức addView của lớp MapView. Nó đơn giản như:

  1. chỉ tạo chế độ xem (như ImageView hoặc bất kỳ chế độ xem nào khác);
  2. khởi tạo bố cục chế độ xem, tạo và chuyển MapView.LayoutParams thành phương thức setLayoutParams;
  3. thêm chế độ xem vào MapView.

Chế độ xem sẽ tự động di chuyển khi bạn cuộn bản đồ.

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); 
} 
Các vấn đề liên quan