Tengo una serie de imágenes fijas y un total de más de 500 imágenes presentadas en un directorio dibujable. Necesito hacer una animación (cargar aproximadamente 20 imágenes por segundo). Quiero que funcione sin problemas y sin Excepción de falta de memoria.Android: hacer animación a partir de imágenes estáticas
Tengo la idea de hacer esto para que las imágenes de 2 a 3 segundos (40 a 60 imágenes) se carguen en la memoria y se muestren y luego se eliminen (suelten la memoria) y luego las imágenes de los próximos 2 a 3 segundos debería cargar Esta técnica puede prevenir la excepción de falta de memoria. Es solo una idea, no sé si es una buena idea o no. Por favor, guíame una idea mejor con un código para ir ... Si mi idea es mucho mejor y puede funcionar, por favor dígame un código de ayuda para hacer eso.
Después de leer las respuestas y hacer como usted sugiere, he escrito algo de código como esto:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/llMain">
<ViewFlipper android:id="@+id/imageflipper"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView android:id="@+id/ImageView01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="centerInside"
android:layout_gravity="center" />
</ViewFlipper>
</LinearLayout>
y aquí está mi código para hacer la animación:
public class Animation extends Activity {
ViewFlipper flipper;
int myIndex = 216;
private final Handler handler = new Handler();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
flipper=(ViewFlipper)findViewById(R.id.imageflipper);
doTheAutoRefresh();
//displayData();
}
private void doTheAutoRefresh() {
handler.postDelayed(new Runnable() {
public void run(){
displayData(); // this is where you put your refresh code
doTheAutoRefresh();
}
}, 30);
}
private void displayData()
{
Resources r = getResources();
if(myIndex > 230){
myIndex = 216;
ImageView myImg = (ImageView)findViewById(R.id.ImageView01);
myImg.setImageResource(r.getIdentifier("drum0" + myIndex, "drawable", "com.vt.animation"));
myIndex += 1;
flipper.showNext();
}
else{
ImageView myImg = (ImageView)findViewById(R.id.ImageView01);
myImg.setImageResource(r.getIdentifier("drum0" + myIndex, "drawable", "com.vt.animation"));
myIndex += 1;
flipper.showNext();
}
}
}
pero es muy lento Configuré el tiempo de actualización en 30 milisegundos, pero en realidad no está refrescando demasiado rápido, sino que su tiempo de actualización es de aproximadamente 1 segundo. ¿Alguna sugerencia para que sea rápido sentir como una verdadera animación?
Gracias,
@Mudasser Hassan si todas las imágenes en el lado del servidor y tengo que descargar todas las imágenes y hacer ese tipo de trabajo. (Reproducción de un video o animación de imágenes). ¿Cómo puedo hacer eso? Necesito que todas las imágenes muestren como 360 grados rotando una sola imagen. Como ese http://www.mathieusavard.info/threesixty/demo.html –
Gracias. Si todas las imágenes son del servidor y tenemos que descargar todas las imágenes y mostrar. ¿Has dado alguna idea? Estoy enfrentando un problema con eso. Por favor ayuda. –
Si usó 'Handler.post()' el código sería más corto. Otra cuestión es que decodifique la imagen en el hilo de UI, eso no es bueno.Una solución más elegante sería decodificar la siguiente imagen en segundo plano (usando 'AsyncTask') con anticipación y mostrarla después de 200 ms o después de que la imagen haya sido decodificada, si lleva más tiempo. – Mixaz