Jak na 9-patch obrázek stahovaný ze sítě sítí

17. srpen 2013

Asi všichni, kteří se pohybují ve světě Androidu se již setkali s pojmem 9-patch. Jedná se obrázek v formátu PNG, rozšířený o možnost definovat zóny pro jeho zvětšování či zmenšování a zónu, ve které se má nacházet budoucí obsah.

Vzhledem k veliké fragmentaci zařízení s operačním systémem Android, různým velikostem obrazovek, rozdílnému rozlišení a hustotě pixelů (viz například zde on.fb.me/1eRFVjW) se jedná o velmi užitečnou vlastnost. Nová verze Androidu 4.3 navíc přináší možnost definovat hranice obrázku i pro jeho zarovnávání s okolím (viz http://bit.ly/16S47zZ).

V praxi to celá funguje tak, že kolem výchozího obrázku se nakreslí jedno-pixelový průhledný rámeček. V tomto rámečku se v horní a levé části černou barvou vyznačí oblasti, které se mají opakovat či vypouštět v závislosti na tom, jak se bude budoucí obrázek roztahovat či smršťovat. V dolní a pravé části rámečku se vyznačí oblast, ve které má být umístěn budoucí obsah.

Pro snadné vytváření 9-patch obrázků je určen nástroj Draw 9-patch, který je součástí Android SDK (naleznete jej v adresáři \android-sdk\tools\). Nástroj vytvoří soubor s příponou 9.png, který můžete rovnou použít ve svém projektu. Vše však funguje jen do doby, než se rozhodnete, že obrázek nebude součástí projektu, ale že si jej aplikace stáhnete po svém spuštění ze serveru. Důvodem k takovému kroku jsou nejčastěji změny grafického rozhraní, které si zákazník přeje provádět sám nebo bez nutnosti opakovaného sestavování aplikace a jejího umístění na aplikační obchody Google Play nebo SamsungApps.

Pokud je přípona obrázku 9-patch rozpoznána během sestavení aplikace, je soubor dodatečně upraven (compiled). Toto rozpoznání probíhá pouze v adresáři drawable a Android bude po spuštění správně zobrazovat pouze takto upravené obrázky. Proto nelze ke stažení ze serveru použít obrázky, které jsou výstupem z Draw 9-patch nebo jiného grafického editoru. Obrázky určené ke stažení lze samozřejmě po vytvoření apk archívu ručně vykopírovat, jde ovšem o poněkud těžkopádný způsob. Naštěstí existuje rychlejší varianta, jak 9-patch zpracovávat, a to hromadně i jednotlivě z příkazové řádky pomocí nástroje Android Asset Packaging Tool (aapt):

aapt c[runch] [-v] -S input-folder -C output-folder
aapt s[ingleCrunch] [-v] -i input-file -o output-file

Pro stažení souboru již není potřeba nic měnit, třída BitmapFactory ho zpracuje sama. K ověření, zdali se opravdu jedná o 9-patch obrázek lze provést následující kontrolu:

Bitmap bitmap = BitmapFactory.decodeStream(stream);
byte[] chunks = bitmap.getNinePatchChunk();
boolean result = NinePatch.isNinePatchChunk(chunks);

Přihlašte se k odběru novinek