add widget_animators

This commit is contained in:
xianjimli 2018-05-15 15:55:30 +08:00
parent af8fd284f8
commit d6b597057b
20 changed files with 403 additions and 3 deletions

View File

@ -13,6 +13,7 @@ env.Program(os.path.join(BIN_DIR, 'demo1'), ['demo_main.c', 'demo1_app.c']);
env.Program(os.path.join(BIN_DIR, 'demo2'), ['demo_main.c', 'demo2_app.c']);
env.Program(os.path.join(BIN_DIR, 'demoui'), ['demo_ui_app.c', 'demo_main.c']);
env.Program(os.path.join(BIN_DIR, 'demotr'), ['demo_tr_app.c', 'demo_main.c']);
env.Program(os.path.join(BIN_DIR, 'demo_animator'), ['demo_animator_app.c', 'demo_main.c']);
env.Program(os.path.join(BIN_DIR, 'prefix_xml_ui'), ['prefix_xml_ui.c']);

81
demos/demo_animator_app.c Normal file
View File

@ -0,0 +1,81 @@
/**
* File: demo1_app.c
* Author: AWTK Develop Team
* Brief: basic class of all widget
*
* Copyright (c) 2018 - 2018 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2018-02-16 Li XianJing <xianjimli@hotmail.com> created
*
*/
#include "base/timer.h"
#include "base/enums.h"
#include "base/button.h"
#include "base/dialog.h"
#include "base/image.h"
#include "base/label.h"
#include "base/mem.h"
#include "base/utils.h"
#include "base/utf8.h"
#include "base/window.h"
#include "base/slider.h"
#include "base/group_box.h"
#include "base/check_button.h"
#include "base/image_manager.h"
#include "base/progress_bar.h"
#include "widget_animators/widget_animator_move.h"
static ret_t on_start(void* ctx, event_t* e) {
widget_animator_start((widget_animator_t*)ctx);
return RET_OK;
}
static ret_t on_stop(void* ctx, event_t* e) {
widget_animator_stop((widget_animator_t*)ctx);
return RET_OK;
}
ret_t application_init() {
widget_t* image = NULL;
widget_t* stop = NULL;
widget_t* start = NULL;
widget_t* progress_bar = NULL;
widget_t* win = window_create(NULL, 0, 0, 0, 0);
widget_animator_t* animator = NULL;
start = button_create(win, 10, 5, 80, 30);
widget_set_text(start, L"Start");
stop = button_create(win, 128, 5, 80, 30);
widget_set_text(stop, L"Stop");
image = image_create(win, 10, 230, 100, 100);
image_set_image_name(image, "earth");
animator = widget_animator_move_create(image, 1000, NULL);
widget_animator_set_yoyo(animator, TRUE);
progress_bar = progress_bar_create(win, 10, 80, 168, 20);
animator = widget_animator_move_create(image, 1000, easing_get(EASING_SIN_INOUT));
widget_animator_move_set_params(animator, image->x, image->y, image->x + 100, image->y + 100);
widget_animator_set_yoyo(animator, TRUE);
widget_on(start, EVT_CLICK, on_start, animator);
widget_on(stop, EVT_CLICK, on_stop, animator);
return RET_OK;
}

View File

@ -10,13 +10,14 @@ sources=Glob('base/*.c') +\
Glob('font/*.c') + \
Glob('blend/*.c') + \
Glob('image_loader/*.c') + \
Glob('widget_animators/*.c') + \
['platforms/platform_default.c', 'tk.c'];
if os.environ['LCD'] == 'NANOVG':
sources += ['animator/window_animator_nanovg.c'];
sources += ['window_animators/window_animator_nanovg.c'];
sources += ['lcd/lcd_nanovg.c', 'main_loop/main_loop_nanovg.c'];
else:
sources += ['animator/window_animator_fb.c'];
sources += ['window_animators/window_animator_fb.c'];
sources += ['lcd/lcd_sdl2.c', 'main_loop/main_loop_sdl2.c']
if os.environ['FRAME_BUFFER_FORMAT'] =='rgba8888':

View File

