Advertisement
  1. Code
  2. Android SDK

Vytvořte živou tapetu na Android pomocí animovaného GIFu

Scroll to top
Read Time: 5 min

Czech (Čeština) translation by Karel Krkoska (you can also view the original English article)

Už jste někdy viděli krásný animovaný GIF, jehož smyčka byla bezchybná a říkali jste si, jestli byste jej mohli používat jako živou tapetu na vašem zařízení Android? Ano, můžete a v tomto návodu vám ukáži jak na to.

Úvod

Vytváření zajímavé a krásné živé tapety od nuly pouze pomocí matematiky a kódu pro generování grafiky může být zdlouhavé a časově náročné. Také je potřeba hodně kreativity. Na druhou stranu, vytvoření animovaného GIFu nebo hledání jednoho online je mnohem snažší. V tomto návodu se naučíte jak konvertovat jakýkoli animovaný GIF do živé tapety.

Předpoklady

Ujistěte se, že máte nejnovější verzi Android Studia. Můžete ji stáhnout na webové stránce Android Developer.

Ačkoliv jakýkoli animovaný GIF stačí, doporučil bych vám stáhnout dobrý cinemagraph. Cinemagraph není nic jiného než animovaný GIF - obvykle vytvořeny z videa - které je čisté smyčce. Mnoho dobrých můžete nalezt na Flickru.

Pro tento návod, používám cinemagraph vytvořený uživatelem Flickeru djandyw.com, protože je dostupný pod licencí Creative Commons.

1. Vytvořte nový projekt

Spusťte Android Studio, vytvořte nový projekt a pojmenujte projekt GIFWallpaper. Vytvořte unikátní jméno balíku pokud plánujete publikovat tuto aplikaci na Google Play.

Nastavte minimální SDK na API 8: Android 2.2 (Froyo).

Naše aplikace nebude mit Activity, takže vyberte Add No Activity a klikněte na Finish.

2. Popište wallpaper

Živý wallpaper potřebuje soubor, který ho popíše. Vytvořte nový XML soubor pojmenovaný res/xml/wallpaper.xml a nahraďte následující XML:

1
<?xml version="1.0" encoding="UTF-8"?>
2
<wallpaper 
3
  xmlns:android="http://schemas.android.com/apk/res/android"
4
    android:label="GIF Wallpaper"
5
    android:thumbnail="@drawable/ic_launcher">
6
</wallpaper>

Label a thumbnail jsou obzvlášť důležité, protože budou použity, když se wallpaper ukáže v seznamu wallpaperů k dispozici na vašem zařízení.

3. Upravte manifest

Pro provoz jako živá tapeta, naše aplikace potřebuje pouze jedno povolení android.permission.BIND_WALLPAPER.

Živá tapeta beží jako Service která může příjmat android.service.wallpaper.WallpaperService akci. Pojmenujte Service GIFWallpaperService a přidejte ji do projektového manifestu, AndroidManifest.xml.

1
<service
2
    android:name=".GIFWallpaperService"
3
    android:enabled="true"
4
    android:label="GIF Wallpaper"
5
    android:permission="android.permission.BIND_WALLPAPER" >
6
    <intent-filter>
7
        <action android:name="android.service.wallpaper.WallpaperService"/>
8
    </intent-filter>
9
    <meta-data
10
        android:name="android.service.wallpaper"
11
        android:resource="@xml/wallpaper" >
12
    </meta-data>
13
</service>

Další, zajistěte, že aplikaci je možné nainstalovat pouze na zařízeních, které podporují živé tapety, přidejte následující snippet do manifestu:

1
<uses-feature
2
    android:name="android.software.live_wallpaper"
3
    android:required="true" >
4
</uses-feature>

4. Přidejte animovaný GIF

Zkopírujte animovaný GIF, který jste stáhli z Flickru do projektového adresáře assets. Ja jsem pojmenoval GIF girl.gif.

5. Vytvořte službu

Vytvořte novou Java třídu a pojmenujte ji GIFWallpaperService.java. Tato třída by měla rozšířit WallpaperService třídu.

1
public class GIFWallpaperService extends WallpaperService {
2
    
3
}

Protože WallpaperService je abstraktní třída, musíte přepsat jejíc onCreateEngine metodu a vrátit instanci vašeho vlastního Engine, který bude vykreslovat snímky vašeho GIFu.

Abyste mohli použít animovaný GIF, musíte ho nejdříve konvertovat do Movie objektu. Můžete použít metodu decodeStream třídy Movie. Jakmile je objekt Movie vytvořen, předá ji jako parametr konstruktoru vašeho Engine.

Takhle by měla metoda onCreateEngine vypadat.

1
@Override
2
public WallpaperService.Engine onCreateEngine() {
3
    try {
4
  	Movie movie = Movie.decodeStream(
5
                getResources().getAssets().open("girl.gif"));
6
7
		return new GIFWallpaperEngine(movie);
8
	}catch(IOException e){
9
		Log.d("GIF", "Could not load asset");
10
		return null;
11
	}
12
}

6. Vytvořte Engine

