SyntaxHighlighter

2016年9月5日月曜日

Pebble Timeのファームウェアが4.0になった。

Pebble Timeのファームウェアが4.0になった。
メニュー画面がシンプルになり、アイコンが表示されてわかりやすくなった。


また、QuickViewが追加され、近いイベントがウォッチフェイスに表示されるようになった。
ところがこれが曲者で、自作のWatchFaceは、ちょうどQuickViewにすっぽり隠れる位置に
情報を集約させているため、時計が見えなくなってしまうのだ。

時計が見えず、次の予定までの時間のみが見える時計、というのも、悪くはないかもしれないが困る。
一応、設定からQuickViewを無効にすれば今までどおりに使えるのだが、
せっかくのスマートウォッチな機能を無効にするのもアレである。

ので、QuickViewが表示されるときは、単にWatchFace全体を上にずらすことにした。単純明快である。

しかし、Pebble公式SDKの解説がわかりづらくて困った。自分の読解力がないだけかもしれない。
ようは簡単な話で、

今まで、
   GRect bounds = layer_get_bounds(window_layer);
で得ていた全画面の描画領域を、
   GRect bounds = layer_get_unobstructed_bounds(window_layer);
に置き換えて、座標指定を相対化してあれば勝手にずれる、という話なのだが、
自作のWatchFaceはそれではうまくいかない。

結局、描画オブジェクトを1枚のレイヤーに集約し、

   GRect QVbounds = layer_get_unobstructed_bounds(window_layer);
   layer_set_bounds(all_layer, GRect(0, QVbounds.size.h +(0-168), QVbounds.size.w, 168));
で移動。

しかしこれでは、表示中にQuickViewが現れた場合に対応しないので、
//unobstructedハンドラ
static void prv_unobstructed_will_change(GRect final_unobstructed_screen_area,
void *context) {
  GRect bounds = final_unobstructed_screen_area;
  layer_set_bounds(all_layer, GRect(0, bounds.size.h +(0-168), bounds.size.w, 168));
}

//unobstructedハンドラ
static void prv_unobstructed_did_change() {
   Layer *window_layer = window_get_root_layer(s_main_window);
  GRect bounds = layer_get_unobstructed_bounds(window_layer);

  layer_set_bounds(all_layer, GRect(0, bounds.size.h +(0-168), bounds.size.w, 168));
}
を追加。

static void main_window_load(Window *window) 
  //画面領域サービス(Quickview)に登録する
  UnobstructedAreaHandlers handlers = {
    .will_change = prv_unobstructed_will_change,
    .did_change = prv_unobstructed_did_change
  };
  unobstructed_area_service_subscribe(handlers, NULL);
を追加。

でなんとかなった。
詳細は後でサンプルを上げようと思う。

1 件のコメント:

  1. 大変参考になりました。ありがとうございました。

    返信削除