Slide 1

Slide 1 text

ウォッチフェイス作ってみた
 shibuya.apk #41 @Kaito-Dogi


Slide 2

Slide 2 text

自己紹介
 ❏ どぎー
 ❏ 株式会社ゆめみ
 ❏ Androidエンジニア
 ❏ Pixel Watch 愛用中
 @Kaito_Dogi
 @Kaito-Dogi


Slide 3

Slide 3 text

スマートウォッチ使ってますか!


Slide 4

Slide 4 text

画像:https://store.google.com/jp/product/google_pixel_watch?hl=ja

Slide 5

Slide 5 text

毎日使ってるのに味気ない…
 自分だけのカスタマイズをしたい…


Slide 6

Slide 6 text

ウォッチフェイスで実現できる!


Slide 7

Slide 7 text

ウォッチフェイスとは?
 ❏ 「文字盤」
 ❏ ユーザーが自身を表現できる
 分かりやすい手段
 ❏ データソースからのデータを
 表示できる(追加機能)
 ❏ タップイベントの処理


Slide 8

Slide 8 text

ウォッチフェイスを
 自分でも作りたい!


Slide 9

Slide 9 text

ウォッチフェイスは手軽に作れる!


Slide 10

Slide 10 text

そう、WatchFaceStudioならね


Slide 11

Slide 11 text

WatchFaceStudioとは?
 ❏ 「ウォッチフェイスデザインツール」
 ❏ コーディング不要!
 ❏ Google Play に公開可能
 ❏ Samsung が作成
 ❏ https://developer.samsung.com/watch-f ace-studio/download.html


Slide 12

Slide 12 text

画像:https://developer.android.com/training/wearables/wfs

Slide 13

Slide 13 text

コンポーネント
 ❏ テキスト
 ❏ 静的な標準テキスト
 ❏ 動的なデータテキスト(タグ式を使用) 
 ❏ 図形(楕円・長方形など)
 ❏ 画像・アニメーション
 ❏ AGIF・Lottie・WebP の再生(マルチメディア) 
 ❏ アナログ時計・デジタル時計
 ❏ プログレスバー


Slide 14

Slide 14 text

ジャイロ
 ❏ 端末の傾きに応じて以下を
 変更できる
 ❏ 大きさ
 ❏ 位置
 ❏ 傾き
 ❏ 不透明度


Slide 15

Slide 15 text

アニメーション
 ❏ 複数の画像をパラパラマンガのように再生
 ❏ 画像ごとに Frame を設定
 ❏ メイン画面で再生して確認可能
 
 ❏ AGIF・Lottie・WebP のような、
 既にアニメーション化されている画像は
 マルチメディアで再生!


Slide 16

Slide 16 text

実際に作ってみた!


Slide 17

Slide 17 text

❏ タグ式で時刻を表示
 ([HOUR_1_12_Z]):([MIN_Z]):([SEC_Z])
 
 
 
 ❏ デジタル時計をカーブ
 ❏ 太陽くんをジャイロで動かす
 ❏ 白くまくんをアニメーションで動かす
 01~12
 00~59
 00~59


Slide 18

Slide 18 text

水平時
 手首:https://developer.android.com/training/wearables/wfs

Slide 19

Slide 19 text

注意すること
 ❏ 常時オン状態で使用できる
 ピクセルのうち15%以下を使用 する設計を推奨
 ❏ 大幅に超えると拒否される!
 ❏ 常時オン状態は自動的に生成 されるので自分で調整


Slide 20

Slide 20 text

ウォッチフェイスのコードを
 眺めてみる👀


Slide 21

Slide 21 text

