语言

Menu
Sites
Language
이미지에 Click & Long Click 이벤트 주는 법

안녕하세요,

이미지를 하나 띄우고, 그 이미지에 evas_object_event_callback_add() 함수를 통해 Click 이벤트와 Long Click 이벤트를 주고 싶습니다.

evas_object_event_callback_add(ad->img, EVAS_CALLBACK_MOUSE_DOWN, _btn_pressed_cb, ad);

현재는 EVAS_CALLBACK_MOUSE_DOWN 을 통해 클릭 했을 때는 구별할 수 있지만 Long Click 의 경우에는 어떻게 하는지 모르겠습니다.

감사합니다.

查看选择的答案

响应

4 回复
pius lee

long click 이라는 이벤트는 Elementary, Evas에 없습니다. 하지만 다음과 같이 어렵지 않게 구현 해서 만들 수 있습니다.

포인트는 down시에 long click timer를 걸고, up이나 move시에 timer를 해제하며, timer가 작동하면 long click이 발생하게 하는 것입니다.

// ---- long click implementation
static const char* _klongtimer = "_long_timer";
static long _long_click_time = 1; // 1 sec default
static Eina_Bool _long_press_cb(void *data)
{
    Evas_Object *obj = data;
	if (data == NULL) return ECORE_CALLBACK_CANCEL;
	evas_object_smart_callback_call(obj, "longclick", NULL);

	return ECORE_CALLBACK_CANCEL;
}
static void _mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
	Ecore_Timer *timer = evas_object_data_get(obj, _klongtimer);
	if (timer != NULL) {
		ecore_timer_del(timer);
		evas_object_data_del(obj, _klongtimer);
	}
	if (timer == NULL) {
		timer = ecore_timer_add(_long_click_time, _long_press_cb, obj);
		evas_object_data_set(obj, _klongtimer, timer);
	}
}
static void _mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
	Ecore_Timer *timer = evas_object_data_get(obj, _klongtimer);
	if (timer != NULL) {
		ecore_timer_del(timer);
		evas_object_data_del(obj, _klongtimer);
	}
}
static void _mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
	Ecore_Timer *timer = evas_object_data_get(obj, _klongtimer);
	Evas_Event_Mouse_Move *ev = event_info;
	if ((ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) && timer) {
		ecore_timer_del(timer);
		evas_object_data_del(obj, _klongtimer);
	}
}
void pius_object_longclick_time_set(double time)
{
	_long_click_time = time;
}
double pius_object_longclick_time_get()
{
	return _long_click_time;
}
void pius_object_longclick_add(Evas_Object *obj, Evas_Smart_Cb func, const void *data)
{
	evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, NULL);
	evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP, _mouse_up, NULL);
	evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, NULL);
	evas_object_smart_callback_add(obj, "longclick", func, data);
}
// ----

// Usage
static void longclick(void *data, Evas_Object *obj, void *event_info)
{
    LOGI("long click!!");
}

Evas_Object *img = elm_image_add(ad->conform);
elm_image_file_set(img, path, NULL);
evas_object_size_hint_weight_set(img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(ad->conform, img);
evas_object_show(img);

pius_object_longclick_add(img, longclick, NULL);

 

시언 박

감사합니다. 많은 도움이 되었습니다 ^^

Mark as answer
Jeongsu Kim

Elementary Gesture Layer로 tap, longpress를 받을 수 있습니다.

https://developer.tizen.org/development/api-references/native-application?redirect=https%3A//developer.tizen.org/dev-guide/2.3.0/org.tizen.native.mobile.apireference/index.html

다음과 같이 사용하시면 됩니다.

ad->gesture = elm_gesture_layer_add(ad->layout);
elm_gesture_layer_attach(ad->gesture, ad->layout);
elm_gesture_layer_cb_set(ad->gesture, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_START, _gesture_tap_start_callback, ad);
elm_gesture_layer_cb_set(ad->gesture, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_MOVE, _gesture_tap_move_callback, ad);
elm_gesture_layer_cb_set(ad->gesture, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_END, _gesture_tap_end_callback, ad);
elm_gesture_layer_cb_set(ad->gesture, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_ABORT, _gesture_tap_abort_callback, ad);
elm_gesture_layer_cb_set(ad->gesture, ELM_GESTURE_N_LONG_TAPS, ELM_GESTURE_STATE_START, _gesture_long_tap_start_callback, ad);
elm_gesture_layer_cb_set(ad->gesture, ELM_GESTURE_N_LONG_TAPS, ELM_GESTURE_STATE_MOVE, _gesture_long_tap_move_callback, ad);
elm_gesture_layer_cb_set(ad->gesture, ELM_GESTURE_N_LONG_TAPS, ELM_GESTURE_STATE_END, _gesture_long_tap_end_callback, ad);
elm_gesture_layer_cb_set(ad->gesture, ELM_GESTURE_N_LONG_TAPS, ELM_GESTURE_STATE_ABORT, _gesture_long_tap_abort_callback, ad);

모든 gesture state에 callback을 걸었지만 실제로는 다음 state만 걸어도 됩니다.

1. tap의 경우 ELM_GESTURE_STATE_END

2. long tap의 경우 long press중일 때 (손가락을 떼기 전에 인식하고 싶은 경우) ELM_GESTURE_STATE_MOVE
   long press가 명시적으로 끝난 뒤  (손가락을 뗀 뒤에) ELM_GESTURE_STATE_END

 ELM_GESTURE_STATE_MOVE 로 하는 경우 long press하다가 손가락을 안떼고 움직이면 ELM_GESTURE_STATE_ABORT가 오고 ELM_GESTURE_STATE_END는 오지 않습니다.

시언 박

제스처 레이아웃을 이렇게 사용한다는 걸 처음 알았습니다. 감사합니다 ^^