pebbleのクリック時イベントです。
API
クリック時のイベントはAPIドキュメントのPebble SDK->Modules->User Interface->Clicksにもありますが、登録する関数はwindowやレイヤーごとにあったりします。
ウィンドウへのクリックイベントの登録
API | 説明 |
---|---|
void* window_get_click_config_context ( Window * window) | windowオブジェクトに紐付いたクリックコンフィグプロバイダーのコンテキストを取得 |
ClickConfigProvider window_get_click_config_provider ( const Window * window) | windowに紐付いたクリックコンフィグプロバイダを取得 |
void window_set_click_config_provider(… | クリック時の動作を登録する関数を登録する |
void window_set_click_config_provider_with_context(… | クリック次の動作を登録する関数を登録し、クリック時に渡すコンテキストも登録する |
void window_set_click_context(… | windowにクリック時に渡すもコンテキストを登録する |
クリックイベントの種類別の登録
API | 説明 |
---|---|
window_single_click_subscribe | 普通にボタンを押した時の処理の登録。 |
window_long_click_subscribe | ボタンを長押した時の処理の登録。長押しと認識するまでの時間も決めることが出来る。 |
window_single_repeating_click_subscribe | ボタンを押している間連続して呼ばれる処理の登録 |
window_multi_click_subscribe | 短い間隔でボタンを連続でおした時の処理の登録 |
window_raw_click_subscribe | ボタンを押した時、話した時の処理の登録(長押し、リピート、連続クリックのような判定を行なっていない生のクリック動作) |
クリックイベントのイベントデータの取得
API | 説明 |
---|---|
click_number_of_clicks_counted | クリック数を取得する |
click_recognizer_get_button_id | ボタンのIDを取得する |
click_recognizer_is_repeating | クリックイベントがリピートによるものかを取得する |
- クリックコンフィグプロバイダ(click configuration provider)は、次の例のようなwindow_xxxxxxxxxx_click_subscribe関数でボタンを登録するための関数のことを言います。
[code lang=c]
void click_config_provider(void *context) {
const uint16_t repeat_interval_ms = 1000;
window_single_repeating_click_subscribe(BUTTON_ID_SELECT, repeat_interval_ms, select_single_click_handler);
window_single_repeating_click_subscribe(BUTTON_ID_UP, repeat_interval_ms, up_single_click_handler);
window_single_repeating_click_subscribe(BUTTON_ID_DOWN, repeat_interval_ms, down_single_click_handler);
}
[/code]
multiの動作
次のような感じで書くと、2連続でボタンを押すとselect_multi_click_handlerが呼ばれます。
[code lang=c]
window_multi_click_subscribe(BUTTON_ID_SELECT, 2, 10, 0, true, select_multi_click_handler);
[/code]
さらに、連続して10回押すと、select_multi_click_handlerが呼ばれます。
さらに、連続して14回押すと、10回目で一回select_multi_click_handlerが呼ばれ、連続しておした残りの4回目でselect_multi_click_handlerが呼ばれます。
何回押されて呼び出されたかは、click_number_of_clicks_countedを呼び出すとわかるようです。
[code lang=c]
static void select_multi_click_handler(ClickRecognizerRef recognizer, void *context) {
const uint16_t count = click_number_of_clicks_counted(recognizer);
APP_LOG(APP_LOG_LEVEL_DEBUG, “Multi-Click: count:%u”, count);
}
[/code]
例
デフォルトプロジェクトの例です。
[code lang=c] static Window *window; static void select_click_handler(ClickRecognizerRef recognizer, void *context) { static void up_click_handler(ClickRecognizerRef recognizer, void *context) { static void down_click_handler(ClickRecognizerRef recognizer, void *context) { static void click_config_provider(void *context) { static void window_load(Window *window) { text_layer = text_layer_create((GRect) { .origin = { 0, 72 }, .size = { bounds.size.w, 20 } }); static void window_unload(Window *window) { static void init(void) { static void deinit(void) { int main(void) { APP_LOG(APP_LOG_LEVEL_DEBUG, “Done initializing, pushed window: %p”, window); app_event_loop(); クリックした時の動作は、singleでもlongでもmultiでもrepeatでも一緒で、ClickHandlerの関数で書きます。 [code lang=c] static void up_click_handler(ClickRecognizerRef recognizer, void *context) { static void down_click_handler(ClickRecognizerRef recognizer, void *context) { 作成したクリック時の処理を登録するのが、ClickConfigProviderの関数で、ココではclick_config_providerです。 さらに、その関数をwindow_set_click_config_providerで作成したwindowに対して登録しています。 [code lang=c] static void init(void) { クリック時のイベントはデフォルトプロジェクトのコピペで済ませてましたが、window_raw_click_subscribeってのもあるのですね。
#include
static TextLayer *text_layer;
text_layer_set_text(text_layer, “Select”);
}
text_layer_set_text(text_layer, “Up”);
}
text_layer_set_text(text_layer, “Down”);
}
window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);
window_single_click_subscribe(BUTTON_ID_UP, up_click_handler);
window_single_click_subscribe(BUTTON_ID_DOWN, down_click_handler);
}
Layer *window_layer = window_get_root_layer(window);
GRect bounds = layer_get_bounds(window_layer);
text_layer_set_text(text_layer, “Press a button”);
text_layer_set_text_alignment(text_layer, GTextAlignmentCenter);
layer_add_child(window_layer, text_layer_get_layer(text_layer));
}
text_layer_destroy(text_layer);
}
window = window_create();
window_set_click_config_provider(window, click_config_provider);
window_set_window_handlers(window, (WindowHandlers) {
.load = window_load,
.unload = window_unload,
});
const bool animated = true;
window_stack_push(window, animated);
}
window_destroy(window);
}
init();
deinit();
}
[/code]クリックした時の動作
static void select_click_handler(ClickRecognizerRef recognizer, void *context) {
text_layer_set_text(text_layer, “Select”);
}
text_layer_set_text(text_layer, “Up”);
}
text_layer_set_text(text_layer, “Down”);
}
[/code]クリック処理の登録
上で作ったクリック時のイベントを、window_single_click_subscribeで登録しています。
第1引数(BUTTON_ID_SELECTとか)でどのボタンが押された時に呼ばれるか指定して、第2引数で関数を指定子ます。
static void click_config_provider(void *context) {
window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);
window_single_click_subscribe(BUTTON_ID_UP, up_click_handler);
window_single_click_subscribe(BUTTON_ID_DOWN, down_click_handler);
}
window = window_create();
window_set_click_config_provider(window, click_config_provider);
…
}
[/code]まとめ