2014-05-16 11 views
6

Symuluję samochód poruszający się po nagranej ścieżce na mapach Androida v2. Kiedy przybliżam ścieżkę ręcznie, działa świetnie, ale kiedy przesuniemy kamerę po ścieżce z mMap.animateCamera(), nie ładuje ona widocznego obszaru mapy, otrzymuję tylko bardzo pikselowaną mapę o niskiej jakości. Jeśli dotknę ekranu i przesunę nieco mapę lub powiększę, to ponownie ładuję tę część.Mapy Androida v2 stają się niskiej jakości, gdy obszar mapy jest automatycznie przenoszony

Jak mogę uzyskać, że zawsze ładuje wyraźnie widoczną część?

EDIT: dodałem przykładowy obraz: to, co widzę, kiedy nie dotykać mapę. Po jej dotknięciu staje się jasne (podobnie jak w lewej dolnej części).

Example image

EDIT2: Mam pomysł, że to dlatego, że Google Kupię, aby zapobiec mapa być buforowane przez szybko przesuwając aparat na powierzchni. Czy to możliwe, że jest to przyczyną tego problemu? (Mapa pokazuje Budapeszt, Węgry, której części mapy nie można pobrać do użytku w trybie offline ...) Ale tutaj chcę tylko pokazać animację i umieścić znaczniki, potrzebuję tylko widocznego obszaru do buforowania - czy są jakikolwiek sposób obejścia tego zachowania?

Edit3: Kod Animacja

new Thread(new Runnable() { 

    @Override 
    public void run() { 
     // ... Calculating and sending new location, in an infinite loop with sleeps for timing 

     MainActivity.this.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       mMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude()))); 
      } 
     }); 
    } 
}).start(); 
+0

Czy animowanie aparat z osobnym wątku? Nie mogłem odtworzyć twojego problemu; mapa ponownie skupia się po animacji, gdy ją wypróbuję. Czy umieścisz swój kod animacji z kamery? – todd

+0

Tak, animuję z osobnego wątku, używając runOnUiThread działania. (Kod źródłowy powyżej) – hunyadym

Odpowiedz

2

Ponadto znaleziono rozwiązanie. Udało mi się odtworzyć Twój problem za pomocą podanego kodu. Zamieniłem kod na poniższe i zadziałało to dla mnie.

Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() { 

     @Override 
     public void run() { 
      // ... Calculating and sending new location, in an infinite loop with sleeps for timing 

      MainActivity.this.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        mMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude()))); 
       } 
      });   
     } 

    }, 0, 2000); 

Wystarczy usunąć swój kod do spania i zastąpić ostatni argument scheduleAtFixedRate (2000) z niezależnie od wartości uzywasz do spania.

+0

Dziękujemy za rozwiązanie, teraz jest znacznie lepiej dzięki temu kodowi, ale błąd nadal występuje. Czy masz pojęcie, dlaczego jest to ważne, jeśli nazywam to z oddzielnego wątku z trybem uśpienia lub z zegarem? – hunyadym

1

Miałem ten sam problem. Ponieważ nie zdarzyło się to, gdy nie animowaliśmy kamery, musiało to być coś z tym związanego.

Aparat musi być w stanie zakończyć działanie, zanim zaktualizuje tło/drogi itp. Ponieważ moja aplikacja aktualizuje położenie co sekundę, a mapa potrzebuje około 2 sekund na zakończenie, kończę na pikselowanych drogach i nie ma żadnego otoczenia.

Rozwiązaniem jest użycie jednego z przeciążeń animateCamera:

public final void animateCamera (CameraUpdate update, int durationMs, 
GoogleMap.CancelableCallback callback) 

Przesuwa mapę zgodnie z aktualizacją z animacją nad określony czas, i wzywa opcjonalnego zwrotnej zakończenia. Zobacz CameraUpdateFactory, aby uzyskać zestaw aktualizacji.

Użyłem w moim przypadku czas trwania 900 ms, więc animacja jest wykonywana, zanim otrzyma nową lokalizację.

Aby uzyskać oddzwonienie do pracy, musisz wdrożyć GoogleMap.CancelableCallback dla swojej klasy.To wymaga, aby dodać dwa przesłonięcia:

@Override 
public void onFinish() { 
} 

@Override 
public void onCancel() { 
} 

Oni nie są wymagane, aby rozwiązać problem, altough jesteś wolny, aby dodać tam dodatkową logikę.

Wezwanie zaktualizować aparat może wyglądać następująco:

cameraPosition = new CameraPosition.Builder() 
        .target(current)    
        .zoom(zoomLevel)    
        .bearing(bearing) 
        .tilt(tilt)     
        .build();    

CameraUpdate update = CameraUpdateFactory.newCameraPosition(cameraPosition); 

map.animateCamera(update, 900, this); 
Powiązane problemy