Döntsön fel, és hibakeresést végezzen az élő háttérképet az Android számára
A múlt héten lefektettük az élő háttérkép létrehozásának alapjait egy Android telefonon. Míg az alkalmazás architektúrája kissé különbözik a projektekkel, amelyekkel általában ebben a blogban foglalkozunk, addig, amíg az alapok meg vannak, a dolgok a helyére kerülnek.
Ebben az oktatóanyagban elmagyarázom, hogyan állíthat be egy háttérképet a háttérkép-szolgáltatáshoz, és megoszthatom az praktikus trükköt az élő háttérképek hibakeresésének az Eclipse IDE-ben. A kész projektfájl letölthető itt. Az archívum mindent tartalmaz, amely a múlt héten letöltött volt, valamint az új / módosított fájlokat.
1. A projektet ezen oktatóanyag első részéből fogjuk módosítani, tehát az Eclipse-ben új projekt létrehozása helyett a múlt heti projektet adjuk vissza a munkaterületre, és felkészülünk arra, hogy felvegyük ott, ahol abbahagytuk.
2. Nyissa meg az AndroidManifest.xml fájlt a / res mappában. A már korábban meghatározott címke alatt és a címke belsejében egy új tevékenység kerül beillesztésre. Ez képviseli a preferenciaképernyőnket. Az alábbiakban bemutatjuk a manifeszt végleges változatát.
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 = "@ húzható / ikon" >
"TR Demo Live Wallpaper" android: name = ".DemoWallpaperService"
android: engedély = "android.permission.BIND_WALLPAPER" >
"android.service.wallpaper.WallpaperService" />
"Android.service.wallpaper" android: resource = "@ xml / wallpaper" />
"Beállítások..."
android: name = ".WallpaperPrefsActivity"
android: export = "true" >
"7" />
"android.software.live_wallpaper" />
3. Olyan XML fájlt akarunk létrehozni, amely meghatározza azokat a beállításokat, amelyeket a háttérkép testreszabásához használunk. Annak érdekében, hogy a bemutató egyszerű legyen, nem fogunk semmit megrázni. Összegyűjtjük a megjelenítendő húrot és a szöveg színét. Adjon hozzá egy új, prefs.xml nevű fájlt a / res / xml mappához.
prefs.xml"1.0" encoding = "utf-8" ?>
"http://schemas.android.com/apk/res/android">
"Text_to_display" android: title = "Megjelenítendő szöveg:" />
"szöveg szín" android: title = "Hex színérték:" />
4. Az / src mappában létre kell hoznunk a WallpaperPrefsActivity-t. A PreferenceActivity osztály kibővítésével és a prefs.xml fájlra mutatásával a platform generálja a legtöbb kódot nekünk. Az egyetlen kivétel a bemenet érvényesítése, amelyet az onPreferenceChange visszahívás során kezelünk.
WallpaperPrefsActivity.java csomag 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;
a nyilvános osztályba tartozó WallpaperPrefsActivity kiterjeszti az PreferenceActivity OnPreferenceChangeListener eszközöket
@ Felülírja a védett érvénytelen onCreate (Bundle savedInstanceState) { super .onCreate (savedInstanceState);addPreferencesFromResource (R.xml. prefs);
Preferencia p = getPreferenceScreen (). FindPreference ("text_color");
p.setOnPreferenceChangeListener ( ez );p = getPreferenceScreen (). findPreference ("text_to_display");
p.setOnPreferenceChangeListener ( ez ); }
@Override
nyilvános logikai onPreferenceChange (Preferencia preferencia, Új érték objektum) {
if (preference.getKey (). equalsIgnoreCase ("text_color")) {
próbáld {
Karakterlánc-bemenet = newValue.toString ();
if (input.length ()! = 7) dobjon új kivételt ("Érvénytelen hosszúság");
if (! input.startsWith ("#")) dobjon új kivételt ("Érvénytelen formátum");
Húr: = input.string (1, 3);
G karakterlánc = input.sstring (3, 5);
B karakterlánc = input.string (5, 7);
int color = Szín. rgb (egész szám. parselent (r, 16), egész szám. parsellent (g, 16), egész szám. parsellent (b, 16));
visszatér igaz ;
} fogás (e kivétel) {
Pirítós. makeText ( ez : "Érvénytelen hex színérték (példa bemenet: # ff0000).", Toast. LENGTH_SHORT ) .show ();
hamis visszaadást ;
}
} else if (preference.getKey (). equalsIgnoreCase ("text_to_display")) {
próbáld {
Karakterlánc-bemenet = newValue.toString ();
if (input.length () <1) dobjon új kivételt ("érvénytelen hosszúság");
visszatér igaz ;
} fogás (e kivétel) {
Pirítós. makeText ( ez : "Érvénytelen megjelenítési karakterlánc.", Toast. LENGTH_SHORT ) .show ();
hamis visszaadást ;
}}
visszatér igaz ;}
}
5. Az utolsó lépés a múlt héten létrehozott DemoWallpaperService fájl módosítása. A szolgáltatást először úgy módosították, hogy betöltse a preferenciáinkba az onVisibilityChanged visszahívásban, és másodszor, hogy a szöveget a megadott színűre húzza a draw () módszerben. Semmi más nem változik a múlt héthez képest. A rajz többsége, amely megváltozott a draw () metódusban, az alfa-csatorna növelésével és csökkentésével foglalkozik, hogy pulzáló hatást gyakoroljon a szövegre.
com.authorwjf.live_wallpaper_p2 csomag ;
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;
a nyilvános osztályú DemoWallpaperService kiterjeszti a WallpaperService {
@A nyilvános motor onCreateEngine () { visszatérése új DemoWallpaperEngine (); }
a privát osztály a DemoWallpaperEngine kiterjeszti a motort { private boolean mVisible = false ; magán int mColor = 0; magán int mAlpha = 0; private boolean mIsCountingUp = true ; private String mText = "Hello!"; magán végső kezelő mHandler = új kezelő (); private final Runnable mUpdateDisplay = new Runnable () {@Override
nyilvános érvénytelen futás () {húz();
}};
magán érvénytelen sorsolás () {SurfaceHolder tartó = getSurfaceHolder ();
Vászon c = null ; próbáld {c = tartó. lockCanvas ();
if (c! = null ) {//android.os.Debug.waitForDebugger ();
Festék p = új festék ();p.setTextSize (20);
p.setAntiAlias ( igaz );Húros szöveg = mText;
float w = p.measureText (szöveg, 0, text.length ()); int eltolás = ( int ) w / 2; int x = c.getWidth () / 2 - eltolás; int y = c.getHeight () / 2;p.setColor (színes. FEKETE );
c.drawRect (0, 0, c.getWidth (), c.getHeight (), p);
p.setColor (mColor);
p.setAlpha (mAlpha);
c.drawText (szöveg, x, y, p);
if (mIsCountingUp) {mAlpha + = 10;
if (mAlpha> 255) {mAlpha = 255;
mIsCountingUp = false ; }
} egyéb {mAlpha- = 10;
if (mAlpha <0) {mAlpha = 0;
mIsCountingUp = true ;}
}
}} végül { if (c! = null )holder.unlockCanvasAndPost (c);
}
mHandler.removeCallbacks (mUpdateDisplay);
if (mVisible) {mHandler.postDalayed (mUpdateDisplay, 100);
}
}
@A nyilvános void felülbírálása onVisibilityChanged (logikailag látható) {mVisible = látható;
if (látható) {SharedPreferences prefs = PreferenceManager. getDefaultSharedPreferences (DemoWallpaperService. ez );mText = prefs.getString ("text_to_display", "Ez az alapértelmezett.");
Húr tmp = prefs.getString ("text_color", "#ffffff");
Húr: = tmp.húzás (1, 3);
G húr: tmp.sáv (3, 5);
B húr = tmp.húzó (5, 7);
mColor = Szín. rgb (egész szám. parselent (r, 16), egész szám. parsellent (g, 16), egész szám. parsellent (b, 16));
húz();
} egyéb {mHandler.removeCallbacks (mUpdateDisplay);
}
}
@A nyilvános érvénytelenség felülírása az onSurfaceChanged (SurfaceHolder tartó, int formátum, int szélesség, int magasság) {húz();
}
@A nyilvános void felülbírálása az onSurfaceDestroyed (SurfaceHolder tartó) { super .onSurfaceDestroyed (tulajdonos); mVisible = hamis ;mHandler.removeCallbacks (mUpdateDisplay);
}
@A nyilvános void felülbírálása onDestroy () { super .onDestroy (); mVisible = hamis ;mHandler.removeCallbacks (mUpdateDisplay);
}
}
}
Tessék, itt van! Szerény, de teljesen működőképes élő háttérkép. Az egyik dolog, amelyet érdemes megjegyezni, a //android.os.Debug.waitForDebugger () megjegyzésbe iktatott felhívása; a sorsolás módszerében. Ennek az oktatóanyagnak az az előnye, hogy tesztelt kóddal dolgozik, de ha az élő háttérkép szolgáltatása hibakeresést igényel, akkor az IDE-n keresztüli töréspont megadása nem fog működni a várt módon. Fel kell vennie a waitForDebugger () hívást a forrásfájlba.
Ezzel hagyom, hogy saját élő háttérképeket készítsen. Várom, hogy letölthetem azokat az Android Marketről! Nyugodtan tegyen közzé egy linket a vitaterületen, hogy megmutassa alkotásait a többi TechRepublic tag számára.
A ábra