Gran opp og feilsøk levende bakgrunnsbilde for Android

Forrige uke la vi grunnlaget for å lage et levende bakgrunnsbilde på en Android-telefon. Selv om applikasjonsarkitekturen er litt annerledes enn prosjektene vi vanligvis takler i denne bloggen, begynner det å falle på plass når det grunnleggende er der.

I denne opplæringen forklarer jeg hvordan du implementerer en innstillingsskjerm for bakgrunnstjenesten din, og deler et praktisk triks for feilsøking av levende bakgrunnsbilder i Eclipse IDE. Den ferdige prosjektfilen kan lastes ned her. Arkivet inneholder alt som var i forrige ukes nedlasting, så vel som de nye / modifiserte filene.

1. Vi vil modifisere prosjektet fra del en av denne opplæringen, så heller enn å lage et nytt prosjekt i Eclipse, kan du legge til prosjektet fra forrige uke tilbake i et arbeidsområde og forberede oss på å hente der vi slapp.

2. Åpne AndroidManifest.xml-filen fra mappen / res. Rett under taggen vi tidligere har definert og inne i taggen blir en ny aktivitet inkludert. Dette representerer skjermene våre for preferanser. Nedenfor er en endelig versjon av manifestet.

 AndroidManifest.xml 

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

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

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

android: versionName = "1.0" >
 "TR Demo Live Wallpaper" android: icon = "@ drawable / icon" > 
 "TR Demo Live Wallpaper" 

android: name = ".DemoWallpaperService"

android: Permission = "android.permission.BIND_WALLPAPER" >

"android.service.wallpaper.WallpaperService" />

"Android.service.wallpaper"

android: resource = "@ xml / bakgrunn" />

"Settings ..."

android: name = ".WallpaperPrefsActivity"

android: eksportert = "sant" >

"7" />

"android.software.live_wallpaper" />

3. Vi ønsker å lage en XML-fil som vil definere innstillingene vi vil bruke for å tilpasse bakgrunnsbilde. For å holde demoen enkel, kommer vi ikke til å gjøre noe galt. Vi samler en streng som skal vises og en farge for teksten. Legg til en ny fil som heter prefs.xml i mappen / res / xml.

 prefs.xml 

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

"http://schemas.android.com/apk/res/android">

"Text_to_display"

android: title = "Tekst som skal vises:" />

"Text_color"

android: title = "Hex fargeverdi:" />

4. I mappen / src må vi opprette WallpaperPrefsActivity. Ved å utvide PreferenceActivity-klassen og peke den på prefs.xml-filen vår, genererer plattformen det meste av koden for oss. Det eneste unntaket er validering for inngangen, som vi håndterer i onPreferenceChange tilbakeringing.

 WallpaperPrefsActivity.java- pakke com.authorwjf.live_wallpaper_p2; import android.graphics.Color; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.Preference.OnPreferenceChangeListener; import android.widget.Toast; 
 bakgrunn i offentlig klassePrefsActivity utvider PreferencesActivity implementerer OnPreferenceChangeListener { 
 @Override beskyttet tomrom onCreate (Bundle savedInstanceState) { super .onCreate (savedInstanceState); 

addPreferencesFromResource (R.xml. kokker);

Preferanse p = getPreferenceScreen (). FindPreference ("text_color");

p.setOnPreferenceChangeListener ( dette );

p = getPreferenceScreen (). findPreference ("text_to_display");

p.setOnPreferenceChangeListener ( dette ); }
 @Overstyring 
 offentlig boolsk onPreferenceChange (Preferences preference, Object newValue) { 
 if (preference.getKey (). equalsIgnoreCase ("text_color")) { 
 prøv { 
 Strenginngang = newValue.toString (); 
 hvis (input.length ()! = 7) kaster nytt unntak ("Ugyldig lengde"); 
 Hvis (! input.startsWith ("#")) kaster nytt unntak ("Ugyldig format"); 
 Streng r = input.substring (1, 3); 
 Streng g = input.substring (3, 5); 
 Streng b = input.substring (5, 7); 
 int farge = farge. rgb (heltall. parseInt (r, 16), heltall. parseInt (g, 16), heltall. parseInt (b, 16)); 
 return true ; 
 } fangst (unntak e) { 
 Skål. makeText ( dette, "Ugyldig hex-fargeverdi (eksempelinngang: # ff0000).", Toast. LENGTH_SHORT ) .show (); 
 return falsk ; 
 } 
 } annet hvis (preference.getKey (). er lik IgnoreCase ("text_to_display")) { 
 prøv { 
 Strenginngang = newValue.toString (); 
 if (input.length () <1) kaste nytt unntak ("Ugyldig lengde"); 
 return true ; 
 } fangst (unntak e) { 
 Skål. makeText ( dette, "Ugyldig skjermstreng.", Toast. LENGTH_SHORT ) .show (); 
 return falsk ; 
 } 

}

return true ;

}

}

