0

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で説明されているように)。私は2つの変種を試しました。

バリアント 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 サンプル「クロノグラフ ウォッチ」に基づいています。実際には 4 つの異なる Evas_Object があります。

  1. evas_object_resize(勝利、幅、高さ);
  2. evas_object_resize(背景、幅、高さ);
  3. evas_object_resize(chronograph_layout, DIAM_SCREEN, DIAM_SCREEN);
  4. evas_object_resize(部品、size_w、size_h);

ジェスチャ レイヤーはどこに追加すればよいですか? 1に追加すると、バリアントAは何もせず、バリアントBは機能しますが、ウォッチフェイスを覆います. 他のいずれかでそれを行うと、両方のバリアントが機能しますが、ウォッチフェイスが覆われます。透明色を指定しているので、その理由がわかりません。

編集: 1 つの新しい考え: タッチ ジェスチャ レイヤーはアプリでのみ機能し、ウォッチフェイスでは機能しないのではないでしょうか?

4

2 に答える 2

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);
}
于 2020-05-21T11:35:33.960 に答える