SDK2.0でPebble Watch Faceを作ってみた
あむちょです。
早速SDK2.0対応のWatch Faceを作ってみました。ついでにSDKの変更点など
Pebbleとはなんぞって人は以下から。
スマートウォッチPebble
以前作ったものをそのまま2.oに対応させました。
アプリのビンタの達人のキャラが上下にちょろちょろ動きます。時刻は24h表示で、秒にあわせて動きます。
Pebbleアプリで「Slap Master」と検索すればでできます。Pebbleアプリがアップデートしてかなり使いやすくなった上に、インターフェイスが格好良すぎです。
しかもPebbleの新しいモデルで、革とメタルできるとかで物欲ビンビン丸です。スペックも内部メモリが2倍だとか。
[amazonjs asin=”B00BKEQBI0″ locale=”JP” title=”Pebble E-Paper Watch for iPhone and Android 【Kickstarterエディション】 (ブラック)並行輸入品”]
個人的にPebble熱が再び沸いてきたきたけど、いかんせんSDKの変更点が多い上に参考になる資料がなさすぎる。
サンプルソースコードと格闘するのも疲れるので、忘れないようにメモ。
まずwatch faceの名前やバージョン情報がappinfo.jsonに書くようになりました。ついでにリソースファイルもここに記述するようになったのだが早速罠が。
SDK1.0でimage.pngをIDをIMAGEとしてソースで使いたい場合
<br />
{"friendlyVersion": "VERSION",<br />
"versionDefName": "APP_RESOURCES",<br />
"media": [<br />
{<br />
"type": "png",<br />
"defName": "IMAGE",<br />
"file": "images/image.png"<br />
}<br />
]<br />
}<br />
と書いてたのがSDK2.0だとdefNameがnameに変わりました。uuidは自動的に生成されます。デフォルトだとwatchfaceはfalseになってます。
<br />
{<br />
"uuid": "e9af42f3-hoge-hoge-huga-huga",<br />
"shortName": "SlapMaster",<br />
"longName": "SlapMaster",<br />
"companyName": "fieldWalking",<br />
"versionCode": 1,<br />
"versionLabel": "1.0.0",<br />
"watchapp": {<br />
"watchface": true<br />
},<br />
"appKeys": {},<br />
"resources": {<br />
"media": [<br />
{<br />
"type": "png",<br />
"name": "IMAGE",<br />
"file": "images/image.png"<br />
}<br />
]<br />
}<br />
}<br />
と地味な変更が。気づくのに時間がかかりました。
次はwindow,TextLayerなどがポインターに変更。
windowの生成がSDK1.0だと
<br />
Window window;</p>
<p>void handle_init(AppContextRef ctx) {<br />
window_init(&window, "App Name");<br />
window_set_background_color(&window, GColorBlack);<br />
window_stack_push(&window, true /* Animated */);<br />
}<br />
だったのがSDK2.0だと
<br />
Window *window;</p>
<p>static void init(void) {<br />
window = window_create();<br />
window_stack_push(window, true /* Animated */);<br />
window_set_background_color(window, GColorBlack);<br />
}<br />
Windowにレイヤーを追加する場合。
SDK1.0だと
<br /> layer_add_child(&window.layer, &textLayer.layer);<br />
だったのがSDK2.0だと
<br /> Layer *root_layer = window_get_root_layer(window);<br /> layer_add_child(root_layer, text_layer_get_layer(text_layer));<br />
レイヤーを所得するのが専用の関数からになりました。
画像に関しては専用のレイヤーが必要
SDK1.0の場合、BmpContainerに画像をリソースから時は
<br />
BmpContainer image;</p>
<p>void load_image(){<br />
bmp_init_container(RESOURCE_ID_IMAGE, &image);<br />
layer_add_child(&window.layer, &image.layer.layer);<br />
}<br />
だったのが、SDK2.0の場合
<br />
GBitmap *image;<br />
BitmapLayer *image_layer;</p>
<p>void load_image(){<br />
image = gbitmap_create_with_resource(RESOURCE_ID_IMAGE);<br />
image_layer = bitmap_layer_create((GRect) { .origin = { 0, 120 }, .size = { 144, 168 } });<br />
bitmap_layer_set_bitmap(image_layer, image);</p>
<p> Layer *root_layer = window_get_root_layer(window);<br />
layer_add_child(root_layer, bitmap_layer_get_layer(image_layer));<br />
}<br />
とBitmapLayerが必要になりました。
タイムイベントハンドラーの変更
SDK1.0で秒イベントハンドラーでtext_layerを更新する場合
<br />
void handle_second_tick(AppContextRef ctx, PebbleTickEvent *t) {</p>
<p> (void)t;<br />
(void)ctx;</p>
<p> static char timeText[] = "00:00"; // Needs to be static because it’s used by the system later</p>
<p> PblTm currentTime;<br />
get_time(&currentTime);</p>
<p> string_format_time(timeText, sizeof(timeText), "%T", &currentTime);</p>
<p> text_layer_set_text(&timeLayer, timeText);<br />
}<br />
SDK2.0で
<br />
void handle_second_tick(struct tm *tick_time, TimeUnits units_changed) {</p>
<p> static char timeText[] = "00:00";</p>
<p> strftime(timeText, sizeof(timeText), "%T", tick_time);<br />
text_layer_set_text(text_layer, timeText);<br />
}<br />
となります。
それとなぜかフォントのFONT_KEY_GOTHAM_42_BOLDがなくなり、FONT_KEY_BITHAM_42_BOLDになってました。font.hを見て使うのが確実です。
ほかにもたくさんの変更点がありますが、特によく使うのはこのあたりかと思います。
[ad][ad]



