Languages

Menu
Sites
Language
cairo에서 Fade out effect 관련...

안녕하세요...

cairo의 cairo_move_to / cairo_line_to 를 이용하여 그리는 것에 성공하였으나,, 

어떤 이벤트 상황에서 그려진 path를 지우고 싶습니다... 방법 좀 알려 주세요..

혹, cairo_set_source_rgba(cairo, 1,1,1,1); 이런 식으로 지우는 것이 맞는 지요?

또 한가지로,,,

evas의 경우에는 아래의 방법으로 그려진 변수 part를 transit 하였습니다. cairo도 아래와 같이 transit을 사용하고 싶습니다.

혹, 가능하다면 방법 좀 알려 주시면 감사하겠습니다. 

part = evas_object_line_add(s_info.evas);

evas_object_line_xy_set(part, x1, y1, x2, y2);

elm_transit_object_add(transit, part);

감사합니다.

 

Edited by: na on 22 Dec, 2015

Responses

9 Replies
Jeongsu Kim

안녕하세요.

1. 이미 그린거에서 지우는 것 보다 해당 상황에 다시 그리는게 더 쉬울 것 같습니다.

2. cairo로 그린 이미지를 가지는 evas image object가 있을 것으로 예상되는데 그 object를 elm_transit 에 넣어주면 될 것 같습니다.

na

답변 감사합니다.

우선 제가 하려고 하는 것은,,,  mouse down - move 를 통해 얻은 좌표값을 이용하여 선을 그린 후

up 때 그려진 선을 Fade out effect 를 주어 사라지게 하고 싶습니다.

즉, 각 그려지는 선마다 Fade out effect를 주고 싶을때 좋은 방법이 있는지요?

 

elm_transit에 evas image object를 넣을 경우 그려진 선 뿐만 아닌 배경?(캡쳐된) 또한 같이 영향을 주어,,,

저는 그려진 선에만 이 효과를 주고 싶어서요...

참고로 아래와 같이 하였을 경우 입니다.

 cairo_move_to (ccairo, x1, y1);
 cairo_line_to (ccairo, x2, y2);

 unsigned char * imageData = cairo_image_surface_get_data(cairo_get_target(ccairo));
 evas_object_image_data_set(s_info.draw_area, imageData);
 evas_object_image_data_update_add(s_info.draw_area, 0, 0, s_info.width, s_info.height);

 Elm_Transit *transit = elm_transit_add();

 elm_transit_duration_set(transit, 5.0);
 elm_transit_effect_fade_add(transit);
 elm_transit_effect_color_add(transit,
    255, 0, 0, 255,
    0, 0, 0, 0);
 elm_transit_objects_final_state_keep_set(transit, EINA_TRUE);
 elm_transit_object_add(transit, s_info.draw_area);

elm_transit_go(transit);

감사합니다.

 

 

Jeongsu Kim

말씀하신 배경이 같은 evas image object에 그려져 있나요?
배경을 같이 놓아야 할 필요가 없다면
배경 자체는  elm_image나 evas image object로 아래에 깔고
실제 cairo로 그리는 object만 별도로 쓰시는게 좋을 것 같습니다.
 

그리고 말씀하신 각 그려지는 선마다 fade out effect를 넣으려면
각 그려지는 선마다 별개의 evas image object로 만드는게 좋을 것 같습니다.

1. mouse down -> evas image object 생성
2. mouse move -> cairo로 선 그리기
3. mouse up -> 해당 object fade out effect

na

답변 감사합니다!!

말씀하신 것 처럼 아래와 같이 테스트 하였습니다.

아래와 같이 작성하니, mouse up 할때마다 fade out 효과가 있으나,,,

fade out 효과 중 일때에는 더 이상 drawing 할 수 없고 fade out 효과가 끝난 뒤에 drawing이 가능 할 수 있어요...

어떻게 하면 fade out 효과 중에도 겹쳐 쓰기가 가능하나요?

 

int transitPos = 0;

1. mouse down -> evas image object 생성

 if(ad->surface)
 {
  cairo_surface_destroy(ad->surface);
  cairo_destroy(ad->cairo);
  ad->surface = NULL;
  ad->cairo = NULL;
 }

 Evas_Object *image = evas_object_image_filled_add(ad->evas);

 evas_object_image_size_set(image, ad->width, ad->height);
 evas_object_resize(image, ad->width, ad->height);
 evas_object_color_set(image, 255, 255, 255, 60);
 evas_object_show(image);


 ad->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ad->width, ad->height);
 ad->cairo = cairo_create (ad->surface);
 cairo_set_source_rgba(ad->cairo, 0.0, 1.0, 1.0, 1.0);

 ad->objects = eina_list_append(ad->objects, image);

 

