【问题标题】:How can I add touch to a watch face (EFL)如何为表盘添加触摸 (EFL)
【发布时间】:2020-09-07 14:24:46
【问题描述】:

我正在尝试将触摸事件添加到我正在使用 EFL 库开发的表盘中。但是触摸层要么不工作,要么当它工作时,它完全覆盖了我的表盘,虽然它应该是透明的。

我创建监视窗口的代码是:

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 - 我使用为手表创建的相同窗口 (win)。没有错误,但它不起作用,没有触摸事件:

/* 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:

  1. evas_object_resize(win, width, height);
  2. evas_object_resize(bg, 宽度, 高度);
  3. evas_object_resize(chronograph_layout, DIAM_SCREEN, DIAM_SCREEN);
  4. evas_object_resize(parts, size_w, size_h);

我应该在哪里添加手势图层?当我将它添加到 1 时,变体 A 什么都不做,变体 B 工作但覆盖了表盘。如果我在其中一个上执行此操作,则两个变体都可以工作,但会覆盖表盘。我不明白为什么,因为我指定的是透明颜色。

编辑:一个新想法:触摸手势层是否仅适用于应用程序,而不适用于表盘?

【问题讨论】:

    标签: touch tizen tizen-native-app watchface efl


    【解决方案1】:

    chronographwatch App的widget树是

    Win -> Bg -> 布局 -> 图片

    这个示例应用的顶视图是 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。

    希望你能找到解决办法。

    【讨论】:

    • 这成功了!就这么简单。官方文档让我觉得我需要一个透明的矩形,这让我很困惑,这更复杂,而且我从来没有让它透明。谢谢李宇灿!
    • 嗯...我写了官方文档;;;不管怎么说,还是要谢谢你。大声笑
    • 哦,我明白了 ? 这可能是因为我是 Tizen 新手。我仍然需要弄清楚很多事情。感谢您的帮助
    【解决方案2】:

    您不需要为手势图层创建新窗口。

    您从 API 获得了一个窗口。那么您是否使用 elm_win_add API 创建了一个新窗口?

    我下面的示例代码运行良好。窗户是透明的。

    如果没有发现错误,请仔细查看代码。

    你为什么不分享你的完整代码。我会环顾四周。

    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);
    }
    

    【讨论】:

    • 谢谢李宇昌!我检查了你的代码,发现它与变体 A 基本相同,除了我使用 elm_win_util_standard_add 的地方你使用 elm_win_add。我以为就是这样!但是我试过了,还是不行。顺便说一句,我的项目基于 SDK 示例“计时手表”。实际上有 4 种不同的 Evas_Object: evas_object_resize(win, width, height);
      evas_object_resize(bg, width, height); evas_object_resize(chronograph_layout, DIAM_SCREEN, DIAM_SCREEN); evas_object_resize(parts, size_w, size_h);我应该在哪里添加手势层?
    • 由于cmets中的格式有限,所以我在原问题的末尾添加了这些信息
    • 我还查看了使用 EVAS_CALLBACK_MOUSE_DOWN 的另一种方法。我试了一下,瞧——它奏效了! (我将它添加到chronograph_layout 对象中)我可以获得鼠标按下事件。但是这种方法是否受到某种限制?我喜欢这些手势的地方在于,长按、线条、缩放等一切都已经定义好了。值得尝试让它发挥作用吗?还是我错过了什么,两种方法都提供所有类型的事件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2016-12-26
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多