2009-06-18 13 views
9

Animuję obraz z lewej strony na prawo od ekranu za pomocą animacji tłumaczenia. ImageView znajduje się wewnątrz RelativeLayout nad moim głównym układem przy użyciu FrameLayout.Dlaczego moja animacja zostawia ślad?

Po uruchomieniu animacji na emulatorze wszystko działa całkiem nieźle, ale kiedy używam, uruchom go na moim G1, pozostawia za sobą artefakty wizualne i powoduje renderowanie komponentu tekstowego za nim.

Czy to jest problem z wydajnością i jestem zbyt ambitny, czy jest to błąd, który mogę pokonać?

Jeśli jest to problem z wydajnością, czy mogę coś poprawić?

+4

Czy możesz podać kod, na który mamy zwrócić uwagę? Czy robisz cokolwiek innego z układem ramek? Którą wersję zestawu SDK używasz (np. Ciastko?) – jamesh

+0

Czy to jest klasa, z której korzystasz? http://developer.android.com/reference/android/view/animation/TranslateAnimation.html –

+0

Dobre pytanie, też miałem ten problem, ale pokazuje się też w emulatorze! Występuje, gdy animuję rotację 3D widoku w FrameLayout, być może jego funkcję/błąd w FrameLayout? Zobaczę, czy mogę użyć widoku powierzchni ... – Andy

Odpowiedz

3

I teraz to może być trochę stary, ale ja po prostu znaleźć to:

http://groups.google.com/group/android-developers/browse_thread/thread/5481450f8b71a26c/e750730b9953d9a8?lnk=gst&q=animation+leaves+trails#e750730b9953d9a8

pewien co android wersji używasz, ale może to być błąd w Android bibliotek!

Wygląda na to, że problem jest dla mnie! :)

... Nie po prostu uwielbiam, gdy to nie twoja wina! : D

+0

Prawie na pewno. Nie mam już kodu do powtórzenia :(zrezygnowałem z tej animacji i poszedłem z tą, która nie zostawiłaby śladu –

0

Bez zauważenia problemu wygląda na to, że nie wyczyściłeś bufora wyświetlacza przed zapisaniem następnej klatki. To nie brzmi dla mnie jak problem z wydajnością.

Czy masz kontrolę nad tym, czy urządzenie ma podwójne buforowanie, czy nie?

Ponieważ działa na emulatorze, może to wskazywać na problem z emulatorem lub błąd w kodzie, który nie pojawia się na emulatorze (co, jak sądzę, jest technicznie problemem z emulatorem!) niż problem z wydajnością.

+0

Korzystam z frameworka animacji dostarczonego przez platformę Android, więc nie mam żadnej kontroli nad podwójnym buforowaniem lub buforem wyświetlania. Dla mnie wygląda jak błąd. Jeśli był to problem z wydajnością, ponieważ moje wymagania były zbyt ambitne, animacja powinna po prostu być nierówna/mieć niską liczbę klatek na sekundę. Występuje dość dobrze, po prostu zostawia coś, co wygląda jak fragmenty obrazu za nim. Są sprzątane dość szybko, ale nie wygląda dobrze. –

+0

@ Tom - Myślę, że osiągnąłem granicę tego, co mogę zasugerować. Naprawdę nie znam środowiska, w którym się rozwijasz - ale wiem, że animacja pracowała z grafiką 3D w czasie rzeczywistym od wielu lat i spotkałem się z podobnymi problemami dźwiękowymi. Ale, jak powiedziałem, nie widząc, co się dzieje, trudno jest zdiagnozować problem. – ChrisF

0

Proponuję użyć animacji w postaci SurfaceView. Jest podwójnie buforowany, więc powinien wyeliminować migotanie, jeśli używasz go prawidłowo. Jeśli chcesz mieć przykład, demo LunarLander zawarte w sdk pokazuje to bardzo dobrze. Ponadto, jeśli masz bardziej szczegółowe pytanie z kodem, zapytaj się.

Jeśli chodzi o ogólną wydajność systemu Android, bardzo możliwe jest uzyskanie dość wysokich klatek na sekundę, więc nie oczekujesz zbyt wiele.

0

To też mi się przydarza. Używam emulatora korzystającego z wersji 1.6 z interfejsami Google API i potwierdziłem, że dzieje się to na Nexusie One z uruchomionym FRF83. Oto odpowiedni kod:

Animation a = new TranslateAnimation(0.0f, 0.0f, 100.0f, 0.0f); 
a.setDuration(2000); 
this.myView.startAnimation(a); 

Oto odpowiedni kod dla instancji pogląd:

View v = new View(this.getApplication()); 
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 80); 
v.setLayoutParams(params); 
v.setBackgroundColor(0xFFFF0000); 
// 
LinearLayout layout = (LinearLayout)this.findViewById(R.id.theLayout); 
layout.addView(v); 
// 
v.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     doAnimation(); 
    } 
}); 
// 
myView = v; 

