Android are o serie de caracteristici de personalizare pentru a ajuta utilizatorii să personalizeze multe aspecte ale experienței utilizatorilor dispozitivului. Una dintre aceste caracteristici este tapet live. Imaginile de fundal vii nu rămân sub formă de imagini statice, ci au caracteristici interactive. Aflați cum să creați un fundal live în acest tutorial!
O imagine de fundal live, pe Android, este utilizată în mod normal ca fundal pe ecranul de pornire care animă sau se schimbă în timp într-un fel. Dacă aveți un dispozitiv Android, probabil că ați văzut câteva wallpapere vii încorporate, cum ar fi cea în care frunzele par să cadă în apă risipitoare.
În calitate de dezvoltator, puteți crea și publica imagini de fundal vii. Procesul nu este deosebit de dificil. Realizarea unei imagini de fundal vii, care este fascinantă și de dorit în timp ce nu se scurge bateria dispozitivului utilizatorului, este totuși o provocare. În acest tutorial, vă vom urmări procesul de creare a unei imagini de fundal vii care se comportă. :)
Recent, v-am arătat cum să utilizați RenderScript. Rezultatul final al acestui tutorial a fost un efect simplu de cădere a zăpezii. Să transformăm efectul într-un tapet live.
Codul open source pentru acest tutorial este disponibil pentru descărcare. Vă recomandăm să o utilizați pentru a vă urma. Lista de coduri din acest tutorial nu include întregul conținut al fiecărui fișier și nu acoperă configurarea proiectului sau codul acoperit de tutorialele anterioare.
Ai putea spune că un tapet live este doar un serviciu. La urma urmei, pentru a crea un tapet live, pur și simplu se extind din clasa WallpaperService și implementează o singură metodă, adesea cu o singură linie de cod, și apoi adaugă definiția serviciului dvs. în fișierul manifest.
Să vedem cum arată asta. Iată WallpaperService:
clasa publică FallingSnowWallpaperService extinde WallpaperService @Override public Engine onCreateEngine () returnează FallingSnowWallpaperEngine ();
Și ați terminat! Bine, nu chiar. Cea mai mare parte a lucrării unui tapet live are loc într-o implementare WallpaperService.Engine. Aici puteți răspunde la apelurile de apel, cum ar fi onSurfaceChanged () și onSurfaceCreated (). Suna familiar? Acestea sunt foarte asemănătoare cu apelurile de apel pe care le-ați văzut când implementați un obiect View sau alt obiect bazat pe suprafață.
Și acum realitatea imaginilor de fundal vii este dezvăluită: atunci când implementați WallpaperService.Engine, tot ceea ce faceți este să trageți la o Suprafață furnizată (printr-un SurfaceHolder). Este aproape atât de simplu. Înainte de a ajunge la punerea în aplicare a WallpaperService.Engine, să ne uităm la unele din celelalte aspecte legate de configurare.
Deoarece un tapet live este un serviciu, trebuie să înregistrați serviciul în fișierul manifest. Înregistrarea serviciului poate arăta cam așa:
Există câteva lucruri de remarcat aici. În primul rând, utilizarea acestui serviciu necesită permisiunea BIND_WALLPAPER (adică o altă aplicație care utilizează acest tapet ar necesita permisiunea BIND_WALLPAPER ca intrare permisiune utilizări în manifestarea lor). În al doilea rând, filtrul de intenție este un șir similar cu clasa de bază. În cele din urmă, metadatele indică un fișier XML. Acest fișier XML, definit de dezvoltator, oferă o configurație suplimentară pentru monitor. Iată fișierul nostru XML pentru setările de monitorizare live numite fallingsnow_wp:
Aici, pur și simplu folosim pictograma lansatorului obișnuit ca miniatură și indicăm un șir care va apărea ca descriere în lista de imagini de fundal. Dacă monitorul viu are nevoie de configurare, indicați-l cu proprietatea android: settingsActivity.
În cele din urmă, înapoi în fișierul manifest, nu uitați să setați funcțiile de utilizare pentru android.software.live_wallpaper:
Acum, că lucrurile plictisitoare, dar critice, sunt în cale, să ne întoarcem la lucrarea reală: creând clasa WallpaperService.Engine. Deoarece avem deja un fișier RenderScript pentru a face niște animații, tot ce trebuie să faceți este să conectați redarea la noua suprafață. Metoda onSurfaceCreated () a motorului este un loc excelent pentru a crea obiectul RenderScriptGL de care avem nevoie:
@Override public void onSurfaceCreated (suport SuprafațăHolder) super.onSurfaceCreated (suport); RenderScriptGL.SurfaceConfig suprafațăConfig = nou RenderScriptGL.SurfaceConfig (); mRenderScriptGL = noul RenderScriptGL (FallingSnowWallpaperService.this, surfaceConfig); // utilizați un nivel scăzut pentru imagini de fundal mRenderScriptGL.setPriority (RenderScript.Priority.LOW);
De asemenea, setăm prioritatea de redare la nivel scăzut - acesta este un monitor de monitorizare live și nu un motor critic de joc sau de rendering. Nu ar trebui să încetinească nimic altceva în sistem.
Curățați acest lucru în metoda onSurfaceDestroyed ():
@Override public void onSurfaceDestroyed (Suprafață Holder) super.onSurfaceDestroyed (titular); dacă (mSnowRS! = null) mSnowRS.stop (); mSnowRS = null; dacă (mRenderScriptGL! = null) mRenderScriptGL.destroy (); mRenderScriptGL = null;
Metoda onSurfaceChanged () este un loc excelent pentru inițializarea clasei RenderScript. Acesta este primul loc unde găsiți detalii despre ceea ce veți face, cum ar fi lățimea și înălțimea. De asemenea, aceasta este locul unde am setat suprafața pentru clasa RenderScriptGL.
@Override public void onSurfaceChanged (suport SurfaceHolder, format int, lățime int, int înălțime) super.onSurfaceChanged (suport, format, lățime, înălțime); dacă (mRenderScriptGL! = null) mRenderScriptGL.setSurface (suport, lățime, înălțime); dacă (mSnowRS == null) mSnowRS = nou SnowRS (lățime, înălțime); mSnowRS.init (mRenderScriptGL, getResources (), isPreview ()); mSnowRS.start ();
Este o idee bună să opriți tapetul când nu este vizibil.
@Override public void onVisibilityChanged (vizibil boolean) super.onVisibilityChanged (visible); dacă (mSnowRS == null) if (vizibil) mSnowRS.start (); altceva mSnowRS.stop ();
Si asta e. Wallpaper-ul se rotește. Sau animă. Sau face orice vrei tu să faci.
Doriți să răspundeți la robinete? Depășiți metoda onCommand () a clasei WallpaperService.Engine.
Doriți să ajustați pozițiile atunci când utilizatorul trece prin ecranul inițial? Depășiți metoda OnOffsetsChanged () a clasei WallpaperService.Engine.
Doriți să aflați dacă utilizatorul vizualizează previzualizarea înainte de a seta fundalul? Apelați metoda isPreview () a clasei WallpaperService.Engine și verificați rezultatele.
Implementarea completă a clasei noastre WallpaperService.Engine poate fi găsită în FallSnowWallpaperService.java a proiectului open source.
Să aruncăm o privire la Live Wallpaper:
Ar trebui să pară familiar; este același lucru pe care l-am văzut în activitatea RenderScript.
Imaginile de fundal vii reprezintă un loc minunat pentru a face efecte grafice foarte eficiente și de mare performanță. Dar trebuie să faceți acest lucru realizând că utilizatorul nu este neapărat așezat acolo vizionând un demo (știi, ca și cei de la scene.org). Ceea ce înseamnă că este posibil să fie nevoie să reduceți ratele de cadre, să reduceți pixelii, numărul de poligoane sau detaliile texturii pentru a păstra interesul pentru monitor, dar nu și pentru CPU, GPU și baterie. Dacă utilizatorii descoperă că monitorul dvs. live le mănâncă, face ca aplicația dvs. să pară rău și face ca dispozitivul să pară slab, cu o durată de viață redusă a bateriei. O experiență neplăcută cu un dispozitiv Android îi determină pe toți dezvoltatorii să sufere un rap.
Afișarea și activitatea demo (din tutorialul anterior) sunt încă disponibile atunci când se lansează aplicația. În loc să-l eliminați, de ce să nu adăugați doar un handler, astfel încât atunci când un utilizator face clic pe el, setările de monitorizare live vor apărea astfel încât utilizatorul să poată selecta tapetul live?
public void onWallpaperSettings (Vedere vedere) Intentent wallpaperSettings = Intent intent (Intent.ACTION_SET_WALLPAPER); startActivity (wallpaperSettings);
De ce nu, într-adevăr! A fost ușor. În orice vizualizare pe care se poate da clic, trebuie doar să adăugați proprietatea android: onClick = "onWallpaperSettings" și sunteți bine de făcut.
Iată o imagine statică:
Imaginile de fundal vii reprezintă o modalitate convenabilă de a vă extinde aplicația dincolo de limitele sale tipice. Ai un joc de rol? Faceți câteva wallpapere personalizate live cu personajele principale. Doar asigurați-vă că utilizați bun-simț atunci când faceți redarea pe ecran, astfel încât experiența utilizatorului cu dispozitivul lor să nu sufere.
Spuneți-ne ce imagini de fundal vii se construiesc în comentarii!
Dezvoltatorii mobili Lauren Darcey și Shane Conder au coautorizat mai multe cărți despre dezvoltarea Android: o carte de programare în profunzime intitulată Dezvoltarea aplicațiilor fără fir Android și Sams Învățați-vă dezvoltarea de aplicații Android în 24 de ore. Când nu scriu, își petrec timpul dezvoltând software-ul mobil la compania lor și oferind servicii de consultanță. Acestea pot fi obținute prin e-mail la androidwirelessdev@[email protected], prin intermediul blogului lor la androidbook.blogspot.com, și pe Twitter @ androidwireless.