语言

Menu
Sites
Language
scroller 에 올린 이미지에 clicked event 처리 관련 문의

scroller 에 box를 하나 올리고, box 에 image를 5개 추가하였습니다.

    layout = elm_layout_add(ad->nf);
    ...
    scroller = elm_scroller_add(layout);
    evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    elm_scroller_page_size_set(scroller, 280, 0);
    elm_scroller_bounce_set(scroller, EINA_TRUE, EINA_FALSE);
    elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_OFF);
    evas_object_smart_callback_add(scroller, "scroll,anim,stop", _scroll_stop_cb, ad);

 

각 이미지마다 callback event 를 넣었는데, clicked 으로 하니 플리킹을 위해 클릭을 해도 callback 이 호출 됩니다.

뭔가 다른 방법이 없을까요? 

"clicked" 말고 다른 event 를 넣어야 하는 건지?

아시는 분 계시면 답글 부탁드립니다.

    box = elm_box_add(scroller);
    elm_box_horizontal_set(box, EINA_TRUE);
	
	for (i = 0; i < 5; i++)
	{
		image = create_image(box, "dummy.png", 280, 176);
		evas_object_smart_callback_add(image, "clicked", _check_cb, i);
		elm_box_pack_end(box, image);
		evas_object_show(image);
	}

 

编辑者为: Seong Jun Bang 30 9月, 2015

响应

3 回复
Jeongsu Kim

clicked 시그널은 해당 object에서 mouse down -> mouse up이 있으면 발생합니다. 중간에 mouse move가 있어도, mouse down -> up 시간차가 있어도 상관 없습니다.

일반 pc에서 버튼을 누를 때랑 비슷한 동작입니다.

따라서 clicked가 왔을 때 정말 실행시켜야 하는 상황인가 판단이 필요한데요. 번거롭지만 다음과 같이 처리가 가능할 것 같습니다.

1. clicked 시그널 처리 여부를 나타내는 flag 변수 추가
2. mouse down에 해당 flag 변수 초기화 (scroller나 box에 들어가는 image에 callback을 등록)
3. scroller의 scrolled signal을 받으면 해당 flag 변수 set
4. clicked에서 해당 변수가 set 되어 있으면 무시

gesture layer를 이용하는 방법도 있을거 같습니다.

1. scroller에 elm gesture layer 추가
2. gesture layer에 tap callback 등록
3. tap callback이 불렸을 때 해당 point의 image 찾음 (elm_scroller_region_get 함수로 현재 보이는 영역 얻어와서 이미지 크기로 계산)
4. 해당 image의 clicked 함수 실행

이미지 크기가 다 같다면  gengrid를 쓰는 것도 좋을 것 같습니다.

Seong Jun Bang

우선 답글 감사드립니다.. ^^

scroller에 callback event를 scroll start/stop, scroll drag start/stop 을 등록하고

flag를 써서 drag start 에서 flag set,

scroll stop 에서 flag 해제하여

clicked callback 이 다행이도 scroll stop 전에 오긴 하여

scroll 될 때는 처리가 가능한 것으로 보입니다.

그런데, scroll 양 끝에서는 drag start, stop callback -> clicked callback 이 호출되어

좌표값이나 다른 조건을 보고 판단을 해야 될거 같아 조금 난감한 상황이네욤.. ㅡ.ㅡ

말씀해주신 gesture layer 나 gengrid 는 아직 써보질 않아서... ^^ 두렵네용.. ㅋ 타이젠은 아직.. 두려움의 대상... ㅎ

Jeongsu Kim

이미 drag가 시작되었다면 이후 clicked는 의미가 없을테니 drag stop에서 flag를 초기화 하지 않아도 될거 같습니다.

1. mouse down에서 flag 초기화
2. drag start가 오면 flag 설정
3. clicked에서 flag가 설정되어 있으면 무시

이런 순서로 해보세요.