Nyní začneme pracovat na Engine. Vytvořte třídu pojmenovanou GIFWallpaperEngine ve tříde GIFWallpaperService aby rozšiřovala WallpaperService.Engine.

Do této nové třídy přidejte následující:

  • frameDuration: tento integer reprezentuje zpoždění mezi překreslovacími operacemi. Hodnota 20 vám dá 50 snímků za vteřinu.
  • visible: tato bool hodnota dá vašemu enginu vědět, jestli je živá tapeta vidět na obrazovce. To je důležité, protože bychom neměli vykreslovat tapetu pokud není viditelná.
  • movie: Jedná se o animovaný GIF ve formě Movie objektu.
  • holder: Tohle odkazuje na SurfaceHolder objekt, k dispozici enginu. Musí být inicializovaný přepsáním metody onCreate.
  • handler: Tohle je objekt Handler, který bude použit pro spuštění Runnable, který je zodpovědný pro vykreslování tapety.

Vaše třída by nyní měla vypadat takto:

1
private class GIFWallpaperEngine extends WallpaperService.Engine {
2
    private final int frameDuration = 20;
3
4
    private SurfaceHolder holder;
5
    private Movie movie;
6
    private boolean visible;
7
    private Handler handler;
8
9
    public GIFWallpaperEngine(Movie movie) {
10
        this.movie = movie;
11
        handler = new Handler();
12
    }
13
14
    @Override
15
    public void onCreate(SurfaceHolder surfaceHolder) {
16
        super.onCreate(surfaceHolder);
17
        this.holder = surfaceHolder;
18
    }
19
}

Další vytvoříme metodu pojmenovanou draw která vykresluje obsah animovaného GIFu. Rozebereme si tuto metod:

  • Nejdříve zkontrolujeme jestli proměnná visible je nastavena na true. Budeme pokračovat pouze pokud tomu tak je.
  • Použijeme SurfaceHolder metodu lockCanvas abychom získali Canvas na které budeme kreslit.
  • Nakreslete rámeček animovaného GIFu na Canvas po změně velikosti a umístění.
  • Jakmile je kreslení hotové, předejte Canvas zpátky na SurfaceHolder.
  • Obnovte aktuální snímek animovaného GIFu pomocí metody setTime objektu Movie.
  • Zavolejte znovu metodu použitím handler po čekání na frameDuration v milisekundách.

Draw metoda není nikdy volána přímo. Vždy je volana pomocí Handler a Runnable objektu. Proto vytvoříme Runnable objekt pole třídy a zavoláme drawGIF.

Přidejte následující kód do třídy GIFWallpaperService:

1
private Runnable drawGIF = new Runnable() {
2
    public void run() {
3
        draw();
4
    }
5
};
6
7
private void draw() {
8
    if (visible) {
9
        Canvas canvas = holder.lockCanvas();
10
        canvas.save();
11
            // Adjust size and position so that

12
            // the image looks good on your screen

13
            canvas.scale(3f, 3f);
14
            movie.draw(canvas, -100, 0);
15
        canvas.restore();
16
        holder.unlockCanvasAndPost(canvas);
17
        movie.setTime((int) (System.currentTimeMillis() % movie.duration()));
18
19
        handler.removeCallbacks(drawGIF);
20
        handler.postDelayed(drawGIF, frameDuration);
21
    }
22
}

onVisibiltyChanged metoda je automaticky volána, když se změní viditelnost tapety. Musíme ji přepsat a na základě hodnoty argumentu visible, buď spustit nebo vypnout drawGIF. Metoda removeCallbacks z Handler je použita pro stopnutí jakéhokoli běžícího drawGIF.

1
@Override
2
public void onVisibilityChanged(boolean visible) {
3
    this.visible = visible;
4
    if (visible) {
5
        handler.post(drawGIF);
6
    } else {
7
        handler.removeCallbacks(drawGIF);
8
    }
9
}

Konečně, přepište onDestroy metodu z Engine pro stopnutí jakéhokoli trvajcího drawGIF pokud je tapeta deaktivována.

1
@Override
2
public void onDestroy() {
3
    super.onDestroy();
4
    handler.removeCallbacks(drawGIF);
5
}

7. Kompilace a instalace

Váše tapeta je nyní připravena. Zkompilujte ji a nainstalujte na vaše Android zařízení. Jakmile je nainstalována, měli byste ji najít v seznamu dostupných tapet.

Většina launcherů vám dá možnost změnit tapetu po gestu dlouhého stisknutí. Jinak můžete jít do nastavení displeje a změnit nastavení.

Pokud je GIF moc malý nebo ve špatné pozici, můžete jít zpátky do metody draw a upravit velikost a pozici.

Shrnutí

Nyní víte jak použít animovaný GIF k vytvoření živého wallpaperu. Nebojte se experimentovat s dalšími GIFy. Pokud plánujete publikovat vaši živou tapetu na Google Play, ujistěte se, že máte povolení od autora animovaného GIFu, pro komerční použití. Navštivte Android Developer website abyste zjistili více o tříde WallpaperService.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.