2010-05-07 37 views
12

Tôi đang cố gắng vẽ một tuyến đường lên MapView của mình. Tôi đã mở rộng Lớp phủ và triển khai phương thức draw(). Tuyến đường được hiển thị đúng cách, mặc dù khi đang gỡ lỗi, Tôi đã thêm điểm ngắt trên đường vẽ() và nhận thấy nó đang được gọi liên tục.vẽ liên tục được gọi trong lớp phủ bản đồ android của tôi

Tôi chỉ muốn nó được vẽ lại nếu ai đó di chuyển bản đồ hoặc thu phóng (bản vẽ có tính đến những thay đổi này khi vẽ tuyến đường) Điều gì có thể gây ra điều này?

Trả lời

13

Có hai phương pháp bốc thăm có thể được ghi đè.

void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) 

Mô tả: Vẽ lớp phủ trên bản đồ.

boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when)
Gợi ý: Vẽ cuộc gọi cho lớp phủ hoạt ảnh.

Tôi ban đầu đã ghi đè thứ hai.
Sau khi thay đổi phương pháp đầu tiên, nó đã hoạt động.

2

tôi nghĩ rằng phương pháp vẽ được gọi nhiều lần vì nền được vẽ lại liên tục. thử đặt "MapView.ReticleDrawMode" thành DRAW_RETICLE_UNDER. Điều này về cơ bản nói với mapView để vẽ kẻ ô dưới lớp phủ. Vì vậy, phương thức vẽ của lớp phủ sẽ không được gọi khi nền được gọi lại. điều này đã khắc phục vấn đề cho tôi.

để biết thêm, xem ở đây: MapView Api

2

Tôi bị vấp ngã khi tôi không nhận ra rằng phương thức vẽ được gọi là không chỉ bất kỳ điểm đánh dấu nào bạn vẽ, NHƯNG cũng là bóng của những điểm đánh dấu đó. Ví dụ, nếu bạn có hai điểm đánh dấu và bạn có bóng được đặt thành true (là cài đặt mặc định), thì bạn sẽ có phương thức vẽ được gọi là 4 lần (một lần cho mỗi điểm đánh dấu, một lần cho mỗi bóng của điểm đánh dấu)!

-1

Bạn chỉ có thể thêm này đến lớp ItemizedOverlay của bạn:

@Override public void draw(Canvas c, MapView m, boolean shadow) { super.draw(c, m, false);} 

này sẽ loại bỏ bóng từ lớp phủ MapView của bạn.

1

Đối với tôi, nó trông giống như một lỗi lạ - đôi khi phương pháp vẽ được gọi là liên tục, đôi khi không.

xem here.

2

Sau khi xem xét thêm, lớp phủ Lớp phủ() thực sự hoạt động như được mô tả trong tài liệu. Một bản vẽ cho bóng = true, và một cho shadow = false.

Điều thú vị là phương thức draw() lớp phủ cụ thể phản hồi như được quảng cáo cho từng phần tử được vẽ trong MapView. Ví dụ, trong trường hợp của tôi, có vẻ như nó phản hồi cho từng bản đồ google, biểu trưng của Google được vẽ trên bản đồ và sau đó là lớp phủ cụ thể mà tôi đã tự vẽ. Rõ ràng hai lần cho mỗi (bóng đúng | sai).

Đây có lẽ là cách dự định hiển thị bản đồ. Tôi đã không tìm thấy hoặc dành đủ thời gian nghiên cứu cho thông tin này.

Ngoài ra, trong trường hợp của riêng tôi, tôi có một bảng điều khiển trong suốt được hiển thị trên bản đồ của tôi với các tiện ích CheckBox (s) và TextView.TextView buộc phương thức draw() chạy không ngừng vì textview luôn lắng nghe đầu vào và do đó kích hoạt vẽ lại lớp phủ.

1

Trong ứng dụng của mình, tôi có thanh tiến trình vô thời hạn (ví dụ: hình tròn quay tròn) hiển thị khi tôi đang tải dữ liệu mạng cho bản đồ. Khi dữ liệu mạng được tải xong, tôi đã đặt chế độ hiển thị của thanh tiến trình thành ẩn. Tuy nhiên, điều này khiến bản đồ liên tục vẽ lại vì có vẻ như bất kỳ hoạt ảnh nào (tôi đoán) diễn ra trên bản đồ sẽ khiến bản đồ vẽ lại. Giải pháp đơn giản cho việc này là đặt chế độ hiển thị thay thế. Ví dụ. thay đổi này:

ProgressBar loadingIcon = (ProgressBar) findViewById(R.id.loadingIcon); 
... 
//Network data now finished loading... 
loadingIcon.setVisibility(View.INVISIBLE); 

này:

loadingIcon.setVisibility(View.GONE); 

mà loại bỏ nó hoàn toàn khỏi bản đồ, không còn sinh động trên nó và do đó không gây ra bốc thăm() được gọi là vô thời hạn.

+0

Cảm ơn rất nhiều vì đã đăng bài này - bạn vừa giải quyết được vấn đề khiến tôi phát điên. –

0

Tôi biết đây là một vấn đề cũ, nhưng bây giờ tôi mới gặp phải vấn đề này. Đây là bài đăng "cho những gì đáng giá".

Vòng lặp vẽ hóa ra là lỗi mã hóa trên phần của tôi. Theo tài liệu, nếu thường trình vẽ trả về đúng, nó yêu cầu cập nhật ngay lập tức. Nếu trả về false, chỉ có hai đường chuyền được thực hiện cho mỗi lớp phủ; một cho bóng đúng và một cho bóng sai. Tôi đã quay trở lại sự thật dẫn đến một bản cập nhật liên tục. Sau khi tôi thay đổi để trả về false, chỉ có hai lần vượt qua mỗi lớp phủ xảy ra. Không có vòng lặp.

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