Java týden Body zdarma
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!

Lekce 8 - Šibenice pro Android - Animace, Shared preferences a Intent

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Android programování - Welcome screen animace kalkulačky, jsme dokončili kalkulačku pro Android a přidali do ni uvítací animaci. V dnešním tutoriá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ší aktivity (v něm se bude zobrazovat GIF).
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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ý");

Nevýhody formátu GIF

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 aktivity 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í setkali, 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

Animace 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 imv=(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:

imv.setBackgroundDrawable(animace);

Určíme, že se má animace opakovat donekoneč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 skóre 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.apply();
/* Nikdy nesmíme zapomenout použít apply, 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é aktivity, 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 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)

Příště, v lekci Šibenice pro Android - Analýza a návrh aplikace, se budeme věnovat požadavkům a návrhu aplikace.


 

Stáhnout

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

 

 

Článek pro vás napsal Jiří Frank
Avatar
Jak se ti líbí článek?
4 hlasů
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
Předchozí článek
Android programování - Welcome screen animace kalkulačky
Všechny články v sekci
Programování Android aplikací v Javě
Miniatura
Následující článek
Šibenice pro Android - Analýza a návrh aplikace
Aktivity (4)

 

 

Komentáře

Avatar
Matěj Kripner
Redaktor
Avatar
Matěj Kripner:22.5.2016 9:09

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.5.2016 9:09
Give me a deep enough pipeline, and I shall move the world.
Avatar
Jiří Frank
Redaktor
Avatar
Odpovídá na Matěj Kripner
Jiří Frank:24.5.2016 13:37

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.5.2016 13:37
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
virlupus.soft
Redaktor
Avatar
virlupus.soft:18. června 22:28

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.

Jenom nostalgické pousmání

640 kB je dost pro všechny

Bill Gates o MS DOS

 
Odpovědět 18. června 22:28
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 3 zpráv z 3.