Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: ¿Cómo se muestra un gif animado grande dado un url?

Supongamos que tengo la URL para gif animado grande y quería hacer una actividad como youtube como que muestra la animación en una forma de streaming. Cómo puedo

  1. Corriente en la imagen?
  2. Conseguir que hacer mostrar con la animación real?

Sé que ImageView no es la respuesta, ya que sólo muestra el primer fotograma.

Un bono sería tener acceso a su estado de búfer para que pueda sincronizar el sonido de transmisión también – esto es parte de una aplicación de visor YTMND . Aunque podría crear un servicio que transcodifique los archivos gif públicos en un formato más agradable, me gustaría que la aplicación funcione sin dependencias adicionales.

  • Mostrar GIF animado
  • Cómo jugar gif en android de url?
  • Mostrar .gif con android.graphics.Movie
  • reproducir la imagen GIF descargada en android
  • 4 Solutions collect form web for “Android: ¿Cómo se muestra un gif animado grande dado un url?”

    El boceto general de la solución es utilizar la View personalizada que atrae a una Movie para dibujarse a la Canvas periódicamente.

    El primer paso es crear la instancia de Movie . Hay una fábrica llamada decodeStream que puede hacer una película dada una InputStream pero no es suficiente para usar la secuencia de una UrlConnection . Si intenta esto, obtendrá una IOException cuando el cargador de películas intente llamar al reset en la secuencia. El hack, por desafortunado que sea, es usar un BufferedInputStream separado con una mark establecida manualmente para decirle que guarde suficientes datos que no se reset . Afortunadamente, el URLConnection puede decirnos cuánto datos esperar. Digo que este hack es desafortunado porque efectivamente requiere que toda la imagen sea almacenada en la memoria (que no es un problema para las aplicaciones de escritorio, pero es un problema serio en un dispositivo móvil con limitación de memoria).

    Aquí hay un recorte del código de configuración de la Movie :

     URL url = new URL(gifSource); URLConnection conn = url.openConnection(); InputStream is = conn.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); bis.mark(conn.getContentLength()); Movie movie = Movie.decodeStream(bis); bis.close(); 

    A continuación, debe crear una vista que muestre esta Movie . Una subclase de View con un onDraw personalizado hará el truco (suponiendo que tiene acceso a la Movie que creó con el código anterior).

     @Override protected void onDraw(Canvas canvas) { if(movie != null) { long now = android.os.SystemClock.uptimeMillis(); int dur = Math.max(movie.duration(), 1); // is it really animated? int pos = (int)(now % dur); movie.setTime(pos); movie.draw(canvas, x, y); } } 

    La vista no se activará para volver a dibujarse sin ayuda, y ciegamente llamando invalidate() al final de onDraw es sólo un desperdicio de energía. En otro subproceso (probablemente el que utilizó para descargar los datos de imagen), puede enviar mensajes al subproceso principal, solicitando que la vista se invalide a un ritmo constante (pero no insano).

     Handler handler = new Handler(); new Thread() { @Override public void run() { // ... setup the movie (using the code from above) // ... create and display the custom view, passing the movie while(!Thread.currentThread().isInterrupted()) { handler.post(new Runnable() { public void run(){ view.invalidate(); } }); try { Thread.sleep(50); // yields 20 fps } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } }.start(); 

    Una solución realmente agradable tendría todo tipo de barras de progreso dulce y comprobación de errores, pero el núcleo está aquí.

    ¿Has BitmapDecode ?

    Hay un ejemplo en el API Demos aquí .

    Glide demostrar la manera más fácil y eficiente para lograr esto con sólo una línea de código: –

     Glide.with(getApplicationContext()) .load(Uri.parse("https://media1.giphy.com/media/5ziaphcUWGKPu/200.gif")) .asGif().placeholder(R.drawable.ic_launcher).crossFade() .into(imageView); 

    El resultado está aquí: –

    Introduzca aquí la descripción de la imagen

    Gif tomado de aquí http://giphy.com/search/big-gif/3

    Añadir jarra de aquí: – https://github.com/bumptech/glide/releases

    ¿Quizás AnimationDrawable podría trabajar para usted? EDIT: No si desea cargar desde una URL como esta publicación se trata. Lo siento

    http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html

    Dependiendo de la complejidad del GIF, es decir, si se trata de un simple indicador de carga / progreso, podría romper el GIF aparte, guardar cada imagen por separado y utilizar AnimationDrawable del Framework Android.

    Para las barras de progreso simples esto puede ser menos propenso a errores, tal vez incluso más performant.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.