5. Det siste trinnet vil være å endre DemoWallpaperService-filen vi opprettet forrige uke. Tjenesten ble først endret for å laste inn preferansene våre i onVisibilityChanged tilbakeringing, og for det andre for å tegne den teksten i den spesifiserte fargen i draw () -metoden. Ingenting annet endres fra forrige uke. Størstedelen av koden som endret seg i trekningen () -metoden, handler om å øke og redusere alfakanalen for å gi en pulserende effekt på teksten.

 pakke com.authorwjf.live_wallpaper_p2; 
 import android.content.SharedPreferences; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.preference.PreferenceManager; import android.service.wallpaper.WallpaperService; import android.view.SurfaceHolder; 
 public class DemoWallpaperService utvider WallpaperService { 
 @Override offentlig motor onCreateEngine () { return new DemoWallpaperEngine (); } 
 privat klasse DemoWallpaperEngine utvider Engine { private boolean mVisible = false ; privat int mColor = 0; privat int mAlpha = 0; privat boolsk mIsCountingUp = true ; private String mText = "Hei!"; privat finale Handler mHandler = new Handler (); privat finale Runnable mUpdateDisplay = new Runnable () { 

@Overstyring

public void run () {

tegne();

}};
 privat ugyldig trekning () { 

SurfaceHolder holder = getSurfaceHolder ();

Lerret c = null ; prøv {

c = holder.lockCanvas ();

hvis (c! = null ) {

//android.os.Debug.waitForDebugger ();

Maling p = ny maling ();

p.setTextSize (20);

p.setAntiAlias ​​( sant );

Strengetekst = mTekst;

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 (farge. SVART );

c.drawRect (0, 0, c.getWidth (), c.getHeight (), p);

p.setColor (mColor);

p.setAlpha (mAlpha);

c.drawText (tekst, x, y, p);

if (mIsCountingUp) {

mAlpha + = 10;

if (mAlpha> 255) {

mAlpha = 255;

mIsCountingUp = falsk ; }
 } annet { 

mAlpha- = 10;

if (mAlpha <0) {

mAlpha = 0;

mIsCountingUp = true ;

}

}
 }} endelig { if (c! = null ) 

holder.unlockCanvasAndPost (c);

}

mHandler.removeCallbacks (mUpdateDisplay);

if (mVisible) {

mHandler.postDelayed (mUpdateDisplay, 100);

}

}
 @Override offentlig tomrom påVisibilityChanged (synlig boolesk) { 

mVisible = synlig;

if (synlig) {SharedPreferences prefs = PreferenceManager. getDefaultSharedPreferences (DemoWallpaperService. dette );

mText = prefs.getString ("text_to_display", "Dette er standard.");

String tmp = prefs.getString ("text_color", "#ffffff");

Streng r = tmp.snorstreng (1, 3);

Streng g = tmp.snorstreng (3, 5);

Streng b = tmp.snorstreng (5, 7);

mColor = Farge. rgb (heltal. parseInt (r, 16), heltall. parseInt (g, 16), heltall. parseInt (b, 16));

tegne();

} annet {

mHandler.removeCallbacks (mUpdateDisplay);

}

}
 @Override offentlig tomrom på SurfaceChanged (SurfaceHolder holder, int- format, int bredde, int høyde) { 

tegne();

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

mHandler.removeCallbacks (mUpdateDisplay);

}
 @Override offentlig tomrom onDestroy () { super .onDestroy (); mVisible = falsk ; 

mHandler.removeCallbacks (mUpdateDisplay);

}

}

}

Der har du det! Et beskjedent, men fullt funksjonelt live bakgrunnsbilde. En ting som er verdt å merke seg, er den kommenterte samtalen til //android.os.Debug.waitForDebugger (); i trekningsmetoden. I form av denne opplæringen har du fordelen av å jobbe med testet kode, men hvis din levende bakgrunnstjeneste krever debugging, er det bare å sette et knekkpunkt via IDE, og vil ikke fungere som du forventer. Du må legge til waitForDebugger () -samtalet i kildefilen.

Med det overlater jeg deg til å lage dine egne live bakgrunnsbilder. Jeg ser frem til å laste ned dem i Android Market! Legg gjerne en lenke i diskusjonsområdet for å vise frem kreasjonene dine til andre TechRepublic-medlemmer.

Figur A

Figur B

Figur C

© Copyright 2021 | pepebotifarra.com