@ -100,8 +100,10 @@ ret_t idle_dispatch(void) {
return RET_OK;
}
nr = s_idle_manager->size;
idles = (idle_info_t**)s_idle_manager->elms;
for (i = 0, nr = s_idle_manager->size; i < nr; i++) {
for (i = 0; i < nr; i++) {
idle_info_t* iter = idles[i];
if (iter->on_idle) {
iter->on_idle(iter);

View File

@ -35,6 +35,16 @@ ret_t main_loop_quit(main_loop_t* l) {
return l->quit(l);
}
ret_t main_loop_wakeup(main_loop_t* l) {
return_value_if_fail(l != NULL, RET_BAD_PARAMS);
if(l->wakeup != NULL) {
l->wakeup(l);
}
return RET_OK;
}
ret_t main_loop_destroy(main_loop_t* l) {
return_value_if_fail(l != NULL && l->destroy != NULL, RET_BAD_PARAMS);
l->running = FALSE;

View File

@ -31,11 +31,13 @@ typedef struct _main_loop_t main_loop_t;
typedef ret_t (*main_loop_run_t)(main_loop_t* l);
typedef ret_t (*main_loop_quit_t)(main_loop_t* l);
typedef ret_t (*main_loop_wakeup_t)(main_loop_t* l);
typedef ret_t (*main_loop_destroy_t)(main_loop_t* l);
struct _main_loop_t {
main_loop_run_t run;
main_loop_quit_t quit;
main_loop_wakeup_t wakeup;
main_loop_destroy_t destroy;
bool_t running;
@ -47,6 +49,7 @@ main_loop_t* main_loop(void);
ret_t main_loop_set(main_loop_t* loop);
ret_t main_loop_run(main_loop_t* l);
ret_t main_loop_wakeup(main_loop_t* l);
ret_t main_loop_quit(main_loop_t* l);
ret_t main_loop_destroy(main_loop_t* l);

127
src/base/widget_animator.c Normal file
View File

@ -0,0 +1,127 @@
/**
* File: widget_animator.h
* Author: AWTK Develop Team
* Brief: widget animator interface
*
* Copyright (c) 2018 - 2018 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2018-05-15 Li XianJing <xianjimli@hotmail.com> created
*
*/
#include "base/mem.h"
#include "base/time.h"
#include "base/timer.h"
#include "base/widget_animator.h"
ret_t widget_animator_init(widget_animator_t* animator, widget_t* widget, uint32_t duration, easing_func_t easing) {
return_value_if_fail(animator != NULL && widget != NULL, RET_BAD_PARAMS);
animator->widget = widget;
animator->duration = duration;
animator->easing = easing != NULL ? easing : easing_get(EASING_LINEAR);
return RET_OK;
}
static ret_t widget_animator_on_timer(const timer_info_t* timer) {
uint32_t now = timer->now;
widget_animator_t* animator = (widget_animator_t*)(timer->ctx);
uint32_t end_time = animator->start_time + animator->duration;
float_t time_percent = ((float_t)(now - animator->start_time))/animator->duration;
if(time_percent > 1) {
time_percent = 1;
}
if(animator->reversed) {
time_percent = 1 - time_percent;
}
widget_animator_update(animator, animator->easing(time_percent));
if(now >= end_time) {
if(animator->repeat) {
animator->start_time = now;
} else if(animator->yoyo) {
animator->start_time = now;
animator->reversed = !animator->reversed;
} else {
widget_animator_destroy(animator);
return RET_REMOVE;
}
}
return RET_REPEAT;
}
ret_t widget_animator_start(widget_animator_t* animator) {
return_value_if_fail(animator != NULL && animator->timer_id == 0, RET_BAD_PARAMS);
animator->start_time = time_now_ms();
animator->timer_id = timer_add(widget_animator_on_timer, animator, 0);
return RET_OK;
}
ret_t widget_animator_stop(widget_animator_t* animator) {
return_value_if_fail(animator != NULL && animator->timer_id > 0, RET_BAD_PARAMS);
timer_remove(animator->timer_id);
animator->timer_id = 0;
return RET_OK;
}
ret_t widget_animator_update(widget_animator_t* animator, float_t percent) {
return_value_if_fail(animator != NULL && animator->update != NULL, RET_BAD_PARAMS);
return animator->update(animator, percent);
}
ret_t widget_animator_set_yoyo(widget_animator_t* animator, bool_t value) {
return_value_if_fail(animator != NULL && animator->update != NULL, RET_BAD_PARAMS);
animator->yoyo = value;
return RET_OK;
}
ret_t widget_animator_set_repeat(widget_animator_t* animator, bool_t value) {
return_value_if_fail(animator != NULL && animator->update != NULL, RET_BAD_PARAMS);
animator->repeat = value;
return RET_OK;
}
ret_t widget_animator_set_reversed(widget_animator_t* animator, bool_t value) {
return_value_if_fail(animator != NULL && animator->update != NULL, RET_BAD_PARAMS);
animator->reversed = value;
return RET_OK;
}
ret_t widget_animator_destroy(widget_animator_t* animator) {
return_value_if_fail(animator != NULL, RET_BAD_PARAMS);
if(animator->destroy != NULL) {
return animator->destroy(animator);
} else {
TKMEM_FREE(animator);
}
return RET_OK;
}

View File

@ -0,0 +1,69 @@
/**
* File: widget_animator.h
* Author: AWTK Develop Team
* Brief: widget animator interface
*
* Copyright (c) 2018 - 2018 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2018-05-15 Li XianJing <xianjimli@hotmail.com> created
*
*/
#ifndef TK_WIDGET_ANIMATOR_H
#define TK_WIDGET_ANIMATOR_H
#include "base/easing.h"
#include "base/widget.h"
BEGIN_C_DECLS
struct _widget_animator_t;
typedef struct _widget_animator_t widget_animator_t;
typedef ret_t (*widget_animator_update_t)(widget_animator_t* animator, float_t percent);
typedef ret_t (*widget_animator_destroy_t)(widget_animator_t* animator);
/**
* @class widget_animator_t
*
*/
typedef struct _widget_animator_t {
widget_t* widget;
bool_t yoyo;
bool_t repeat;
bool_t reversed;
uint32_t now;
uint32_t start_time;
uint32_t duration;
uint32_t timer_id;
easing_func_t easing;
widget_animator_update_t update;
widget_animator_destroy_t destroy;
} widget_animator_t;
ret_t widget_animator_init(widget_animator_t* animator, widget_t* widget, uint32_t duration, easing_func_t easing);
ret_t widget_animator_update(widget_animator_t* animator, float_t percent);
ret_t widget_animator_start(widget_animator_t* animator);
ret_t widget_animator_stop(widget_animator_t* animator);
ret_t widget_animator_set_yoyo(widget_animator_t* animator, bool_t value);
ret_t widget_animator_set_repeat(widget_animator_t* animator, bool_t value);
ret_t widget_animator_set_reversed(widget_animator_t* animator, bool_t value);
ret_t widget_animator_destroy(widget_animator_t* animator);
END_C_DECLS
#endif/*TK_WIDGET_ANIMATOR_H*/

View File

@ -0,0 +1,58 @@
/**
* File: widget_animator_move.h
* Author: AWTK Develop Team
* Brief: widget animator move
*
* Copyright (c) 2018 - 2018 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2018-05-15 Li XianJing <xianjimli@hotmail.com> created
*
*/
#include "base/mem.h"
#include "widget_animators/widget_animator_move.h"
static ret_t widget_animator_move_update(widget_animator_t* animator, float_t percent) {
widget_animator_move_t* move = (widget_animator_move_t*)animator;
return_value_if_fail(move != NULL, RET_BAD_PARAMS);
animator->widget->x = move->x_from + (move->x_to - move->x_from) * percent;
animator->widget->y = move->y_from + (move->y_to - move->y_from) * percent;
widget_invalidate(animator->widget, NULL);
return RET_OK;
}
widget_animator_t* widget_animator_move_create(widget_t* widget, uint32_t duration, easing_func_t easing) {
widget_animator_t* animator = NULL;
return_value_if_fail(widget != NULL && duration > 0, NULL);
animator = (widget_animator_t*)TKMEM_ZALLOC(widget_animator_move_t);
return_value_if_fail(widget_animator_init(animator, widget, duration, easing) == RET_OK, NULL);
animator->update = widget_animator_move_update;
return animator;
}
ret_t widget_animator_move_set_params(widget_animator_t* animator, xy_t x_from, xy_t y_from, xy_t x_to, xy_t y_to) {
widget_animator_move_t* move = (widget_animator_move_t*)animator;
return_value_if_fail(move != NULL, RET_BAD_PARAMS);
move->x_to = x_to;
move->y_to = y_to;
move->x_from = x_from;
move->y_from = y_from;
return RET_OK;
}

View File

@ -0,0 +1,48 @@
/**
* File: widget_animator_move.h
* Author: AWTK Develop Team
* Brief: widget animator move
*
* Copyright (c) 2018 - 2018 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2018-05-15 Li XianJing <xianjimli@hotmail.com> created
*
*/
#ifndef TK_WIDGET_ANIMATOR_MOVE_H
#define TK_WIDGET_ANIMATOR_MOVE_H
#include "base/widget_animator.h"
BEGIN_C_DECLS
/**
* @class widget_animator_move_t
*
*/
typedef struct _widget_animator_move_t {
widget_animator_t base;
xy_t x_to;
xy_t y_to;
xy_t x_from;
xy_t y_from;
} widget_animator_move_t;
widget_animator_t* widget_animator_move_create(widget_t* widget, uint32_t duration, easing_func_t easing);
ret_t widget_animator_move_set_params(widget_animator_t* animator, xy_t x_from, xy_t y_from, xy_t x_to, xy_t y_to);
END_C_DECLS
#endif/*TK_WIDGET_ANIMATOR_MOVE_H*/