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.
- Relación de escala en imágenes de Android?
- Sube una foto de la cámara al servidor PHP
- Comprobar imagen semi cargada o no en Android
- Android - imágenes vectoriales perder calidad?
- ¿Cómo alinear ImageView a la parte inferior, llenar su ancho y altura, y mantener su relación de aspecto?
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,
- Biblioteca de procesamiento de imágenes para Android y Java
- Android - Cómo cortar parte de la imagen y mostrarla en imageview
- Android: Obtener miniatura de la imagen en la tarjeta SD, dado Uri de la imagen original
- Convertir imagen a JSON
- Conversión dinámica de imagen en binario y viceversa
- ¿Cómo cambio el tinte de un ImageButton en el enfoque / presione
- Android: Superponer una imagen (jpg) con transparencia
- Imagen de carga de Android de la galería al servidor
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>