8. diel - Šibenice pre Android - Animácie, Shared preferences a Intent
V minulej lekcii, Android programovanie - Welcome screen animácie kalkulačky , sme dokončili kalkulačku pre Android a pridali do nej uvítací animáciu. V dnešnom tutoriále začneme prácu na pokročilejšie aplikáciu, ktorú bude hra šibenice.
U tejto aplikácie sa stretneme s niekoľkými novými vecami, a preto sa nimi budeme na úvod aspoň okrajovo zaoberať.
Animácie
Pre vytvorenie základných animácií pre Android máme niekoľko možností. Mnoho z vás iste napadne použiť animovaný GIF.
Animovaný GIF
GIF ako taký v súčasnom Androide nedá animovať v súčasných
miniaplikáciách (ImageView
, SurfaceView
) bez
pomocných kódov či knižníc. Máme veľa možností ako GIF animovať.
Jeff Jones
Jednoduchý návod is kódom na prevzatie je v archíve pod článkom (zložkaTheGif/
).
Súčasťou balíka sú teda dva súbory s Java kódom:
GifDecode.java
a GifRun.java
. Jedná sa o dve triedy.
Prvá je pre dekódovanie GIFu (GifDecode
) a druhá pre spustenie
samotnej animácie (GifRun
).
Oba spomínané súbory stačí nahrať do priečinka, kde sú naše Java
kódy. Tento postup funguje tak, že do pamäti postupne načíta jednotlivé
snímky a zobrazuje ich vo Widget SurfaceView
. Použitie vyzerá
nasledovne.
SurfaceView v = (SurfaceView) findViewById(R.id.surfaceView1); GifRun w = new GifRun(); w.LoadGiff(v, this, R.drawable.OBRAZEK);
Opäť platí, že pri písaní kódu sa Android Studio samo postará o import danej triedy.
ION
ION je zaujímavá knižnica, ktorá nám umožní animovať GIF, ktorý je nahraný na internetovej stránke. Celú knižnicu stiahneme tu:
- stiahneme súbor
ion.jar
, - Nahráme ho do zložky
libs/
, - klikneme pravým tlačidlom myši a zvolíme Import As Library,
- do Manifestu pridáme
<uses-permission android:name="android.permission.internet"/>
, ten je najvhodnejšie umiestniť nad posledný tag</manifest>
, - vložíme
ImageView
do našej aktivity (v ňom sa bude zobrazovať GIF).
ImageView anGIF = (ImageView) findViewById(R.id.JmenoImgView); Ion.with(gif).load("Odkaz na stranku, kde je GIF nahraný");
Nevýhody formáte GIF
Všeobecne platí, že používať GIF nie je tá najlepšia voľba. Často dochádza k rôznym problémom s pamäťou a hlavne nestabilitou. Musíme si uvedomiť, že Android rieši stav aktivity ako je pozastavenie a uspanie. Pokiaľ dôjde napríklad k pozastaveniu, prichádza na scénu problémy, ktoré sa týkajú chýbajúcich hodnôt v premenných, pretekania pamäte atď.
Ďalším problémom je pamäť RAM ako taká. Nie je nič neobvyklé, keď použijeme pár animácií o viac snímkach (v rádoch desiatok) a nároky na RAM stúpnu aj na 150 MB. To limituje niektorých užívateľov slabších zariadení a môže to spôsobovať pády aplikácie kvôli nedostatku pamäte RAM.
Old school animácie
Tzv. old school animácie je najstaršia animácia, ktorú na Androidu máme.
Ide o jednoduchú animáciu, ktorá operuje s potomkami triedy View
(teda ImageView
a SurfaceView
). Môžeme animovať
napríklad rôzne posúvanie a otáčanie obrázkov.
Patrí sem AnimationDrawable
animácie a Tween
animácie. Tween
animácie je definovaná v XML súboru a už sme
sa s ňou stretli, pozri bonusová kapitolu o úvodnej aktivite so školským
logom:
<?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
Animácia je len v 2D.
Reálne existuje iba na polohe, kde je View
vykreslené. To
znamená, že ak budeme chcieť vytvoriť obrázok, ktorý bude fungovať ako
tlačidlo a bude sa pohybovať, nemožno naň tapnúť pri animácii, bude
reagovať na tap iba na polohe 0
, čo je pôvodný poloha
vykreslenie View
.
AnimationDrawable
Ide o jednoduchý objekt, do ktorého importujete jednotlivé snímky, ktoré
možno ľahko animovať vo widgetu ImageView
, štýlom snímku za
snímkou. Na rozdiel od "mechanického" rozobratie a zanimovaní GIFu je
šetrnejší k pamäti. To ale platí len do určitej miery, u animácií v
radoch + - 50 snímok začína dochádzať k spomínaným problémom s
pamäťou, najmä u prechodov medzi aktivitami.
AnimationDrawable animace = new AnimationDrawable(); ImageView imv=(ImageView) findViewById(R.id.imageView4); animace.addFrame(getResources().getDrawable(R.drawable.Obrazek1),125); animace.addFrame(getResources().getDrawable(R.drawable.Obrazek1),125); ...
Vyššie je vidieť pridanie jednotlivých snímok (Obrázok 1, 2 ...). Posledné číslo (125) značí dobu v ms, ako dlho sa bude tento záber zobrazovať, než ho vystrieda ďalší.
Nastavíme objekt animácie ako pozadie nášho ImageView
:
imv.setBackgroundDrawable(animace);
Určíme, že sa má animácia opakovať donekonečna. Ak nenastavíte,
defaultná hodnota je false
:
animace.setOneShot(true);
Spustíme animáciu:
animace.start();
http://developer.android.com/...rawable.html
V referenciách nájdeme veľa ďalších informácií a možností.
Ak sme porozumeli základným spôsobom ako animovať, môžeme sa pustiť ďalej.
SharedPreferences
V tejto aplikácii budeme musieť nejakým spôsobom ukladať skóre a na to
nám poslúži práve SharedPreferences
, čiže zdieľaná
nastavenia. Je to najjednoduchší spôsob ako uložiť dáta. Najčastejšie sa
používa na uloženie dát pre nastavenie aplikácie atď. Samotná dáta sa
ukladajú do XML súboru, ktorý má každá aplikácia k dispozícii.
Použitie je veľmi 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.apply(); /* Nikdy nesmíme zapomenout použít apply, ten uloží změny. Pokud bychom to neudělali, žádná data se neuloží. */
Intent
Vzhľadom k tomu, že v tejto aplikácii budeme často meniť jednotlivé aktivity, je potrebné správne pochopiť čo intent je. Môžeme si ho predstaviť ako "prepravný loďku s priehradkami" medzi jednotlivými aktivitami. Ak chceme zapnúť novú aktivitu, povieme Androidu pomocou Intent aká trieda (a tým pádom aktivita) sa má spustiť.
Tiež môžeme "pretlačiť" dáta z aktivity do aktivity:
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)
Nabudúce, v lekcii Šibenice pre Android - Analýza a návrh aplikácie , sa budeme venovať požiadavkám a návrhu aplikácie.