1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Androidのライブ壁紙を作ってみた〜アセットはnano bananaに任せ…られるのか?〜

1
Last updated at Posted at 2025-12-05

はじめに

CYBIRD Advent Calendar 2025の6日目担当、@chikako_ikedaです。
5日目は@RN-Vidさんの「映像の「演出考察」をAIにさせようとして挫折したが、なんとかリファレンス収集ツールに着地できた件」でした。
映像演出の分析を完全にAIに任せることは難しいようですが、一部でも自動化にこぎつけるのはいいことですね!

概要

今年は、担当しているタイトルで「特典にライブ壁紙ってイケるだろうか…?」というお話がちらりと出てきました。
ライブ壁紙は文字通り「動く壁紙」で、AndroidではAndroid 4.0の頃からある機能です。
最近はAIの進歩もあって、ただの写真が動く壁紙に変えられる! なんて触れ込みもあって、再注目されてきているようです。

そんな古くからある機能なのですが、実は業務では縁がなく「アプリとして作れるのは知ってるけど、どう動いているのかは知らない」状態でした。
せっかくなので、クリスマスっぽいもの作ってみたら、楽しいよね! ということで、作り方を調べました。

Geminiさん、作り方教えて

リファレンスを見ながら、どうやって作ればええん? と調べ…ません。AIに作り方を聞きました。
プログラム系しかもAndroidだしな、という理由でGeminiを使っています。

本当は調べるつもりでいたんですが、開発の仕方がわかる記事などがなかなか見つからず、タイムアップでした…
古い機能だけど、あまり開発紹介事例は見たことがありません。 :thinking:

さて、肝心の作り方ですが、Gemini曰く、WallpaperServiceを継承して作りなさい、とのこと。
ちなみにこんな感じのライブ壁紙にしたい、と伝えました。


・日の出〜日の入りの間は昼間として扱い、明るい室内にクリスマスツリーが置かれている
・日の入り〜日の出の間は夜間として扱い、 夜間のうちAM2:00まではオレンジ色の室内灯がついた暖かい印象の室内にクリスマスツリーが置かれている
・12月1日から10日まではクリスマスツリーには雪とのみの飾り付けがある
・12月11日から19日まではクリスマスツリーに丸型と星型の飾り付けが追加される
・12月20日に更に電飾が追加されて、20日〜24日の日の入りからAM2:00までは電飾がつく

それに対して、出してきた回答がこちら。

回答全文

ありがとうございます!非常に具体的なアイデアですね。時刻と日付によって細かく表示が変わる、物語性のあるライブ壁紙はとても魅力的です。

このアイデアを実現するためには、プログラミング(Android Studioでの開発)が必要です。

---

## 💡 ライブ壁紙「クリスマスルーム」の実現に必要な要素

あなたのアイデアを実現するために、技術的に必要な主要な要素は以下の3点です。

### 1. 描画素材(アセット)の準備

すべての状態(昼、夜・照明付き、夜・消灯)と、すべての装飾パターンに対応する画像素材が必要です。

| 状態のパターン | 日付のパターン | 必要な画像素材の例 |
| :--- | :--- | :--- |
| **昼間** (日の出〜日の入り) | 12/1〜12/10 | **昼の部屋** + 雪とモミの装飾 |
| **昼間** (日の出〜日の入り) | 12/11〜12/19 | **昼の部屋** + 丸と星の装飾 |
| **昼間** (日の出〜日の入り) | 12/20〜 | **昼の部屋** + 電飾なしの完全な装飾 |
| **夜間・暖色照明** (日の入り〜AM 2:00) | 12/1〜12/10 | **夜の部屋** + **暖色照明効果** + 雪とモミの装飾 |
| **夜間・消灯** (AM 2:00〜日の出) | 12/1〜12/10 | **夜の部屋** + **消灯** + 雪とモミの装飾 |
| **夜間・暖色照明** (12/20〜24の日の入り〜) | 12/20〜12/24 | **夜の部屋** + **暖色照明効果** + **電飾が点滅/点灯**した完全な装飾 |

### 2. 時刻と日付の取得・判定ロジック

#### 📅 日付の判定

現在のデバイスの日付を取得し、どの装飾パターンを適用するかを判定するロジックが必要です。

* **`Calendar` クラス**や **`LocalDate` クラス**(Kotlin/Java)を使って現在の日付を取得します。
* `if`/`else if` 文を使って、日付(12/1〜10、12/11〜19、12/20〜)に応じて描画する画像を切り替えます。

#### ☀️ 時刻と日の出/日の入り判定

これが最も複雑な部分です。

