una studio pantalla page inicio imagen hacer crear como animado activity android animation frame out-of-memory splash-screen

pantalla - splash screen animado android studio



Crear una pantalla de bienvenida animada usando marcos en Android (3)

Necesita llamar .recycle (̶) ̶ en los mapas de bits ¿Aún no uso ̶a̶n̶y̶m̶o̶r̶e̶.̶ de lo contrario no será basura recogida ̶p̶r̶o̶p̶e̶r̶l̶y̶.̶

También en el conjunto de manifiestos se usa un gran montón como verdadero. Esto te da un poco más de espacio para respirar. >)

Así que este es el trato, he buscado todas las preguntas y enlaces en línea, pero ninguno es útil. Tengo 120 fotogramas de una animación en formato .jpg para mi pantalla de inicio. Entiendo que los jpegs se convierten a bitmaps en la memoria, por eso obtengo un OutOfMemoryError. Los cuadros máximos que obtengo para animar son 10. ¿Hay alguna manera de hacerlo fotograma por fotograma, o debería intentar algo más? Aquí está mi código:

final AnimationDrawable anim = new AnimationDrawable(); anim.setOneShot(true); for (int i = 1; i <= 120; i++) { Drawable logo = getResources().getDrawable(getResources() .getIdentifier("l"+i, "drawable", getPackageName())); anim.addFrame(logo, 50); if (i % 3 == 0) { System.gc(); } } ImageView myImageView = (ImageView) findViewById(R.id.SplashImageView); myImageView.setBackgroundDrawable(anim); myImageView.post(new Runnable() { public void run() { anim.start(); } });

He colocado los 120 jpegs debajo de la carpeta dibujable con un prefijo "l" (por ejemplo, l1, l2, etc.). Hago recolección de basura cada 3 jpegs pero eso no hará nada.


Puede intentar hacerlo sin AnimationDrawable usando Handler.postDelayed . Algo como esto:

final ImageView image = (ImageView) findViewById(R.id.SplashImageView); final Handler handler = new Handler(); final Runnable animation = new Runnable() { private static final int MAX = 120; private static final int DELAY = 50; private int current = 0; @Override public void run() { final Resources resources = getResources(); final int id = resources.getIdentifier("l" + current, "drawable", getPackageName()); final Drawable drawable = resources.getDrawable(id); image.setBackgroundDrawable(drawable); handler.postDelayed(this, DELAY); current = (current + 1) % MAX; } }; handler.post(animation);

Esta solución requiere menos memoria porque solo mantiene una dibujable por vez.

Puede cancelar la animación con handler.removeCallbacks(animation); .

Si quieres hacer una animación de un solo golpe, puedes llamar a handler.postDelayed condicionalmente:

if (current != MAX - 1) { handler.postDelayed(this, DELAY); }


Probé todas esas soluciones con cada una de ellas mejorando: D podría usar más fotogramas y más resolución pero aún no es satisfactorio para los administradores :( La mejor solución es usar video en lugar de marcos, funciona como un encanto incluso para dispositivos con poca memoria Probé 150 fotogramas cada uno de tamaño 480 * 854 con un códec de video (H.264 mp4) en xperia u con 256 mb de memoria RAM