~~Title: On Click - Edje Animation~~
//**__previous page__: **//[[/develop/legacy/tutorial/effects/edje_animation/start_up|Animating on Application Start-up]]
==== Animating Object on Click ====
All the previous animations are automatic and do not have any relation with
the user's actions.
=== Title go back ===
Next animate a part by clicking on another one. Make the
title restore its default aspect when clicking on the small image.
{{ :edje_animation_reset.gif }}
The parts and the states are already defined. The animation goes back to the
default state, there is no need to add any parts or states: only add a program
which makes the transition when clicking on logo part.
// Make the title go back to normal
program
{
name: "animation,normaltitle";
source: "image";
signal: "mouse,clicked,*";
action: STATE_SET "default" 1.0;
target: "txt_title";
transition: LINEAR 0.5;
}
This program starts when the application receives the signal
''mouse,clicked,*'' (any button of the mouse is clicked) from the part called
image, (''source''). It performs the ''STATE_SET'' action and sets the default
state on the target ''txt_file'' part with a ''LINEAR'' transition.
When clicking any mouse button on the small logo, the title goes back to its
original state.
=== Rotating Parts ===
Next add two more buttons to the application and create programs to animate a
target.
It is possible to create a button with Edje from scratch, but to save time,
the ''SWALLOW'' part is used in this example to store Elementary widgets.
First create the ''SWALLOW'' parts, and then the ''Elementary'' widgets in the
''.c'' file.
// Container for the rotate button
part
{
type: SWALLOW;
name: "btn/rotate";
description
{
state: "default" 0.0;
rel1.relative: 0.30 0.9;
rel2.relative: 0.50 0.99;
}
}
This part is called ''btn/rotate'', it only has a ''SWALLOW'' type and a
default state with its position being on the bottom left of the screen.
// Container for the grow button
part
{
type: SWALLOW;
name: "btn/grow";
description
{
state: "default" 0.0;
rel1.relative: 1.02 0;
rel1.to: "btn/rotate";
rel2.relative: 2.02 1;
rel2.to: "btn/rotate";
}
}
This second ''SWALLOW'' part is very similar to the first one. It is placed
relatively to ''btn/rotate'', in order to remain next to it.
Next create the actual widgets. This is done in the ''.c'' file and is very
similar to what is done for the buttons in the first chapter.
This code is added in ''elm_main()''.
// Creation button in the app window
button = elm_button_add(win);
elm_object_text_set(button, "Rotate");
// Add the button to the edje layout container called "btn/rotate"
elm_object_part_content_set(layout, "btn/rotate", button);
evas_object_show(button);
// Creation a up button in the app window
btn_up = elm_button_add(win);
// Add the button to the edje layout container called "btn/grow"
elm_object_text_set(btn_up, "Grow");
elm_object_part_content_set(layout, "btn/grow", btn_up);
evas_object_show(btn_up);
In the default Basic EDC UI Application, the Edje layout is loaded by default.
Create two Elementary buttons and add them to the ''SWALLOW'' containers,
without having to setup sizes or positions as this is done in the ''SWALLOW''
container.
Note that the part name is very important because it is used to be merged the
Elementary widget and the ''SWALLOW'' part.
When the buttons placed and set, create the animation target. It is done in
the EDC file.
Add the animation target part.
The part initialization and the default ''state'':
// The animation target
part
{
name: "atarget";
type: IMAGE;
// Default state
description
{
state: "default" 0.0;
image { normal: "image2.png"; }
color: 255 0 0 255; /* red */
rel1 { relative: 0.3 0.3; }
rel2 { relative: 0.7 0.7; }
}
}
This ''part'' is an image displaying a big logo, centered on the top of the
screen.
Create a state to change the color and add the ''map'' statement.
// The rotate state
description
{
state: "rotate" 0.0;
inherit: "default" 0.0;
map
{
//Enable Map on the part
on: 1;
//Enable smooth rendering
smooth: 1;
//Enable perspective
perspective_on: 1;
//Apply rotations on the part
rotation.x: 0;
rotation.y: 0;
rotation.z: 0;
}
color: 0 255 0 255; /* green */
}
This part changes the color to green and defines the ''map''. This statement
makes rotations possible on an Edje ''part''. Rotations are done around the x,
y or z axes. In this example, the map is enabled and a 0° rotation is applied
around each axis.
Add a state with a rotation around the z axis of 360°.
description
{
state: "rotate" 1.0;
inherit: "rotate" 0.0;
map.rotation.z: 360;
}
This ''state'' inherits from the default state parameters and add a rotation
around the z axis.
Finally add a state to the other button animation grow. Change the size of the
animation target and add an offset.
// The grow state
description {
state: "grow" 0.0;
inherit: "default" 0.0;
color: 0 0 255 255; /* blue */
rel1
{
relative: 0.2 0.2;
offset: 0.3 0.3;
}
rel2
{
relative: 0.7 0.4;
offset: 0.3 0.3;
}
}
The last step is to create the programs to make all these states animate.
{{ :edje_animation_rotate.gif }}
To make the rotation animation smoother, create and chain several ''programs''
with different durations.
First create the main one: it goes from the default state to the rotate 0.0
state in 0.2 seconds.
Note that the states are all named the same way (rotate) but not with the same
version. This version allows you to have more than one state with the same
name, in fact the actual name of the state is the name plus the version.
// Change the color of target to green
program
{
name: "rotate,target";
source: "btn/rotate";
signal: "mouse,clicked,*";
action: STATE_SET "rotate" 0.0;
target: "atarget";
transition: SIN 0.2;
after: "rotate,target,2";
}
The program starts when the ''btn/rotate'' part is clicked with any mouse
button. When the animation ends, it calls the next one called
''rotate,target,2''.
// Rotate 360°
program
{
name: "rotate,target,2";
action: STATE_SET "rotate" 1.0;
target: "atarget";
transition: SIN 0.7;
after: "rotate,end";
}
This program sets the part state to ''rotate 1.0'' in 0.7 seconds, and when done
calls the next one ''rotate,end''.
// Go back to the normal.
program
{
name: "rotate,end";
action: STATE_SET "rotate" 0.0;
target: "atarget";
transition: LINEAR 0.2;
}
''rotate,end'' is the last program of the rotation effect: it sets the state
to ''rotate 0.0'' very fast.
The last program of this example is the grow effect, it switches from one
state to another.
{{ :edje_animation_grow.gif }}
// Grow the target and go back to normal state
program
{
name: "grow,target";
source: "btn/grow";
signal: "mouse,clicked,*";
action: STATE_SET "grow" 1.0;
after: "go,default";
target: "atarget";
transition: SINUSOIDAL 1.0;
}
It starts when the ''btn/grow'' part is clicked, it goes from the current
state to ''grow 1.0'' in one second. It then calls the go,default program. In
this program, both size and color change during the transition.
The ''go,default'' program sets the status back default for the animation
target.
// Go back to normal (default) state
program
{
name: "go,default";
action: STATE_SET "default" 1.0;
target: "atarget";
transition: SIN 1.0;
}