2009-06-18 5 views
9

Ich animiere ein ImageView von links nach rechts mit einer Übersetzungs-Animation. Das ImageView befindet sich in einem RelativeLayout oberhalb des Hauptlayouts mit FrameLayout.Warum hinterlässt meine Animation Spuren?

Wenn ich die Animation auf dem Emulator ausführen, funktioniert alles ziemlich gut, aber wenn ich es auf meinem G1 benutze, hinterlässt es visuelle Artefakte und beeinflusst das Rendering der Textkomponente dahinter.

Ist das ein Leistungsproblem und ich bin zu ehrgeizig oder ist es ein Bug, den ich überwinden kann?

Wenn es ein Leistungsproblem ist, kann ich irgendetwas tun, um Dinge zu verbessern?

+4

Können Sie uns einen Code zur Verfügung stellen? Machst du sonst noch etwas mit dem Rahmenlayout? Welche Version des SDK verwenden Sie (z. B. cupcake?) – jamesh

+0

Ist dies die Klasse, die Sie verwenden? http://developer.android.com/reference/android/view/animation/TranslateAnimation.html –

+0

Gute Frage, ich hatte dieses Problem auch, aber es zeigt sich auch im Emulator! Es passiert, wenn ich eine 3D-Rotation einer Ansicht in einem FrameLayout animiere, vielleicht ist es eine Funktion/ein Bug des FrameLayout? Ich werde sehen, ob ich die Oberflächenansicht verwenden kann ... – Andy

Antwort

3

Ich kann dies jetzt ein wenig alt, aber ich habe gerade diesen:

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

nicht sicher, welche Android-Version Ihrer Verwendung, aber es kann ein Fehler in den Android-Bibliotheken sein!

Sieht aus wie das ist, was das Problem für mich ist! :)

... Dontcha liebe es einfach, wenn es nicht deine Schuld ist! : D

+0

Fast sicher. Ich habe nicht mehr den Code, um es erneut zu testen :(Ich gab diese Animation auf und ging mit einer, die keine Spur verlassen würde. –

0

Ohne das Problem tatsächlich zu sehen, hört sich an, als würden Sie den Anzeigepuffer nicht löschen, bevor Sie das nächste Bild schreiben. Es klingt für mich nicht nach einem Leistungsproblem.

Haben Sie die Kontrolle darüber, ob das Gerät doppelt gepuffert wird oder nicht?

Vorausgesetzt, dass es auf dem Emulator funktioniert, könnte dies entweder auf ein Problem mit dem Emulator oder einen Fehler in Ihrem Code hinweisen, der nicht auf dem Emulator angezeigt wird (was vermutlich ein Problem mit dem Emulator ist!) als ein Leistungsproblem.

+0

Ich verwende das Animationsframework, das vom Android-Framework zur Verfügung gestellt wird, so dass ich keine Kontrolle über die doppelte Pufferung oder den Anzeigepuffer habe. Für mich sieht es wie ein Fehler aus. Wenn das ein Leistungsproblem war, weil meine Anforderungen zu ehrgeizig waren, sollte die Animation nur ruckelnd sein/eine niedrige Framerate haben. Es funktioniert ziemlich gut, es hinterlässt nur etwas, das wie Teile des Bildes dahinter aussieht. Sie werden ziemlich schnell gereinigt, aber es sieht nicht gut aus. –

+0

@Tom - Ich glaube, ich habe das Limit erreicht, was ich vorschlagen kann. Ich kenne die Umgebung, in der du entwickelst, nicht wirklich - aber ich weiß, dass Animation schon seit einigen Jahren mit 3D-Grafiken in Echtzeit funktioniert und ich ähnliche Probleme habe. Aber wie gesagt, ohne zu sehen, was vor sich geht, ist es schwierig, das Problem zu diagnostizieren. – ChrisF

0

Ich würde vorschlagen, eine SurfaceView für die Animation zu verwenden. Es ist doppelt gepuffert, also sollte es flackern, wenn Sie es richtig verwenden. Wenn Sie ein Beispiel möchten, zeigt die LunarLander-Demo, die in der SDK enthalten ist, das wirklich gut. Wenn Sie eine spezifischere Frage mit Code haben, fragen Sie auch nach.

Wie für allgemeine Android-Leistung ist es sehr möglich, ziemlich hohe Bildraten zu haben, so dass Sie nicht zu viel erwarten.

0

Das passiert mir auch. Ich benutze einen Emulator, der 1.6 mit den Google-APIs verwendet, und ich habe gerade bestätigt, dass dies auf einem Nexus One unter FRF83 passiert. Hier ist der relevante Code:

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

Hier ist der relevante Code zum Instanziieren der Ansicht:

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; 

Also im Grunde die doppelte Pufferung usw., wird durch das O behandelt, und ich habe keine Kontrolle darüber überhaupt.

0

Ich hatte ein ähnliches Problem auf Android 2.3, so dass der Fehler möglicherweise noch vorhanden ist. Ich verwendete ein ImageView mit einem PNG, das einige transparente Teile hatte. Diese Bildansicht hat Spuren hinterlassen, wenn sie mit TranslateAnimation animiert wurde. Die Verwendung eines gefälschten Hintergrunds, der für die Bildansicht drawbar ist, löschte die Spur (ich verwendete einen Hintergrund als Zeichen).

10

Ich hatte auch das gleiche Problem auf 2.3.

Den Container der sich bewegenden Ansicht (das Layout, in dem sich die bewegte Ansicht befindet) ungültig machen in Animation.applyTransformation hat es für mich behoben.

See:

Android - Artifacts using Animation

+0

Danke für die Rückmeldung einer alternativen Lösung zu dieser alten Frage Matthijs ... –

+0

Sie haben gerade meinen Tag gerettet Danke :) –

2

Hier ist eine Abhilfe, die ich gefunden, dass dies für mich gelöst: „Eine einfache Abhilfe zu Pad Ihr Bild mit einem kleinen wäre (1 Pixel sollte es tun) transparenten Bereich auf der right/bottom - das hätte keinen Einfluss darauf, wie es aussehen würde, aber es würde eine Invalidierung einer Region erzwingen, die etwas größer ist als das tatsächliche Bild und somit den Fehler kompensieren. "

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

+0

Bei weitem die einfachste Lösung dafür. Vielen Dank! –

+0

dieser funktioniert. keine Ahnung, warum es passiert, seit einer der wichtigsten Android-Entwickler schrieb, dass es vor Ewigkeiten behoben wurde: http://groups.google.com/group/android-developers/browse_thread/thread/5481450f8b71a26c/e750730b9953d9a8?lnk=gst&q=animation + Blätter + Spuren # e750730b9953d9a8 –

+0

Sehr interessant! Ich vermute, dass dies wegen der Umwandlung von tatsächlichen zu dichte unabhängigen Pixeln funktioniert. Der Ring des Unsichtbaren steht für Schlamperei. –

0

Ich dachte, dieses heraus auf Jelly Bean ich dies in einer Galerie-Ansicht erlebt wurde, während einige Animation durchführen. Es sieht eher wie eine Zeichnung Ausgabe nicht cpu ....

Ihre Aktivität der Schnittstelle AnimatorListener implementieren machen ..... das unten stehende Methode außer Kraft setzen und wählen, welche Sie in

Ihre Ansicht neu zeichnen möchten
@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(); 
} 
Verwandte Themen