2009-06-18 11 views
9

Estoy animando un ImageView desde la izquierda a la derecha de la pantalla usando una animación de traducción. El ImageView se ubica dentro de un RelativeLayout en la parte superior de mi diseño principal utilizando FrameLayout.¿Por qué mi animación deja un rastro?

Cuando ejecuto la animación en el emulador todo funciona bastante bien, pero cuando uso run it en mi G1 deja atrás artefactos visuales y efectúa la representación del componente de texto detrás de él.

Es este un problema de rendimiento y estoy siendo demasiado ambicioso o se trata de un error que puedo superar?

Si es un problema de rendimiento ¿hay algo que pueda hacer para mejorar las cosas?

+4

¿Puede proporcionarnos algún código para que podamos ver? ¿Estás haciendo algo más con el diseño del marco? ¿Qué versión del SDK estás usando (es decir, magdalena?) – jamesh

+0

¿Es esta la clase que estás usando? http://developer.android.com/reference/android/view/animation/TranslateAnimation.html –

+0

¡Buena pregunta, también he tenido este problema, pero también aparece en el emulador! ¿Ocurre cuando estoy animando una rotación 3D de una vista en FrameLayout, quizás es una función/error de FrameLayout? Voy a ver si puedo usar la vista de superficie ... – Andy

Respuesta

3

Ahora esto puede ser un poco viejo, pero me acaba de encontrar esto:

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

No está seguro de qué versión de Android que su uso de, pero puede ser un error de los bibliotecas android!

¡Parece que ese es el problema para mí! :)

... Dontcha simplemente me encanta cuando no es tu culpa! : D

+0

Casi seguro. Sin embargo, ya no tengo el código para volver a probar :(Renuncié a esa animación y fui con una que no dejaría rastro. –

0

Sin ver realmente el problema, parece que no está borrando el búfer de la pantalla antes de escribir el siguiente fotograma. No me parece un problema de rendimiento.

¿Tiene control sobre si el dispositivo hace doble buffering o no?

Dado que funciona en el emulador, esto podría indicar un problema con el emulador o un error en el código que no aparece en el emulador (¡lo que supongo que es técnicamente un problema con el emulador!) que un problema de rendimiento.

+0

Estoy usando el marco de animación provisto por el framework de Android, así que no tengo control sobre el doble buffer o el buffer de visualización. Para mí, parece un error. Si esto fuera un problema de rendimiento porque mis requisitos eran demasiado ambiciosos, la animación debería ser desigual/tener un framerate bajo. Funciona razonablemente bien, simplemente deja lo que parecen piezas de la imagen detrás de él. Se limpian bastante rápido, pero no se ve bien. –

+0

@Tom - Creo que he llegado al límite de lo que puedo sugerir. Realmente no conozco el entorno en el que se está desarrollando, pero sí sé que la animación ha funcionado con gráficos 3D en tiempo real durante varios años y he encontrado problemas de sonido similares. Pero como dije, sin ver realmente lo que sucede es difícil diagnosticar el problema. – ChrisF

0

se recomienda usar un SurfaceView para la animación. Tiene doble amortiguación, por lo que debe eliminar el parpadeo si lo usa correctamente. Si quieres un ejemplo, la demo de LunarLander incluida en el SDK muestra esto realmente bien. Además, si tiene una pregunta más específica con el código, pregunte.

En cuanto a rendimiento de Android en general, es muy posible tener velocidades de cuadro razonablemente altos, por lo que no se esperaba demasiado.

0

Esto me está sucediendo a mí también. Estoy usando un emulador usando 1.6 con las API de Google, y acabo de confirmar que sucede en un Nexus One ejecutando FRF83. Aquí está el código correspondiente:

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

Aquí está el código relevante para crear instancias de la vista:

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; 

Así que, básicamente, el doble buffer, etc, está siendo manejado por el sistema operativo, y no tengo ningún control sobre él en absoluto.

0

Tuve un problema similar en Android 2.3, por lo que el error puede existir todavía. Estaba usando un ImageView con un PNG que tenía algunas partes transparentes. Esta vista de imagen dejaba rastros cuando estaba animada con TranslateAnimation. Usar un fondo falso dibujable para la vista de la imagen eliminó el rastro (utilicé un dibujable como fondo).

10

También estaba experimentando el mismo problema en 2.3.

Invalidando el contenedor de la vista en movimiento (el diseño en el que se encuentra la vista en movimiento) en Animation.applyTransformation lo solucionó.

Ver:

Android - Artifacts using Animation

+0

Gracias por informarme de una solución alternativa a esta vieja pregunta Matthijs ... –

+0

Acabas de salvar mi día Gracias :) –

2

He aquí una solución que encontré que resuelve esto para mí: "Una solución sencilla sería la de rellenar su imagen con un pequeño (1 píxel debe hacerlo) región transparente en el derecha/abajo: esto no tendría ningún efecto sobre cómo se vería, pero forzaría una invalidación de una región un poco más grande que la imagen real y así compensaría el error ".

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

+0

Con mucho, la solución más simple para esto. ¡Gracias! –

+0

este funciona. no hay idea de por qué ocurre, ya que uno de los principales desarrolladores de Android escribió que se arregló hace siglos: http://groups.google.com/group/android-developers/browse_thread/thread/5481450f8b71a26c/e750730b9953d9a8?lnk=gst&q=animation + hojas + senderos # e750730b9953d9a8 –

+0

¡Muy interesante! Supongo que esto funciona debido a la conversión de píxeles reales a píxeles independientes de densidad. El anillo de cuentas invisibles para algunos descuidos. –

0

Me di cuenta de esto en Jelly Bean que estaba experimentando esto en una vista galería mientras se realiza alguna animación. Se parece más a una cuestión de dibujo no cpu ....

a que su actividad implementar la interfaz AnimatorListener ..... reemplazar el método de abajo y elegir cuál de ellos desea volver a dibujar la vista en

@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(); 
} 
Cuestiones relacionadas