2. mouse move -> cairo로 선 그리기

 cairo_move_to (ad->cairo, x1, y1);
 cairo_line_to (ad->cairo, x2, y2);
 cairo_close_path (ad->cairo);

 cairo_stroke(ad->cairo);
 cairo_surface_flush(ad->surface);
 unsigned char * imageData = cairo_image_surface_get_data(cairo_get_target(ad->cairo));

 Eina_List * list = eina_list_last(ad->objects);

 evas_object_image_data_set(eina_list_data_get(list), imageData);
 evas_object_image_data_update_add(eina_list_data_get(list), 0, 0, ad->width, ad->height);

3. mouse up -> 해당 object fade out effect

 Elm_Transit *transit = elm_transit_add();

 elm_transit_duration_set(transit, 5.0);
 elm_transit_effect_fade_add(transit);
 elm_transit_effect_color_add(transit,
    255, 225, 255, 20,
    0, 0, 0, 0);
 elm_transit_objects_final_state_keep_set(transit, EINA_TRUE);

 Evas_Object *image = eina_list_nth(ad->objects, transitPos);
 elm_transit_object_add(transit, image);
 elm_transit_go(transit);

 transitPos++;

na

 

3. mouse up -> 해당 object fade out effect 에서

transit 의 Evas_Object *image = eina_list_nth(ad->objects, transitPos); 를 thread로 돌려야 하나요?

혹여, 맞다면 thread 사용법 좀 알려 주세요...초보라서...ㅠ 어렵네요..

감사합니다.

Jeongsu Kim

thread로 돌리지 않아도 됩니다.

앞에 적어주신 1번, 2번 과정에서 mouse down, mouse move callback이 어느 object에 연결되어 있나요?
transit이 동작중에 mouse event를 먹어서 그런 것 같습니다.

따로 edc는 안쓰시는 거 같은데 evas object는 생성 순서대로 쌓이게 되므로 mouse event callback을 걸어놓은 object가 event를 받을 수 있게
object 생성 순서를 조절하시거나 해당 object이후 생성되는 object에 evas_object_propagate_events_set을 설정해서 touch event가
전달되도록 수정해 보세요.

na

edc SWALLOW type 으로 description을 사용하여 visible / invisible의 배경으로 사용 중이며,

여기에 mouse down, mouse move callback 등록하였으며,,,  위에서 말씀드린 것처럼 동작하고 있습니다.

 말씀하신 것 처럼 object에 _repeat_set을 설정하니 문제가 해결되었습니다.

그런데,,,, 에뮬에서와 다르게 s2에 이미지를 설치 뒤 실행해보니... 7글자 정도 작성 뒤 버벅거리는 현상이 발생합니다.

에뮬에서는 몇십글자를 적어도 문제없이 잘 동작하는 반면,,,,, 혹시 짐작 가는 이유를 알고 계신지요?

 

 

 

na

UI 중간에 제가 넣은 계산하는 루틴때문에 s2에서 느려지는것을 확인 하였습니다.

혹, 괜찮으시다면, thread 사용법을 간단하게나 설명해 주실 수 있으신지요???

하려고 하니 잘 안되네요....ㅠ

Jeongsu Kim

아마 mouse move 이벤트가 많이 와서 발생하는 문제 같습니다.

모든  mouse move 이벤트를 처리하면 느려질 수 있습니다.

여러가지 방법으로 mouse move 이벤트를 처리할 수 있습니다.

 

1. Evas_Event_Mouse_Move 구조체의 event_flags값을 확인하고 해당 값이 EVAS_EVENT_FLAG_ON_HOLD 를 가지고 있으면 그냥 무시하도록 바꿔보세요.

Evas_Event_Mouse_Move* ev = (Evas_Object_Mouse_Move*)event;

if(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
    return;

2. 위 구조체의 timestamp 값과 현재 시간을 비교해서 특정 시간보다 오래되었으면 무시하는 방법도 가능합니다.

3. 아니면 mouse move 이벤트에 idler를 등록하고 idler에서 처리하는 방법도 있습니다. 이 방법으로 하실때는 idler가 이미 등록되었으면 마찬가지로 무시하면 됩니다.