
最近、私はアンドロイド用のライブ壁紙の作り方を考え出し、良い例を使ってそれを最もよく理解することにしました-それは後で役に立つでしょう。 私はいつも快適な時計が欲しかった。 アンドロイドには十分な数のそのような壁紙が既に存在しますが、通常は画面の固定コーナーに大きな時計を描き、ウィジェットと重なっています。 私は時計が画面全体に散らばるようにしたかったのです。そうすればそれらを見る確率が高くなります。
Android向けのライブ壁紙はサービス(プラットフォームの観点からはバックグラウンドプロセス)であり、SDKには、ライブ壁紙用の
既製のクラスが既に存在します。
まず、マニフェストは、アプリケーションがライブ壁紙を提供することを説明しています。
<service android:name="LiveWallpaperService" android:enabled="true" android:icon="@drawable/icon" android:label="@string/app_name" android:permission="android.permission.BIND_WALLPAPER"> <intent-filter android:priority="1" > <action android:name="android.service.wallpaper.WallpaperService" /> </intent-filter> <meta-data android:name="android.service.wallpaper" android:resource="@xml/wallpaper" /> </service>
ここで最も重要な行は
androidです:permissionと
intent-filter次に、実際には、コーディング。 独自の子孫クラス
WallpaperServiceを作成し、そのメソッド
onCreate、onDestroy、onVisibilityChanged、onSurfaceChanged、onSurfaceCreated、onSurfaceDestroyedを再定義します
。これらのメソッドは、システムイベントに応答します。 主な目的は、バッテリーを節約するために、視認性が変化したときに壁紙のレンダリングをオンまたはオフにすることです。
実際、私たちは以下にのみ興味があります。
@Override public void onVisibilityChanged(boolean visible) { if (visible) { painting.resumePainting(); } else {
ユーザーのアクションに対する反応がタイムリーかつスムーズになるように、レンダリング自体を別のストリームに実装します。 これを行うには、別の
Thread下位クラスを作成します。 上記の例の
ペインティングオブジェクトはこのストリームです。
public ClockWallpaperPainting(SurfaceHolder surfaceHolder, Context context, int fontColor, int backgroundColor) { this.surfaceHolder = surfaceHolder; this.context_ = context; clockFont_ = Typeface.createFromAsset(context.getAssets(), "digital_font.ttf"); textPainter_.setTypeface(clockFont_); textPainter_.setTextSize(30); setPreferences(fontColor, backgroundColor); this.wait_ = true; } @Override public void run() { this.run_ = true; Canvas c = null; while (run_) { try { c = this.surfaceHolder.lockCanvas(null); synchronized (this.surfaceHolder) { doDraw( c ); } } finally { if (c != null) { this.surfaceHolder.unlockCanvasAndPost( c ); } }
ご覧のように、
doDraw()メソッドを際限なく実行し、デスクトップが表示されないときに定期的に一時停止します。
メソッド自体は次のようになります。
private void doDraw(Canvas canvas) { Date currentTime = new Date();
このサービスでは、デスクトップの変更に壁紙が応答するように別のメソッドを再定義します。
@Override public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) { painting.setOffset(xOffset); Log.d("Clock", String.format("off:%f-%f step:%f - %f px: %d - %d", xOffset, yOffset, xStep, yStep, xPixels, yPixels)); }
この例では、別のスレッドで描画する方法がよく描かれ
ています 。
そして最後に、設定。 これらは、他のAndroidアプリケーションの設定と同様に、シンプルになります。 xmlファイルでは、カスタムパラメータとそれらが取ることができる値の範囲を登録する必要があります。 この場合、ユーザーにテキストと背景の色を選択させます。
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="@string/settings_title"> <ListPreference android:key="preference_font_color" android:title="@string/preference_font_color_title" android:summary="@string/preference_font_color_summary" android:entries="@array/color_names" android:entryValues="@array/color_values" /> <ListPreference android:key="preference_background_color" android:title="@string/preference_background_color_title" android:summary="@string/preference_background_color_summary" android:entries="@array/color_names" android:entryValues="@array/color_values" /> </PreferenceScreen>
最終的には次のようになります。
こちらからダウンロードできます。
壁紙を作成するには、
ここから開始でき
ます