class CustomWatchFaceService : WatchFaceService() { override fun createUserStyleSchema(): UserStyleSchema = // ... override fun createComplicationSlotsManager( currentUserStyleRepository: CurrentUserStyleRepository ): ComplicationSlotsManager = // ... override suspend fun createWatchFace( surfaceHolder: SurfaceHolder, watchState: WatchState, complicationSlotsManager: ComplicationSlotsManager, currentUserStyleRepository: CurrentUserStyleRepository ): WatchFace = // ... }

Slide 22

Slide 22 text

class CustomWatchFaceService : WatchFaceService() { override fun createUserStyleSchema(): UserStyleSchema = // ... override fun createComplicationSlotsManager( currentUserStyleRepository: CurrentUserStyleRepository ): ComplicationSlotsManager = // ... override suspend fun createWatchFace( surfaceHolder: SurfaceHolder, watchState: WatchState, complicationSlotsManager: ComplicationSlotsManager, currentUserStyleRepository: CurrentUserStyleRepository ): WatchFace = // ... } WatchFaceService
 を継承


Slide 23

Slide 23 text

class CustomWatchFaceService : WatchFaceService() { override fun createUserStyleSchema(): UserStyleSchema = // ... override fun createComplicationSlotsManager( currentUserStyleRepository: CurrentUserStyleRepository ): ComplicationSlotsManager = // ... override suspend fun createWatchFace( surfaceHolder: SurfaceHolder, watchState: WatchState, complicationSlotsManager: ComplicationSlotsManager, currentUserStyleRepository: CurrentUserStyleRepository ): WatchFace = // ... } 3つのメソッドを
 override


Slide 24

Slide 24 text

class CustomWatchFaceService : WatchFaceService() { override fun createUserStyleSchema(): UserStyleSchema = // ... override fun createComplicationSlotsManager( currentUserStyleRepository: CurrentUserStyleRepository ): ComplicationSlotsManager = // ... override suspend fun createWatchFace( surfaceHolder: SurfaceHolder, watchState: WatchState, complicationSlotsManager: ComplicationSlotsManager, currentUserStyleRepository: CurrentUserStyleRepository ): WatchFace = // ... } スキーマの設定
 (色・分針の長さなど)


Slide 25

Slide 25 text

class CustomWatchFaceService : WatchFaceService() { override fun createUserStyleSchema(): UserStyleSchema = // ... override fun createComplicationSlotsManager( currentUserStyleRepository: CurrentUserStyleRepository ): ComplicationSlotsManager = // ... override suspend fun createWatchFace( surfaceHolder: SurfaceHolder, watchState: WatchState, complicationSlotsManager: ComplicationSlotsManager, currentUserStyleRepository: CurrentUserStyleRepository ): WatchFace = // ... } Complication スロット
 の初期化


Slide 26

Slide 26 text

class CustomWatchFaceService : WatchFaceService() { override fun createUserStyleSchema(): UserStyleSchema = // ... override fun createComplicationSlotsManager( currentUserStyleRepository: CurrentUserStyleRepository ): ComplicationSlotsManager = // ... override suspend fun createWatchFace( surfaceHolder: SurfaceHolder, watchState: WatchState, complicationSlotsManager: ComplicationSlotsManager, currentUserStyleRepository: CurrentUserStyleRepository ): WatchFace = // ... } ウォッチフェイスを
 レンダリング(描画)


Slide 27

Slide 27 text

良きスマートウォッチライフを😚


Slide 28

Slide 28 text

参考記事
 ❏ Build watch faces | Android Developers 
 https://developer.android.com/training/wearables/watch-faces 
 ❏ Watch Face Studio | Android Developers 
 https://developer.android.com/training/wearables/wfs 
 ❏ WatchFace Sample (Kotlin) 
 https://github.com/android/wear-os-samples/tree/main/WatchFaceKotlin 
 ❏ Watch Face Studio | Samsung Developers 
 https://developer.samsung.com/watch-face-studio/overview.html 
 ❏ DroidKaigi 2022 - Introduction to Wear OS Application Development | Ryo Yamazaki 
 https://youtu.be/o0HhsnVAGNA 
 ❏ Watch Face Studio でウォッチフェイスを作ろう 
 https://funnelbit.hatenablog.com/entry/2022/11/28/150138 
 ❏ [Android] Watch Faceをささっと作成 
 https://cocoamix.jp/archives/9482 


Slide 29

Slide 29 text

ありがとうございました🙌