Languages

Menu
Sites
Language
버튼에서 투명한 배경에 아이콘을 삽입해서(normal, pressed 이미지 2가지 사용) 사용하는 방법?

타이젠에서 제공하는 샘플 앱중

Sample - Native UI app - Theme Extension UI sample appplication.

를 참조하여 icon 버튼을 만들고 있는데, 조언을 구합니다.

기존 default style에서는 

'evas_object_smart_callback_add' 을 사용하여 콜백을 등록 하였는데,

customized style에서는 사용이 불가능 합니다.

'elm_object_signal_callback_add' 사용하면 press, unpress, click이 구현 가능 하지만, click시 소리가 나질 않습니다.

버튼에서 투명한 배경에 아이콘을 삽입해서(normal, pressed 이미지 2가지 사용) 사용하는것이 최종 목표입니다.

 

요약 질문입니다.

1. customized style에서 evas_object_smart_callback_add() 메소드를 사용할수 있는지 여부

2. elm_object_signal_callback_add() 메소드에서 sound signal을 사용하는 방법

3. icon 버튼을 만드는 더 간단한 방법이 있는지 

 

조언부탁드립니다.

Responses

6 Replies
Jeongsu Kim

sample앱 예제 edc에 부족한 부분이 있네요.

elm_button 에서 실제 쓰는 edc 파일입니다.
https://git.tizen.org/cgit/framework/uifw/efl-theme-tizen.git/tree/2.3-mobile/widgets/button.edc?h=tizen_2.3

저 edc에는 있고 sample앱 예제 edc에 없는 프로그램

         program { name: "touch_snd";
            signal: "mouse,clicked,1";
            source: "event";
            script {
               new st[31];
               new Float:vl;
               if (get_int(multi_down) == 0) {
                  get_state(PART:"bg", st, 30, vl);
                  if (strcmp(st, "disabled")) {
                     run_program(PROGRAM:"touch_sound");
                     emit("elm,action,click", "");
                  }
               }
            }
         }
         program { name: "touch_sound";
            action: RUN_PLUGIN "touch_sound";
         }

추가하면 'evas_object_smart_callback_add'로 동작합니다.

elm_button의 "clicked" smart callback이 edc에서 "touch_snd" 프로그램에 있는 emit("elm,action,click", ""); 을 해주어야 불리기 때분입니다.
https://git.tizen.org/cgit/framework/uifw/elementary.git/tree/src/lib/elm_button.c?h=tizen_2.3#n422

클릭음은 위에 touch_sound 프로그램으로 동작합니다.
그런데 plugin이 정의가 되어있지 않아 동작을 안합니다.

https://git.tizen.org/cgit/framework/uifw/efl-theme-tizen.git/tree/2.3-mobile/tizen.edc?h=tizen_2.3#n52

plugins 부분을 사용하시는 edc에 복사하면 터치 사운드로 나올거예요

pius lee

이렇게 된 소스는 사용할 수 없습니다.

현재 tizen 2.3 에서 public으로 지원하는 EDJE문서에는 plugins에 대한 부분의 설명이 없습니다.

또한 script 에서 사용중인 embryo에 대한 설명도 어디에도 없습니다. 즉 public하게 지원 안한다는 뜻입니다.

게다가 plugins에서 사용하는 libsvi (feedback library) 또한 public api에서 빠져 있습니다. 

이 소스를 사용하시면 안됩니다.

Jeongsu Kim

plugin 동작에 대해서는 해당 소스를 찾아서 넣었지만 public하게 지원하지 않는다는 것에는 동의합니다.
저 역시 Z1 단말에서 소리가 나는것은 확인했지만 사실 emulator에서는 소리가 나지 않았습니다.

그렇지만 기본적인 button widget을 extension 해서 사용하는 과정에서 elm_button의 "clicked" signal을 사용할 수 없도록 샘플앱이 제공된 점은 이해할 수 없습니다.
위에 제가 적은 코드 부분은 반드시 샘플앱에 추가가 되어야 합니다.

pius lee

EFL의 Elementary가 Widget의 확장을 제대로 지원하지 않기 때문에 일어나는 일입니다.

Widget을 확장하려면, "elm/button/base/default" 와 같이 elm/button/base 라는 내부 klass와 group string을 반드시 알아야 합니다.

하지만 이 String들을 가져올 수 있는 함수도 없고, document도 없고 spec도 없기 때문에, api 이용자가 edje로 theme를 추가하여 style을 확장 한다는 것은 현재 불가능 합니다.

또한 clicked signal을 사용할 수 없는 것이 아니라, 사용하는 방법이 나와있지 않는 것입니다.

