En levende tapetskabelon med bare knogler til Android

En TechRepublic-læser foreslog, at jeg laver en tutorial til at oprette et levende tapet. Live-tapet var en funktion, der blev tilføjet i Android 2.1, der tillader, at telefonens faktiske baggrund eller skrivebord fungerer meget som et program. Det kan animere, foretage systemopkald og interagere med brugeren. Et godt eksempel på funktionen i handling er standard Nexus tapet, der begyndte levering med Nexus One. Påstås at være et "kig i et neuralt netværk", animerer Nexus live-tapetet ( figur A ) en række farverige spor, der ændrer sig som svar på, at brugeren berører displayet på telefonen. Figur A

Nexus levende tapet

Det er op til udviklerens fantasi at bestemme, hvad et givet levende tapet gør. Android-dokumentationen til live baggrunde er grundig og inkluderer endda en demonstration. Fordi det arkitektonisk adskiller sig væsentligt fra en standard Android-applikation, har Google leveret en prøvekode såvel som de fleste af de øvelser, der leveres på nettet, ofte en smule skræmmende ved første øjekast.

Mit mål med at skrive denne tutorial er ikke at lave et stjernestykke levende tapet, men snarere at stribe den krævede kode til det blotte minimum, hvorved afmystificering af processen og forhåbentlig hoppe af et antal begyndende Android-programmerere, som måske ryger væk fra kodning af et levende tapet i fortiden. Overvej hvad vi vil oprette i dette indlæg og afslutte i næste uges indlæg mindre af en afsluttet ansøgning og mere af en skabelon til dine egne live tapetprojekter.

Du kan downloade kildekoden, der følger med denne tutorial her. Vær særlig opmærksom på kravene til projektopsætning, da de afviger fra normen flere steder. Klar til at komme i gang?

1. Opret en ny Android-applikation i Eclipse. Sørg for at målrette mod Android 2.1 eller nyere. Lad ikke projektguiden automatisk oprette en aktivitet til dette projekt.

2. Opret en XML-mappe i mappen / res til dit nye projekt. Tilføj en ny fil kaldet wallpaper.xml i mappen.

 wallpaper.xml 

"1.0" kodning = "UTF-8" ?>

xmlns: android = http://schemas.android.com/apk/res/android

android: thumbnail = "@ tegnbar / ikon"

android: beskrivelse = "@ streng / appnavn" />

3. Konfigurer din AndroidManifest.xml-fil korrekt. Manifestet for et levende tapet er forskelligt fra de fleste standardapplikationer, vi opretter i denne blog, og endda forskellig fra en standardtjeneste (den baseklasse, som levende tapeter stammer fra). Der er en række muligheder til rådighed for levende tapeter, men i øjeblikket har jeg forsøgt at whitle indholdet til kun det væsentlige.

 AndroidManifest.xml 

"1.0" encoding = "utf-8" ?>

"Http://schemas.android.com/apk/res/android"

package = "com.authorwjf.live_wallpaper_p1" android: versionCode = "1"

android: versionName = "1.0" >
 "TR Demo Live Wallpaper" android: icon = "@ drawable / icon" > 
 "TR Demo Live Wallpaper" 
 android: name = ".DemoWallpaperService" 
 android: tilladelse = "android.permission.BIND_WALLPAPER" > 
 "android.service.wallpaper.WallpaperService" /> 
 "Android.service.wallpaper" 
 android: resource = "@ xml / tapet" /> 
 "7" /> 
 "android.software.live_wallpaper" /> 

4. Med VVS på plads nu kan vi implementere vores /src/DemoWallpaperService.java-fil. Vi starter med at oprette den ydre klasse, der udvider Android WallpaperService-klassen.

 DemoWallpaperService.java- pakke com.authorwjf.live_wallpaper_p1; 
 import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.service.wallpaper.WallpaperService; import android.view.SurfaceHolder; 
 public class DemoWallpaperService udvider WallpaperService { 
 @Override public Engine onCreateEngine () { return new DemoWallpaperEngine (); } 
 } 

5. Vi vil tilføje en indre klasse, der genererer vores afledte tapetmotor. Fordi tjenesten konstant kører, er det meget vigtigt, at vi håndterer livscyklusbegivenheder korrekt.

 DemoWallpaperService.java privat klasse DemoWallpaperEngine udvider Engine {  privat boolsk mVisible = falsk ; privat endelig Handler mHandler = ny Handler (); privat final Runnable mUpdateDisplay = new Runnable () { 

@Override

offentlig annullering () {

tegne();

}};
 @Override offentligt tomrum påVisibilityChanged ( boolsk synlig) { 

mVisible = synlig;

hvis (synlig) {

tegne();

} andet {

mHandler.removeCallbacks (mUpdateDisplay);

}

}
 @Override offentligt tomrum på SurfaceChanged (SurfaceHolder holder, int- format, int bredde, int højde) { 

tegne();

}
 @Override public void onSurfaceDestroyed (SurfaceHolder holder) { super .onSurfaceDestroyed (holder); mVisible = falsk ; 

mHandler.removeCallbacks (mUpdateDisplay);

}
 @Override offentligt ugyldigt onDestroy () { super .onDestroy (); mVisible = falsk ; 

mHandler.removeCallbacks (mUpdateDisplay);

}

}

