IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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.

Hra Šibenica pre Android - Programovanie Android aplikácií v Jave

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žka TheGif/).

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:

https://github.com/koush/ion

  • 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).
Použitie je opäť veľmi jednoduché.
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.


 

Predchádzajúci článok
Android programovanie - Welcome screen animácie kalkulačky
Všetky články v sekcii
Programovanie Android aplikácií v Jave
Preskočiť článok
(neodporúčame)
Šibenice pre Android - Analýza a návrh aplikácie
Článok pre vás napísal Jiří Frank
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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
Aktivity