Więc w zasadzie, podwójne buforowanie itp, jest obsługiwane przez system operacyjny, a nie mam nad nim kontroli w ogóle.

0

Miałem podobny problem w systemie Android 2.3, więc błąd może nadal istnieć. Używałem ImageView z PNG, który miał jakieś przezroczyste części. Ten widok obrazu pozostawiał ślady po animacji w TłumaczAnimacji. Używanie fałszywego tła do rysowania dla widoku obrazu wytyczało szlak (użyłem rysowania jako tła).

10

Wystąpił również ten sam problem w 2.3.

Unieważniono kontener widoku ruchomego (układ, w którym znajduje się ruchomy widok) w pliku Animation.applyTransformation.

Patrz:

Android - Artifacts using Animation

+0

Dzięki za zgłoszenie alternatywnego rozwiązania tego starego pytania Matthijs ... –

+0

Właśnie uratowałeś mój dzień Dziękuję :) –

2

Oto obejście znalazłem że rozwiązano to dla mnie: „To proste obejście byłoby pad obraz z małą (1 piksel powinien to zrobić) przezroczystego obszaru na right/bottom - nie miałoby to żadnego wpływu na to, jak by wyglądało, ale wymusiłoby unieważnienie regionu nieco większego niż rzeczywisty obraz i tym samym zrekompensuje błąd. "

http://code.google.com/p/android/issues/detail?id=22151

+0

Zdecydowanie najprostsze rozwiązanie tego. Dzięki! –

+0

ten działa. Nie mam pojęcia, dlaczego tak się dzieje, ponieważ jeden z głównych programistów Androida napisał, że został naprawiony kilka lat temu: http://groups.google.com/group/android-developers/browse_thread/thread/5481450f8b71a26c/e750730b9953d9a8?lnk=gst&q=animation + liście + szlaki # e750730b9953d9a8 –

+0

Bardzo interesujące! Zgaduję, że działa to z powodu konwersji z rzeczywistych do gęstości niezależnych pikseli. Pierścień niewidzialnych kont dla jakiegoś niechlujstwa. –

0

wyobraziłem to na Jelly Bean ja przeżywałam to w widoku galerii wykonując jakąś animację. Wygląda bardziej jak nie kwestii rysunku cpu ....

dokonać aktywność wdrożyć AnimatorListener interfejsu ..... przesłonić poniżej metody i wybrać, który z nich chcesz przerysować swój pogląd w

@Override 
public void onAnimationEnd(Animator animation) { 
    // TODO Auto-generated method stub 

    mView.requestLayout(); 
    Toast.makeText(this, "animation ended", 0).show(); 
} 

@Override 
public void onAnimationRepeat(Animator animation) { 
    // TODO Auto-generated method stub 
    mView.requestLayout(); 
} 

@Override 
public void onAnimationStart(Animator animation) { 
    // TODO Auto-generated method stub 
    mView.requestLayout(); 
} 
Powiązane problemy