6. Indtil dette tidspunkt er den kode, vi har implementeret, generisk for alle levende tapeter; nu inden for metoden Draw () tilføjer vi den specifikke kode til vores live tapet. Vi vil ikke gøre noget frygteligt kreativt eller effektivt. Grundlæggende hver 100ms rydder vi hele skærmen og bruger derefter lærredsobjektet til at male systemet millisekundstimer på skrivebordet.

 DemoWallpaperService.java 
 privat tomrumstegn () { 
 SurfaceHolder holder = getSurfaceHolder (); 
 Lærred c = nul ; 
 prøv { 
 c = holder.lockCanvas (); 
 hvis (c! = null ) { 
 Maling p = ny maling (); 
 p.setTextSize (20); 
 p.setAntiAlias ​​( sandt ); 
 Stringtekst = "systemtid:" + Lang. toString (System. currentTimeMillis ()); 
 float w = p.measureText (tekst, 0, text.length ()); 
 int offset = ( int ) w / 2; 
 int x = c.getWidth () / 2 - offset; 
 int y = c.getHeight () / 2; 
 p.setColor (farve. SORT ); 
 c.drawRect (0, 0, c.getWidth (), c.getHeight (), p); 
 p.setColor (farve. HVID ); 
 c.drawText (tekst, x, y, p); 
 } 
 } endelig { 
 hvis (c! = null ) 
 holder.unlockCanvasAndPost (c); 
 } 

mHandler.removeCallbacks (mUpdateDisplay);

hvis (mVisible) {

mHandler.postDelayed (mUpdateDisplay, 100);

}

}

}

7. Din endelige version af DemoWallpaperService.java skal ligne nedenstående liste - mindst indtil næste uge.

 DemoWallpaperService.java 
 pakke com.authorwjf.live_wallpaper_p1; 
 import android.graphics.Canvas; 
 import android.graphics.Color; 
 import android.graphics.Paint; 
 import android.os.Handler; 
 import android.service.wallpaper.WallpaperService; 
 import android.view.SurfaceHolder; 
 public class DemoWallpaperService udvider WallpaperService { 
 @Override 
 public Engine onCreateEngine () { 
 returner nyt DemoWallpaperEngine (); 
 } 
 privat klasse DemoWallpaperEngine udvider Engine { 
 privat boolsk mVisible = falsk ; 
 privat endelig Handler mHandler = ny Handler (); 
 privat final Runnable mUpdateDisplay = new Runnable () { 
 @Override 
 offentlig annullering () { 
 tegne(); 
 }}; 
 privat tomrumstegn () { 
 SurfaceHolder holder = getSurfaceHolder (); 
 Lærred c = nul ; 
 prøv { 
 c = holder.lockCanvas (); 
 hvis (c! = null ) { 
 Maling p = ny maling (); 
 p.setTextSize (20); 
 p.setAntiAlias ​​( sandt ); 
 Stringtekst = "systemtid:" + Lang. toString (System. currentTimeMillis ()); 
 float w = p.measureText (tekst, 0, text.length ()); 
 int offset = ( int ) w / 2; 
 int x = c.getWidth () / 2 - offset; 
 int y = c.getHeight () / 2; 
 p.setColor (farve. SORT ); 
 c.drawRect (0, 0, c.getWidth (), c.getHeight (), p); 
 p.setColor (farve. HVID ); 
 c.drawText (tekst, x, y, p); 
 } 
 } endelig { 
 hvis (c! = null ) 
 holder.unlockCanvasAndPost (c); 
 } 
 mHandler.removeCallbacks (mUpdateDisplay); 
 hvis (mVisible) { 
 mHandler.postDelayed (mUpdateDisplay, 100); 
 } 
 } 
 @Override 
 public void onVisibilityChanged (synlig boolean ) { 
 mVisible = synlig; 
 hvis (synlig) { 
 tegne(); 
 } andet { 
 mHandler.removeCallbacks (mUpdateDisplay); 
 } 
 } 
 @Override 
 offentlig tomrum på SurfaceChanged (SurfaceHolder holder, int- format, int bredde, int højde) { 
 tegne(); 
 } 
 @Override 
 public void onSurfaceDestroyed (SurfaceHolder holder) { 
 super .onSurfaceDestroyed (holder); 
 mVisible = falsk ; 
 mHandler.removeCallbacks (mUpdateDisplay); 
 } 
 @Override 
 offentligt ugyldigt onDestroy () { 
 super .onDestroy (); 
 mVisible = falsk ; 
 mHandler.removeCallbacks (mUpdateDisplay); 
 } 
 } 
 } 
8. Nu er vi klar til at prøve det. Installer tjenesten på din emulator ved hjælp af menuen Kør i Eclipse IDE. Vente. Hvad sagde du? Intet skete? Det er fordi vi stadig har brug for at aktivere vores nye tapet. Når overførslen til emulatoren er afsluttet, skal du trykke på Menu-tasten fra startskærmen ( figur B ). Figur B

9. Vælg Live wallpapers fra den sekundære menu ( figur C ). Fig

10. Vælg TR Demo-tapet fra de installerede levende tapeter ( figur D ). Figur D

11. Og sidst, men ikke mindst, indstil tapetet ( figur E ). Figur E

Der har du det! Et levende, men ikke særlig interessant tapet. I del to af denne tutorial vil vi arbejde med at sprede vores tapettjeneste op lidt via draw () -metoden samt tilføje en konfigurationsfil. Jeg vil også dele nogle tip om fejlsøgning af levende tapeter, som hvis det ikke var sket med dig før nu, ikke altid er den nemmeste opgave.

© Copyright 2021 | pepebotifarra.com