8. díl - Šibenice pro Android - Animace, Shared preferences a Intent

Java Android Šibenice pro Android - Animace, Shared preferences a Intent

V minulém tutoriálu jsme dokončili kalkulačku pro Android a přidali do ni uvítací animaci. V dnešním dílu započneme práci na pokročilejší aplikaci, kterou bude hra šibenice.

Hra Šibenice pro Android

U této aplikace se setkáme s několika novými věcmi, a proto se jimi budeme na úvod alespoň okrajově zabývat.

Animace

Pro vytvoření základních animací pro Android máme několik možností. Mnoho z vás jistě napadne použít animovaný GIF.

Animovaný GIF

GIF jako takový v současném Androidu nelze animovat v současných widgetech (ImageView, SurfaceView) bez pomocných kódů či knihoven. Máme spoustu možností jak GIF animovat.

Jeff Jones

Jednoduchý návod i s kódem ke stažení je v archivu pod článkem (složka TheGif).

Součástí balíku jsou tedy dva soubory s Java kódem. GifDecode.java a GifRun.java. Jedná se o dvě třídy. První je pro dekódování GIFu (GifDecode) a druhá pro spuštění samotné animace (GifRun).

Oba zmíněné soubory stačí nahrát do složky, kde jsou naše Java kódy. Tento postup funguje tak, že do paměti postupně načítá jednotlivé snímky a zobrazuje je ve Widgetu SurfaceView. Použití vypadá následovně.

SurfaceView v = (SurfaceView) findViewById(R.id.surfaceView1);
GifRun w = new  GifRun();
w.LoadGiff(v, this, R.drawable.OBRAZEK);

Opět platí, že při psaní kódu se Android Studio samo postará o import dané třídy.

ION

ION je zajímavá knihovna, která nám umožní animovat GIF, který je nahraný na internetové stránce. Celou knihovnu stáhneme zde:

https://github.com/koush/ion

  • stáhneme soubor ion.jar,
  • Nahrajeme ho do složky libs,
  • klikneme pravým tlačítkem myši a zvolíme Import As Library,
  • do Manifestu přidáme <uses-permission android:name="android.permission.internet"/>, ten je nejvhodnější umístit nad poslední tag </manifest>,
  • vložíme ImageView do naší activity (v něm se bude zobrazovat GIF).

Použití je opět velmi jednoduché.

ImageView anGIF = (ImageView) findViewById(R.id.JmenoImgView);
Ion.with(gif).load("Odkaz na stranku, kde je GIF nahraný");
GIF nevýhody

Obecně platí, že používat GIF není ta nejlepší volba. Často dochází k různým problémům s pamětí a hlavně nestabilitou. Musíme si uvědomit, že Android řeší stav activity jako je pozastavení a uspání. Pokud dojde například k pozastavení, přichází na scénu problémy, které se týkají chybějících hodnot v proměnných, přetékání paměti atd.

Dalším problémem je paměť RAM jako taková. Není nic neobvyklého, když použijeme pár animací o více snímcích (v řádech desítek) a nároky na RAM stoupnou i na 150 MB. To limituje některé uživatele slabších zařízení a může to způsobovat pády aplikace kvůli nedostatku paměti RAM.

Old school animace

Tzv. old school animace je nejstarší animace, kterou na Androidu máme. Jedná se o jednoduchou animaci, která operuje s potomky třídy View (tedy ImageView a SurfaceView). Můžeme animovat například různé posouvání a otáčení obrázků.

Patří sem AnimationDrawable animace a Tween animace. Tween animace je definovaná v xml souboru a již jsme se s ní setkaly, viz bonusová kapitola o úvodní aktivitě se školním logem.

<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <alpha
        android:fromAlpha="0.5"
        android:toAlpha="1.0"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:duration="2000"
        android:repeatCount="0"/>
    <translate
        android:fromYDelta="-50%p"
        android:toYDelta="0"
        android:duration="3000"
        android:startOffset="1000"
        android:repeatCount="0"/>
</set>
Nevýhody

Je pouze ve 2D.

Reálně existuje pouze na poloze, kde je View vykreslené. To znamená, že pokud budeme chtít vytvořit obrázek, který bude fungovat jako tlačítko a bude se pohybovat, nelze na něj tapnout při animaci, bude reagovat na tap pouze na poloze „0“, což je původní poloha vykreslení View.

AnimationDrawable

Jedná se o jednoduchý objekt, do kterého naimportujeme jednotlivé snímky, které lze snadno animovat ve widgetu ImageView, stylem snímek za snímkem. Na rozdíl od "mechanického" rozebrání a zanimovaní GIFu je šetrnější k paměti. To ale platí jen do určité míry, u animací v řadech +- 50 snímků začíná docházet ke zmíněným problémům s pamětí, zejména u přechodů mezi aktivitami.

AnimationDrawable animace = new AnimationDrawable();
ImageView IMW=(ImageView) findViewById(R.id.imageView4);