button에 있는 pressed, unpressed, clicked 등의 signal에 smart callback을 adding하는 일은 생각보다 알고보면 간단합니다.

하지만 documentation 안되있기 때문에, 사용하면 나중에 문제가 될 가능성이 있습니다.

아주 간단하게 pressed, unpressed, clicked를 사용할 수 있는 소리가 나는 버튼을 만드는 방법은 다음과 같습니다.

Evas_Object* button = elm_button_add(box);
evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);

char edj_path[512] = {0,};
char *resdir = app_get_resource_path();
strcat(edj_path, resdir);
strcat(edj_path, "style.edj");
elm_layout_file_set(button, edj_path, "main");
free(resdir);

elm_object_part_text_set(button, "text", "Test");
elm_box_pack_end(box, button);
evas_object_show(button);

/*

// style.edj
// be careful, png and wav files must be placed into directory written with -ID -SD options.


collections {
     images {
        image: "pause.png" COMP;
        image: "play.png" COMP;
    }
    sounds {
        sample { name: "sound" LOSSY 64;
            source: "button.wav";
        }
    }
    group { name: "main";
        parts {
            part { name: "bg";
                type: IMAGE;
                mouse_events: 1;
                description { state: "default" 0.0;
                    min: 128 128;
                    image.normal: "play.png";
                    rel1.relative: 0.0 0.0;
                    rel2.relative: 1.0 1.0;
                }
                description { state: "pressed" 0.0;
                    inherit: "default" 0.0;
                    image.normal: "pause.png";
                }
            }
            part { name: "text";
            	type: TEXT;
            	mouse_events: 0;
            	description { state : "default" 0.0;
            		align: 0.5 0.5;
            		text {
            			text: "BuTToN";
            			size: 35;
            		}
            		color: 0 0 0 255;
            	}
            }
        }
        programs {
        	// for button pressed
            program { name: "mouse_down";
        		signal: "mouse,down,1";
        		source: "bg";
        		action: SIGNAL_EMIT "elm,action,press" "";
        		after: "img_pressed";
        	}
        	
        	// for button unpressed
            program { name: "mouse_up";
                signal: "mouse,up,1";
                source: "bg";
                action: SIGNAL_EMIT "elm,action,unpress" "";
                after: "img_unpressed";
            }
            
            program { name: "img_pressed";
        		action: STATE_SET "pressed" 0.0;
        		target: "bg";
        	}
            program { name: "img_unpressed";
                action: STATE_SET "default" 0.0;
                target: "bg";
                after: "mouse_clicked";
            }
            program { name: "mouse_clicked";
            	action: SIGNAL_EMIT "elm,action,click" "";
            	after: "btn_sound";
            }
            program { name: "btn_sound";
                action: PLAY_SAMPLE "sound" 1.0;
            }
        }
    }
}

*/

위처럼 EDJE의 sound를 사용하면, embryo를 사용하지 않아도 sound를 해결할 수 있습니다.

다만 feedback처럼 시스템 공용 button sound를 사용하진 못합니다.

Snippet쪽에도 올려 놨습니다.

https://developer.tizen.org/ko/community/code-snippet/native-code-snippet/super-simple-press-button-click-sound

Jeongsu Kim

elementary widget이 extension을 제대로 지원하지 않는점은 동의합니다.

그렇지만 이미

https://developer.tizen.org/development/guides/native-application/ui/ui-control/elementary-widgets
https://developer.tizen.org/development/guides/native-application/ui/ui-control/widget-preferences-0

위와 같이 widget extension에 대한 가이드가 나와 있습니다. 저 가이드 문서를 본 사람이면 widget extension을 지원한다고 생각하게 됩니다.

widget extension을 공식적으로 지원하지 않는다면 해당 가이드 수정이 필요해 보입니다.

pius lee

참고로 button 을 완전히 다 구현 하려면 다음과 같은 signal을 적절한 이벤트에 날려줘야 합니다.

elm,action,anim
elm,action,click
elm,action,default
elm,action,focus
elm,action,longpress
elm,action,multi
elm,action,press
elm,action,pressed
elm,action,unpress
elm,action,unpressed

하지만 어떤 이벤트가 어느 타이밍에 날아가야 정상 동작하는지 elementary button source를 모두 까보기 전에는 알수 없기 때문에, 

그냥 자신이 사용하는 부분만 구현 하는 것이 속편한 방법입니다.

 

물론 EFL에서 Widget 확장을 좀 더 간편하고 정립된 방식으로 제공하고 문서화 해준다면 정말 좋을것 같습니다.