如何向表盘添加触摸 (EFL)
How can I add touch to a watch face (EFL)
我正在尝试向我使用 EFL 库开发的表盘添加触摸事件。但是触摸层要么不起作用,要么在起作用时完全覆盖了我的表盘,尽管它应该是透明的。
我创建手表的代码 window 是:
Evas_Object *win = NULL;
int ret = EINA_FALSE;
/*
* Get watch window object
*/
ret = watch_app_get_elm_win(&win);
if (ret != APP_ERROR_NONE) {
dlog_print(DLOG_ERROR, LOG_TAG, "failed to get watch window. err = %d", ret);
return NULL;
}
evas_object_resize(win, width, height);
/* <Variant A or B here> */
evas_object_show(win);
然后我尝试创建一个透明手势层和触摸回调(如 https://docs.tizen.org/application/native/guides/ui/efl/touch-gesture 中所述)。我尝试了两种变体。
变体 A - 我使用我为手表创建的相同 window(获胜)。没有错误,但它不起作用,没有触摸事件:
/* Variant A */
/* Gesture layer transparent object */
Evas_Object *r;
/* Gesture layer object */
Evas_Object *g;
win = elm_win_util_standard_add("gesture_layer", "Gesture Layer");
elm_win_autodel_set(win, EINA_TRUE);
/* Gesture layer transparent object */
r = evas_object_rectangle_add(evas_object_evas_get(win));
evas_object_move(r, 0, 0);
evas_object_color_set(r, 0, 0, 255, 128);
elm_win_resize_object_add(win, r);
/* Gesture layer object */
g = elm_gesture_layer_add(win);
elm_gesture_layer_attach(g, r);
evas_object_show(r);
/* Set callbacks */
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_START, n_finger_tap_start, NULL);
变体 B - 我将单独的对象 winTouch 用于触摸层。它可以工作,但是图层看起来完全不透明并且看不到表盘:
/* Variant B */
Evas_Object *winTouch;
/* Gesture layer transparent object */
Evas_Object *r;
/* Gesture layer object */
Evas_Object *g;
winTouch = elm_win_util_standard_add("gesture_layer", "Gesture Layer");
elm_win_autodel_set(winTouch, EINA_TRUE);
/* Gesture layer transparent object */
r = evas_object_rectangle_add(evas_object_evas_get(winTouch));
evas_object_move(r, 0, 0);
evas_object_color_set(r, 0, 0, 255, 0);
elm_win_resize_object_add(winTouch, r);
/* Gesture layer object */
g = elm_gesture_layer_add(winTouch);
elm_gesture_layer_attach(g, r);
evas_object_show(r);
evas_object_show(winTouch); // <--- Without this line, Variant B behaves like Variant A
/* Set callbacks */
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_START, n_finger_tap_start, NULL);
// and other callbacks
我做错了什么?
我的项目基于 SDK 示例 "Chronograph Watch"。实际上有 4 个不同的 Evas_Object:
- evas_object_resize(胜利, 宽度, 高度);
- evas_object_resize(背景, 宽度, 高度);
- evas_object_resize(chronograph_layout, DIAM_SCREEN, DIAM_SCREEN);
- evas_object_resize(零件,size_w,size_h);
我应该在哪里添加手势图层?当我将它添加到 1 时,变体 A 什么都不做,变体 B 起作用但覆盖了表盘。如果我在其中一个上执行此操作,则两个变体都可以工作但会覆盖表盘。我不明白为什么,因为我指定了透明颜色。
编辑:一个新想法:触摸手势层是否只适用于应用程序,不适用于表盘?
您不需要为手势层创建新的window。
你从 API 得到了一个 window。那么你是否使用 elm_win_add API 创建了一个新的 window?
我下面的示例代码运行良好。 window 是透明的。
请看你仔细编码,如果你没有发现错误的话。
你为什么不分享你的完整代码。我会四处看看。
static Evas_Event_Flags
n_finger_tap_start(void *data , void *event_info)
{
printf("tap start\n");
return EVAS_EVENT_FLAG_ON_HOLD;
}
void
test_gesture_layer(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Evas_Coord w, h;
Evas_Object *win;
w = 480;
h = 800;
win = elm_win_add(NULL, "gesture-layer", ELM_WIN_BASIC);
elm_win_title_set(win, "Gesture Layer");
elm_win_autodel_set(win, EINA_TRUE);
evas_object_resize(win, w, h);
Evas_Object *r, *g;
r = evas_object_rectangle_add(evas_object_evas_get(win));
evas_object_move(r, 0, 0);
evas_object_color_set(r, 0, 0, 0, 0);
elm_win_resize_object_add(win, r);
g = elm_gesture_layer_add(win);
elm_gesture_layer_attach(g, r);
evas_object_show(r);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
ELM_GESTURE_STATE_START, n_finger_tap_start, NULL);
evas_object_show(win);
}
- 无论如何,我建议您在 window 上添加触摸事件回调。
参考 https://docs.tizen.org/iot/api/5.0/tizen-iot-headed/Example_Evas_Images_2.html
此页面找到 EVAS_CALLBACK_MOUSE_DOWN、EVAS_CALLBACK_MOUSE_UP.
chronographwatch App的widget树为
Win -> Bg -> Layout -> Images
此示例应用的顶视图是 Layout(main.edc),因此您应该在其上附加手势层。
Evas_Object *gesture;
gesture = elm_gesture_layer_add(chronograph_layout);
elm_gesture_layer_attach(gesture, chronograph_layout);
elm_gesture_layer_cb_set(gesture, ELM_GESTURE_N_TAPS,
ELM_GESTURE_STATE_START, n_finger_tap_start, NULL);
elm_gesture_layer_cb_set(gesture, ELM_GESTURE_N_TAPS,
ELM_GESTURE_STATE_END, n_finger_tap_end, NULL);
我可以正常获取事件。
- 如果您想使用系统定义的手势,例如轻弹、缩放、旋转、长按
你需要使用手势层。
但是如果你只是想在对象上获得触摸事件。只需使用 EVAS_CALLBACK_MOUSE_XXX.
希望你有解决办法。
我正在尝试向我使用 EFL 库开发的表盘添加触摸事件。但是触摸层要么不起作用,要么在起作用时完全覆盖了我的表盘,尽管它应该是透明的。
我创建手表的代码 window 是:
Evas_Object *win = NULL;
int ret = EINA_FALSE;
/*
* Get watch window object
*/
ret = watch_app_get_elm_win(&win);
if (ret != APP_ERROR_NONE) {
dlog_print(DLOG_ERROR, LOG_TAG, "failed to get watch window. err = %d", ret);
return NULL;
}
evas_object_resize(win, width, height);
/* <Variant A or B here> */
evas_object_show(win);
然后我尝试创建一个透明手势层和触摸回调(如 https://docs.tizen.org/application/native/guides/ui/efl/touch-gesture 中所述)。我尝试了两种变体。
变体 A - 我使用我为手表创建的相同 window(获胜)。没有错误,但它不起作用,没有触摸事件:
/* Variant A */
/* Gesture layer transparent object */
Evas_Object *r;
/* Gesture layer object */
Evas_Object *g;
win = elm_win_util_standard_add("gesture_layer", "Gesture Layer");
elm_win_autodel_set(win, EINA_TRUE);
/* Gesture layer transparent object */
r = evas_object_rectangle_add(evas_object_evas_get(win));
evas_object_move(r, 0, 0);
evas_object_color_set(r, 0, 0, 255, 128);
elm_win_resize_object_add(win, r);
/* Gesture layer object */
g = elm_gesture_layer_add(win);
elm_gesture_layer_attach(g, r);
evas_object_show(r);
/* Set callbacks */
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_START, n_finger_tap_start, NULL);
变体 B - 我将单独的对象 winTouch 用于触摸层。它可以工作,但是图层看起来完全不透明并且看不到表盘:
/* Variant B */
Evas_Object *winTouch;
/* Gesture layer transparent object */
Evas_Object *r;
/* Gesture layer object */
Evas_Object *g;
winTouch = elm_win_util_standard_add("gesture_layer", "Gesture Layer");
elm_win_autodel_set(winTouch, EINA_TRUE);
/* Gesture layer transparent object */
r = evas_object_rectangle_add(evas_object_evas_get(winTouch));
evas_object_move(r, 0, 0);
evas_object_color_set(r, 0, 0, 255, 0);
elm_win_resize_object_add(winTouch, r);
/* Gesture layer object */
g = elm_gesture_layer_add(winTouch);
elm_gesture_layer_attach(g, r);
evas_object_show(r);
evas_object_show(winTouch); // <--- Without this line, Variant B behaves like Variant A
/* Set callbacks */
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_START, n_finger_tap_start, NULL);
// and other callbacks
我做错了什么?
我的项目基于 SDK 示例 "Chronograph Watch"。实际上有 4 个不同的 Evas_Object:
- evas_object_resize(胜利, 宽度, 高度);
- evas_object_resize(背景, 宽度, 高度);
- evas_object_resize(chronograph_layout, DIAM_SCREEN, DIAM_SCREEN);
- evas_object_resize(零件,size_w,size_h);
我应该在哪里添加手势图层?当我将它添加到 1 时,变体 A 什么都不做,变体 B 起作用但覆盖了表盘。如果我在其中一个上执行此操作,则两个变体都可以工作但会覆盖表盘。我不明白为什么,因为我指定了透明颜色。
编辑:一个新想法:触摸手势层是否只适用于应用程序,不适用于表盘?
您不需要为手势层创建新的window。
你从 API 得到了一个 window。那么你是否使用 elm_win_add API 创建了一个新的 window?
我下面的示例代码运行良好。 window 是透明的。
请看你仔细编码,如果你没有发现错误的话。
你为什么不分享你的完整代码。我会四处看看。
static Evas_Event_Flags
n_finger_tap_start(void *data , void *event_info)
{
printf("tap start\n");
return EVAS_EVENT_FLAG_ON_HOLD;
}
void
test_gesture_layer(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Evas_Coord w, h;
Evas_Object *win;
w = 480;
h = 800;
win = elm_win_add(NULL, "gesture-layer", ELM_WIN_BASIC);
elm_win_title_set(win, "Gesture Layer");
elm_win_autodel_set(win, EINA_TRUE);
evas_object_resize(win, w, h);
Evas_Object *r, *g;
r = evas_object_rectangle_add(evas_object_evas_get(win));
evas_object_move(r, 0, 0);
evas_object_color_set(r, 0, 0, 0, 0);
elm_win_resize_object_add(win, r);
g = elm_gesture_layer_add(win);
elm_gesture_layer_attach(g, r);
evas_object_show(r);
elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
ELM_GESTURE_STATE_START, n_finger_tap_start, NULL);
evas_object_show(win);
}
- 无论如何,我建议您在 window 上添加触摸事件回调。 参考 https://docs.tizen.org/iot/api/5.0/tizen-iot-headed/Example_Evas_Images_2.html 此页面找到 EVAS_CALLBACK_MOUSE_DOWN、EVAS_CALLBACK_MOUSE_UP.
chronographwatch App的widget树为
Win -> Bg -> Layout -> Images
此示例应用的顶视图是 Layout(main.edc),因此您应该在其上附加手势层。
Evas_Object *gesture;
gesture = elm_gesture_layer_add(chronograph_layout);
elm_gesture_layer_attach(gesture, chronograph_layout);
elm_gesture_layer_cb_set(gesture, ELM_GESTURE_N_TAPS,
ELM_GESTURE_STATE_START, n_finger_tap_start, NULL);
elm_gesture_layer_cb_set(gesture, ELM_GESTURE_N_TAPS,
ELM_GESTURE_STATE_END, n_finger_tap_end, NULL);
我可以正常获取事件。
- 如果您想使用系统定义的手势,例如轻弹、缩放、旋转、长按 你需要使用手势层。 但是如果你只是想在对象上获得触摸事件。只需使用 EVAS_CALLBACK_MOUSE_XXX.
希望你有解决办法。