1.  **日の出/日の入り時刻の取得:** Android標準のAPIには、ジオロケーション情報なしで正確な日の出/日の入り時刻を計算する機能はありません。
    * **簡易的な方法:** 固定時刻(例:日の出 6:30、日の入り 17:00)で昼夜を切り替える。
    * **より正確な方法:** ユーザーの現在地情報(緯度・経度)を取得し、**天文計算ライブラリ**(例:Joda-Time や外部ライブラリ)を使って日の出/日の入り時刻を計算する必要があります。これはユーザーのプライバシー(位置情報)に関わるため、パーミッションの取得が必要になり、難易度が上がります。
2.  **夜間照明の判定:** 現在時刻を取得し、日の入り時刻とAM 2:00、日の出時刻との間で、描画する画像を切り替えます。

### 3. 描画とアニメーション

ライブ壁紙の `Engine` クラス内で、上記の判定結果に基づいて画像を描画します。

* **描画の切り替え:** 判定ロジックで選択された適切な画像アセットを `Canvas` に描画します。
* **電飾の点滅アニメーション (12/20〜24):** 電飾の画像アセットを、一定のフレームレート(例:500ミリ秒ごと)で「点灯した状態」と「消えた状態」の画像に切り替える描画ループを実装します。

---

### 📝 次のステップとして

まずは、比較的簡単な「日付による装飾の切り替え」から実装を始めるのが良いでしょう。

1.  **Android Studioで新しいライブ壁紙プロジェクトを作成する** (前の回答のステップ 1, 2, 4, 5を参照)。
2.  **日付判定ロジック** を実装し、とりあえず固定画像(例:昼の画像1、夜の画像2)を切り替えるテストを行います。

もしプログラミング経験があれば、これらのステップを進める上での具体的なコードの質問にお答えできます。

**まずは、日の出・日の入りの判定について、次のどちらの方法で進めたいか教えていただけますか?**

1.  **固定時刻**(例: 日の出 $6:30$ / 日の入り $17:00$)で昼夜を切り替える。
2.  **正確な現在地の日の出/日の入り時刻** を計算して切り替える(難易度高)。

要約すると、

  1. Android Studioで作るよ
  2. 状態に合わせた画像を用意してね
  3. 状態に合わせた画像を差し替える実装してね

仕組みとしては、状態を定義して、その状態に合わせて画像を差し替える仕組みですね。
今回は気にしませんが、なめらかなアニメーションさせたら画像はたくさん必要になりますし、それを状態に合わせて差し替えたらメモリやバッテリーはかなり消費するので、パフォーマンスは要注意です。

画像はnano bananaに任せてしまおう…と思ったが…

とりあえず、コードをざっくりとサンプルを作ってもらい、肝心の画像を用意することに。
こんな感じの画像は本当にすぐ作れました。

プロンプト: 家具のない室内。窓から昼の明るい光が差し込む。火のついていない暖炉のそばに置かれた、少しの雪とモミの飾りだけのシンプルなクリスマスツリー。フォトリアルなスタイルで。

これで、「構図はこのままで、夜の雰囲気に〜」と差分を作っていけばいいだろう、と。
思ったのですが…

夜 バージョンその1
プロンプト: 同じ構図で。時刻を夜に変更し、部屋全体をオレンジ色の暖色照明が照らしている状態に。

ちょっと夜度が足りないな、と思い窓の外を暗くして天井から照明ついてる感があればどうだ? と思いプロンプト修正。

夜 バージョンその2
プロンプト: 同じ構図で。時刻を夜に変更し窓の外は暗くして、部屋全体をオレンジ色に。天井から暖色照明が照らしている状態に。窓からは光が差し込まないように。

…ツリーと暖炉がどこかへ行ってしまいました。
この後、プロンプトを色々修正しましたが、思った画像を出力してもらえませんでした。
一番成功率が高かったのは1度作った成功パターンの画像を添付して、「ここだけ変えて」とプロンプトを指定するやり方。
が、これも構図が変わってしまうことが3割くらいの確率で発生していました。
Geminiに誤解釈させない伝え方、難しい… :cry:

ちなみに、「アセットを作らないといけないなら、アプリ側からプロンプト発行して生成した画像を組み合わせてライブ壁紙化するのはできないの?」とGeminiに聞いたところ、「メモリ量がとても増える上にパフォーマンス管理大変だし、TensorFlow Liteなどの推論エンジンを使う必要もあるから難易度高い」というお返事をいただきました。

とりあえず、作りきってみた

その後、コードを多少弄りましたが、なんとか完成しました。

sampleLiveWallpaper.gif

まとめ

正常動作をするところまで作ってみての感想です。

  • シンプルな1枚絵作るなら、nano bananaは便利でした
  • 差分を作り出す時は、自分で編集した方が楽だった
  • 「背景を透明に」で出てきた画像は透過されてない、騙されるな
  • AIが出力したコードは絶対に動くか確かめましょう
     (設定しても画像が読み込めない、とかあった)

最後に

これで、みなさん好きな壁紙を作れるようになりますね!

次のCYBIRD Advent Calendar 2025の記事もよろしければ是非!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?