animace.addFrame(getResources().getDrawable(R.drawable.Obrazek1),125);
animace.addFrame(getResources().getDrawable(R.drawable.Obrazek1),125);
...

Výše je vidět přidání jednotlivých snímků (Obrázek1,2...). Poslední číslo (125) značí dobu v ms, jak dlouho se bude daný snímek zobrazovat, než ho vystřídá další.

Nastavíme objekt animace jako pozadí našeho ImageView:

IMW.setBackgroundDrawable(animace);

Určíme, že se má animace opakovat do nekonečna. Pokud nenastavíme, defaultní hodnota je false.

animace.setOneShot(true);

Spustíme animaci:

animace.start();

http://developer.android.com/…rawable.html

V referencích najdeme spoustu dalších informací a možností.

Pokud jsme porozuměli základním způsobům jak animovat, můžeme se pustit dál.

SharedPreferences

V této aplikaci budeme muset nějakým způsobem ukládat score a k tomu nám poslouží právě SharedPreferences, neboli sdílená nastavení. Je to nejjednodušší způsob jak uložit data. Nejčastěji se používá k uložení dat pro nastavení aplikace atd. Samotná data se ukládají do xml souboru, který má každá aplikace k dispozici.

Použití je velmi jednoduché.

SharedPreferences pref = getSharedPreferences("NAZEV_DAT", MODE_PRIVATE);
/* Vytvoříme objekt pref, NAZEV_DAT nahradíme jakýmkoliv názvem, který bude specifikovat, o jaká data se jedná. Podobně jako název tabulky v databázi. MODE specifikuje, zda má být tato SharedPreference přístupna i dalším aplikacím */
String JmenoStringu = pref.getString("NAZEV_DAT ", "DATA NEJSOU");
/* Takto probíhá čtení, do stringu JmenoStringu si načteme data, které jsou uložená v SharedPreference NAZEV_DAT, pokud tam žádné data uložena nejsou, uloží se string „DATA NEJSOU“ */
SharedPreferences.Editor editor = preferences.edit();
/* Pokud chceme editovat, musíme vytvořit editor */
editor.putString("NAZEV_DAT", "data která se mají uložit");
// takto data vložíme do SharedPreference

editor.commit();
/* Nikdy nesmíme zapomenout použít commit, ten uloží změny. Pokud bychom to neudělali, žádná data se neuloží. */

Intent

Vzhledem k tomu, že v této aplikaci budeme často měnit jednotlivé activity, je třeba správně pochopit co intent je.

Můžeme si ho představit jako „přepravní loďku s přihrádkami“ mezi jednotlivými aktivitami.

Pokud chceme zapnout novou aktivitu, řekneme Androidu pomocí intentu jaká třída (a tím pádem aktivita) se má spustit.

Také můžeme „protlačit“ data z activity do activity.

Intent NazevIntentu = new Intent(this, TridaCoSeSpusti.class);
//vytvoření objektu intent
NazevIntentu.putExtra("NAZEV_PROMĚNNÉ", hodnota_proměnné);
/* přidáme nějaké data navíc, které chceme protlačit do nově spuštěné activity. */
startActivity(NazevIntentu);
//spuštění intentu (přechod do nové activity)

Příště se budeme věnovat požadavkům a návrhu aplikace.


 

Stáhnout

Staženo 86x (5.15 MB)
Aplikace je včetně zdrojových kódů v jazyce Android Java

 

  Aktivity (1)

Článek pro vás napsal Jiří Hlavík
Avatar
Autor se věnuje programování v C# a vývoji aplikací pro platformu Android a dalším věcem spojeným s Android OS

Jak se ti líbí článek?
Celkem (2 hlasů) :
4.54.54.54.54.5


 



 

 

Komentáře

Avatar
Matěj Kripner
Redaktor
Avatar
Matěj Kripner:

Určíme, že se má animace opakovat do nekonečna.

Myslím, že je tam chyba - argument true nastaví animaci jen pro jedno opakování.

Odpovědět 22. května 9:09
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Jiří Hlavík
Redaktor
Avatar
Odpovídá na Matěj Kripner
Jiří Hlavík:

Ahoj :D jasně, máš pravdu. V jedné verzi byl do nekonečna se houpající panáček a v druhé ne :D tak asi došlo k chybě kvůli neaktualizování textu.. Přiznávám, že sem tam nějaká nejasnost tady je no.. Už cca půl roku slibuji že se na to podívám a vše poupravím :D Vzhledem k tomu že studuji a pracuji tak opravdu nemám čas ovšem teď bych si ho trochu najít mohl a konečně vše opravit :D.
Mám v plánu i nějaké články značně poupravit, protože v době kdy jsem psal tyto články jsem neměl ve srovnání se současným stavem takřka žádné zkušenosti :D
Jinak ještě jednou díky moc za reakci ;)

 
Odpovědět  +1 24. května 13:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.