Android: crear animaciones a partir de imágenes fijas

Tengo una serie de imágenes fijas y un total de más de 500 imágenes presentadas en el directorio dibujable. Necesito hacer una animación (carga alrededor de 20 imágenes por segundo). Quiero que funcione sin problemas y sin excepción de memoria.

Tengo la idea de hacer esto que las imágenes de 2 a 3 segundos (40 a 60 imágenes) deben cargar en la memoria y se muestra y luego deben eliminados (liberar la memoria) y, a continuación, las imágenes de los próximos 2 a 3 segundos debe cargar. Esta técnica puede evitar la excepción de memoria perdida. Es sólo una idea, no sé si es una buena idea o no. Por favor, guíame alguna idea mejor con algún código para ir con … Si mi idea es mucho mejor y puede trabajar, entonces por favor dígame algún código de ayuda para hacer eso.

Después de leer las respuestas y de hacer como usted sugiere, he escrito un cierto 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 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. He configurado el tiempo de actualización a 30 milisegundos, pero en realidad no es refrescante demasiado rápido en lugar de su tiempo de actualización es de aproximadamente 1 segundo. ¿Alguna sugerencia para que sea rápido sentir una animación real?

Gracias,

Utilice un FrameAnimation , por ejemplo en res/drawable/movie.xml :

 <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <item android:drawable="@drawable/frame1" android:duration="50" /> <item android:drawable="@drawable/frame2" android:duration="50" /> <item android:drawable="@drawable/frame3" android:duration="50" /> etc... </animation-list> 

Y luego en Java:

 imageView.setBackgroundResource(R.drawable.movie); AnimationDrawable anim = (AnimationDrawable) imageView.getBackground(); anim.start(); 

DE ACUERDO. El problema más grande y la solución más fácil que tengo que ir con después de tantos días. Nunca esperaría que sería tan fácil de hacer …: D

He utilizado el manejador y el temporizador para lograr con sólo una vista de imagen, sin aletas, sin animador nada más en absoluto … Aquí está mi solución:

—– archivo main.xml —–

 <?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:background="@drawable/background"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView1"> </ImageView> 

Y aquí está la manera en que lo he hecho:

 public class MainActivity extends Activity { private ImageView _imagView; private Timer _timer; private int _index; private MyHandler handler; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); handler= new MyHandler(); _imagView=(ImageView) findViewById(R.id.imageView1); _index=0; _timer= new Timer(); _timer.schedule(new TickClass(), 500, 200); } private class TickClass extends TimerTask { @Override public void run() { // TODO Auto-generated method stub handler.sendEmptyMessage(_index); _index++; } } private class MyHandler extends Handler { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); try { Bitmap bmp= BitmapFactory.decodeStream(MainActivity.this.getAssets().open("drum_"+_index+".png")); _imagView.setImageBitmap(bmp); Log.v("Loaing Image: ",_index+""); } catch (IOException e) { // TODO Auto-generated catch block Log.v("Exception in Handler ",e.getMessage()); } } } 

}

Nota: he colocado todas mis imágenes en el directorio de activos.

Es tan simple como puede, nada grande que hacer …

Espero que sea útil para alguien que quiera ir así 🙂

Cargar varias imágenes es muy caro.

Creo que es mejor cargar una sola imagen que contenga todos los movimientos de esa animación. Una tira de animación.

private Bitmap animation = BitmapFactory.decodeResource(getResources(), R.drawable.myPng);

La idea es recorrer el mapa de bits.

Bueno, estoy usando viewFlipper, cambiando entre las vistas. Lo bueno de este es que u puede ver imagen anterior deslizándose mientras el nuevo se desliza.

Método de visualización de imagen interior:

  if (direction == NEXT) { viewFlipper.setInAnimation(slideLeftIn); viewFlipper.setOutAnimation(slideLeftOut); if (currImg < max) currImg++; if (currImg == max) currImg = 0; if (currentView == 0) { currentView = 1; ImageView iv = (ImageView) findViewById(R.id.ImageView02); iv.setImageResource(images[currImg]); } else if (currentView == 1) { currentView = 2; ImageView iv = (ImageView) findViewById(R.id.ImageView03); iv.setImageResource(images[currImg]); } else { currentView = 0; ImageView iv = (ImageView) findViewById(R.id.ImageView01); iv.setImageResource(images[currImg]); } viewFlipper.showNext(); } else if (direction == PREV) { viewFlipper.setInAnimation(slideRightIn); viewFlipper.setOutAnimation(slideRightOut); if (currImg > 0) currImg--; else if (currImg <= 0) currImg = (max-1); if (currentView == 0) { currentView = 2; ImageView iv = (ImageView) findViewById(R.id.ImageView03); iv.setImageResource(images[currImg]); } else if (currentView == 2) { currentView = 1; ImageView iv = (ImageView) findViewById(R.id.ImageView02); iv.setImageResource(images[currImg]); } else { currentView = 0; ImageView iv = (ImageView) findViewById(R.id.ImageView01); iv.setImageResource(images[currImg]); } viewFlipper.showPrevious(); 

Y dentro del archivo XML:

  <ViewFlipper android:id="@+id/imageflipper" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="centerInside" android:layout_gravity="center" /> <ImageView android:id="@+id/ImageView02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="centerInside" android:layout_gravity="center" /> <ImageView android:id="@+id/ImageView03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="centerInside" android:layout_gravity="center" /> </ViewFlipper> 
  • Fondo de Pantalla de la Pantalla Principal
  • ¿Cómo se pasan las imágenes (mapas de bits) entre las actividades de androide mediante bundles?
  • Propiedades del tema y del estilo para la imagen de fondo
  • Tamaño de imagen dinámico para android
  • ¿Cómo cargar una imagen en la vista de la imagen desde la galería?
  • Tamaño incorrecto de Drawable.getIntrinsicWidth ()
  • Android: ¿Cómo adjunto una imagen temporal generada a un correo electrónico?
  • ImageView con esquinas redondeadas a través de otra Imagen como fondo
  • Java.io.FileNotFoundException en android
  • Repetición de imagen mientras se desplaza en la vista de cuadrícula de Android con Universal Image Loader
  • combinando dos archivos png en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.