Languages

Menu
Sites
Language
table에 tap 제스처 사용

안녕하세요 tizen native 어플리케이션을 개발하고 있습니다.

다음 사이트를 참고하여 thread를 돌려 table 에 입력되는  tap, dobule tap을 구분 하는 앱을 개발하고 있습니다.

https://developer.tizen.org/development/ui-practices/native-application/efl/ui-component-infrastructure-modules/handling-touch-gestures?langredirect=1#tap

Evas_Object *r;
    Evas_Object *g;


    r = evas_object_rectangle_add(evas_object_evas_get(parent));
    evas_object_move(r, 0, 0);
    evas_object_color_set(r, 0, 0, 0, 0);
    evas_object_resize(r,360,360);
    //elm_win_resize_object_add(parent, r);

    //제스처 레이어를 만들어 이벤트를 받을 대상이 되는 object 추가.
    g = elm_gesture_layer_add(parent);
    elm_gesture_layer_attach(g, r);
    evas_object_show(r);

    while (1) {
        dlog_print(DLOG_INFO, "STYLE", "thread run");

        /*single_tap*/
        elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_END,
                n_finger_tap_end, NULL);

        /*double_tap */
        elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
                ELM_GESTURE_STATE_END, dbl_click_end, NULL);

        //ecore_thread_feedback(thread, pd);

        usleep(3000);

        if (pd->data == 1)
            ecore_thread_cancel(thread);
        if (ecore_thread_check(thread))
            break;  // 스레드가 취소 보류에 있는지 체크
    }

소스는 위와 같이 구성되어 있습니다. 파라미터가 되는 parent는 table입니다.

tap또는 double tap이 입력되었을 경우 ap->data를 1로 변경하여 thread를 멈추는 부분을 테스트하고 있는데요.

thread는 정상적으로 돌고 있지만, tap하고 dobule tap입력이 되지 않아 해결방안에 대해 질문을 올립니다.

Responses

1 Replies
Afroza Yasmin

Dear 재규 신,

I don't think you need to add the following lines:

       /*single_tap*/
         elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_END,
                 n_finger_tap_end, NULL);

        /*double_tap */
         elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
                 ELM_GESTURE_STATE_END, dbl_click_end, NULL);

in while loop.

Whatever you want to do for single/double tap can be written in the callbacks  n_finger_tap_end and dbl_click_end respectively.

Here is my sample code for single and double tap. Hope it will help:

File:gesturetest.h

#ifndef __gesturetest_H__
#define __gesturetest_H__

#include <app.h>
#include <Elementary.h>
#include <system_settings.h>
#include <efl_extension.h>
#include <dlog.h>

#ifdef  LOG_TAG
#undef  LOG_TAG
#endif
#define LOG_TAG "gesturetest"

#if !defined(PACKAGE)
#define PACKAGE "org.example.gesturetest"
#endif

#endif /* __gesturetest_H__ */

File: gesturetest.c:

#include "gesturetest.h"

typedef struct appdata {
 Evas_Object *win;
 Evas_Object *conform;
 Evas_Object *label;
 Evas_Object *r;
 Evas_Object *g;
} appdata_s;

static Evas_Event_Flags
n_finger_tap_end(void *data, void *event_info)
{

 appdata_s *ad = data;
   elm_object_text_set(ad->label, "<align=center>Single Tap End</align>");
   return EVAS_EVENT_FLAG_ON_HOLD;
}
static Evas_Event_Flags
dbl_click_end(void *data, void *event_info)
{
 appdata_s *ad = data;
   elm_object_text_set(ad->label, "<align=center>Double Tap End</align>");
   return EVAS_EVENT_FLAG_ON_HOLD;
}
static void
win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
{
 ui_app_exit();
}

static void
win_back_cb(void *data, Evas_Object *obj, void *event_info)
{
 appdata_s *ad = data;
 /* Let window go to hide state. */
 elm_win_lower(ad->win);
}

static void
create_base_gui(appdata_s *ad)
{
 /* Window */
 /* Create and initialize elm_win.
    elm_win is mandatory to manipulate window. */
 ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
 elm_win_autodel_set(ad->win, EINA_TRUE);

 if (elm_win_wm_rotation_supported_get(ad->win)) {
  int rots[4] = { 0, 90, 180, 270 };
  elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
 }

 evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
 eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);

 ad->conform = elm_conformant_add(ad->win);
 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
 elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
 evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
 elm_win_resize_object_add(ad->win, ad->conform);
 evas_object_show(ad->conform);

 ad->r = evas_object_rectangle_add(evas_object_evas_get(ad->win));
 evas_object_move(ad->r, 0, 0);
 evas_object_color_set(ad->r,0, 0, 0, 0);
 elm_win_resize_object_add(ad->win, ad->r);
 //evas_object_resize(ad->r, 200,200);


 // Gesture layer object
 ad->g = elm_gesture_layer_add(ad->win);
 elm_gesture_layer_attach(ad->g, ad->r);
 evas_object_show(ad->r);
 /* Show window after base gui is set up */
 ad->label = elm_label_add(ad->conform);
    elm_object_text_set(ad->label, "<align=center>Tap/Double Tap anywhere.</align>");
 evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
 elm_object_content_set(ad->conform, ad->label);

 elm_gesture_layer_cb_set(ad->g, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_END,
                          n_finger_tap_end,  ad);
 elm_gesture_layer_cb_set(ad->g, ELM_GESTURE_N_DOUBLE_TAPS, ELM_GESTURE_STATE_END,
                          dbl_click_end, ad);
 evas_object_show(ad->win);
}

static bool
app_create(void *data)
{
 appdata_s *ad = data;

 create_base_gui(ad);

 return true;
}

 

int
main(int argc, char *argv[])
{
 appdata_s ad = {0,};
 int ret = 0;

 ui_app_lifecycle_callback_s event_callback = {0,};


 event_callback.create = app_create;

 ret = ui_app_main(argc, argv, &event_callback, &ad);
 if (ret != APP_ERROR_NONE) {
  dlog_print(DLOG_ERROR, LOG_TAG, "app_main() is failed. err = %d", ret);
 }

 return ret;
}