Crear un fondo de pantalla en vivo en Android usando un GIF animado

¿Alguna vez has visto un hermoso GIF animado que se reproduce sin problemas y te has preguntado si podrías usarlo como fondo de pantalla en vivo en tu dispositivo Android? Bueno, puedes, y en este tutorial te voy a mostrar cómo.

Buscando un atajo?

Si prefiere utilizar una solución ya preparada en lugar de codificarla usted mismo, pruebe el elemento GIF Live Wallpaper en Envato Market. Te permite crear tu propia aplicación Live Wallpaper para Android basada en GIF animados. 

Introducción

La creación de un fondo de pantalla en vivo interesante y hermoso desde cero utilizando solo código matemático para generar los gráficos puede ser tedioso y lento. También requiere mucha creatividad. Por otro lado, crear un GIF animado o encontrar uno en línea es mucho más fácil. En este tutorial, aprenderá cómo convertir cualquier GIF animado en un fondo de pantalla en vivo.

Prerrequisitos

Asegúrate de que tienes configurada la última versión de Android Studio. Puedes obtenerlo desde el sitio web del desarrollador de Android.

Aunque cualquier GIF animado funcionará, te sugiero que descargues un buen cinemagraph. Un cinemagraph no es más que un GIF animado, generalmente creado a partir de un video, que se reproduce sin interrupciones. Puedes encontrar muchos buenos en Flickr.

Para este tutorial, estoy usando un cinemagraph creado por el usuario djandyw.com de Flickr, ya que está disponible bajo una licencia de Creative Commons.

1. Crear un nuevo proyecto

Inicie Android Studio, cree un nuevo proyecto y nombre el proyecto GIFWallpaper. Elija un nombre de paquete único si planea publicar esta aplicación en Google Play.

Establezca el SDK mínimo en API 8: Android 2.2 (Froyo).

Nuestra aplicación no va a tener un Actividad, así que elige Añadir ninguna actividad y haga clic Terminar.

2. Describe el fondo de pantalla

Un fondo de pantalla en vivo necesita un archivo que lo describa. Crea un nuevo archivo XML llamado res / xml / wallpaper.xml y reemplazar su contenido con el siguiente XML:

  

La etiqueta y la miniatura son particularmente importantes ya que se utilizarán cuando el fondo de pantalla aparezca en la lista de fondos de pantalla disponibles en su dispositivo.

3. Edita el Manifiesto

Para ejecutar como fondo de pantalla en vivo, nuestra aplicación solo necesita un permiso, android.permission.BIND_WALLPAPER.

Un fondo de pantalla en vivo se ejecuta como una Servicio que puede recibir el  android.service.wallpaper.WallpaperService intencion de accion Nombra el Servicio GIFWallpaperService Y añádelo al manifiesto del proyecto., AndroidManifest.xml.

      

A continuación, para asegurarse de que la aplicación se pueda instalar solo en dispositivos que pueden ejecutar fondos de pantalla en vivo, agregue el siguiente fragmento de código al manifiesto:

 

4. Añadir GIF animado

Copia el GIF animado que descargaste de Flickr al bienes Carpeta del proyecto. He llamado al GIF girl.gif.

5. Crea el servicio

Crear una nueva clase de Java y nombrarla GIFWallpaperService.java. Esta clase debe extender el Servicio de papel tapiz clase.

clase pública GIFWallpaperService extiende WallpaperService 

Porque Servicio de papel tapiz Es una clase abstracta, hay que anular su onCreateEngine Método y devolver una instancia de su propia Motor, Que puede hacer los marcos de la GIF.

Para usar el GIF animado, primero debes convertirlo en un Película objeto. Puedes usar el Película clase decodificar stream Método para hacerlo. Una vez el Película El objeto se ha creado, páselo como parámetro al constructor de la costumbre. Motor.

Esto es lo que el onCreateEngine El método debería verse como:

@Override public WallpaperService.Engine onCreateEngine () try Movie movie = Movie.decodeStream (getResources (). GetAssets (). Open ("girl.gif")); volver nuevo GIFWallpaperEngine (película);  catch (IOException e) Log.d ("GIF", "No se pudo cargar el activo"); retorno nulo 

6. Crea el motor

Vamos a empezar a trabajar en el Motor ahora. Crear una clase llamada GIFWallpaperEngine dentro de GIFWallpaperService clase y hazlo extender WallpaperService.Engine.

Agregue los siguientes campos a esta nueva clase:

  • marcoDuración: Este entero representa el retardo entre las operaciones de re-draw. Un valor de 20 te da 50 cuadros por segundo..
  • visible: Este booleano permite que el motor sepa si el fondo de pantalla en vivo está actualmente visible en la pantalla. Esto es importante, porque no deberíamos estar dibujando el fondo de pantalla cuando no está visible.
  • película: Este es el GIF animado en forma de Película objeto.
  • poseedor: Esto se refiere a la SurfaceHolder Objeto disponible para el motor. Debe inicializarse anulando el onCreate método.
  • entrenador de animales: Esto es un Entrenador de animales objeto que se utilizará para iniciar una Ejecutable que se encarga de dibujar realmente el fondo de pantalla.

Tu clase ahora debería verse así:

clase privada GIFWallpaperEngine extiende WallpaperService.Engine private final int frameDuration = 20; titular de SurfaceHolder privado; Película privada; booleano privado visible; manejador privado; public GIFWallpaperEngine (película) this.movie = movie; handler = new Handler ();  @Override public void onCreate (SurfaceHolder surfaceHolder) super.onCreate (surfaceHolder); this.holder = surfaceHolder; 

A continuación, crea un método llamado dibujar Que dibuja los contenidos del GIF animado. Vamos a romper este método:

  • Primero verificamos si el visible variable se establece en cierto. Solo continuamos si es.
  • Utilizar el SurfaceHolderes LockCanvas método para obtener un Lona recurrir a.
  • Dibuja un cuadro del GIF animado en el Lona despues de escalarlo y posicionarlo.
  • Una vez hecho todo el dibujo, pasar el Lona de vuelta a SurfaceHolder.
  • Actualice el cuadro actual del GIF animado usando el Película objetos fijar tiempo método.
  • Vuelva a llamar al método usando el entrenador de animales después de esperar marcoDuración milisegundos.

los dibujar El método nunca se llama directamente. Siempre se llama usando un Entrenador de animales y un Ejecutable objeto. Por lo tanto, hagamos la Ejecutable objetar un campo de la clase y llamarlo drawGIF.

Agregue el siguiente código a la GIFWallpaperService clase:

private Runnable drawGIF = new Runnable () public void run () draw (); ; draw privado () if (visible) Canvas canvas = holder.lockCanvas (); canvas.save (); // Ajusta el tamaño y la posición para que // la imagen se vea bien en tu pantalla canvas.scale (3f, 3f); movie.draw (lienzo, -100, 0); canvas.restore (); holder.unlockCanvasAndPost (lienzo); movie.setTime ((int) (System.currentTimeMillis ()% movie.duration ())); handler.removeCallbacks (drawGIF); handler.postDelayed (drawGIF, frameDuration);  

los onVisibilityChanged El método se llama automáticamente cada vez que cambia la visibilidad del fondo de pantalla. Tenemos que anularlo y, en función del valor del visible argumento, ya sea inicio o parada drawGIF. los removeCallbacks método de la Entrenador de animales Se utiliza para detener cualquier pendiente. drawGIF carreras.

@Override public void onVisibilityChanged (boolean visible) this.visible = visible; if (visible) handler.post (drawGIF);  else handler.removeCallbacks (drawGIF); 

Por último, anular el onDestroy método de la Motor para detener cualquier pendiente drawGIF se ejecuta si el fondo de pantalla está desactivado.

@Override public void onDestroy () super.onDestroy (); handler.removeCallbacks (drawGIF); 

7. Compilar e instalar

Tu fondo de pantalla en vivo ya está listo. Compílelo e instálelo en su dispositivo Android. Una vez instalado, deberías poder encontrar el fondo de pantalla en la lista de fondos de pantalla disponibles.

La mayoría de los lanzadores te dan la opción de cambiar el fondo de pantalla después de un largo toque de toque. Alternativamente, puede ir a la configuración de pantalla para cambiar el fondo de pantalla.

Si el GIF parece demasiado pequeño o no está colocado correctamente, vuelva a la dibujar Método y ajuste la escala y posición..

Conclusión

Ahora sabes cómo usar un GIF animado para crear un fondo de pantalla en vivo. Siéntete libre de experimentar con más GIFs. Si planeas publicar tu fondo de pantalla en vivo en Google Play, asegúrate de tener el permiso del creador para usar el GIF animado comercialmente. Visite el sitio web de Android Developer para obtener más información sobre el Servicio de papel tapiz clase.