-
Notifications
You must be signed in to change notification settings - Fork 784
Open
Description
做类似手机app图标拖动修改位置效果,需要考虑跨页面的情况,awtk上做不出类似手机的很流畅的效果,跨页面一改变拖动元素的parent就断触了,只好改成拖动到边界时代码直接指定widget位置,不考虑后继操作的方式。
实施这个方案之后就发现了问题,然后小demo测试发现凡是slide_view翻页之后对子空间widget_remove_child再widget_add_child,widget_add_child的地方只要和widget原来的parent不一样,就会导致slide_indicator偏移,PC还好,嵌入式linux平台上的偏移更严重。
这个是为什么?
代码:
home_page.c
#include "awtk.h"
#include "../common/navigator.h"
#include "tkc/darray.h"
darray_t btn_arr;
static ret_t on_btn_move_click(void* ctx, event_t* e) {
pointer_event_t* evt = pointer_event_cast(e);
printf("on_btn_move_click\r\n");
widget_t *head_widget = darray_get(&btn_arr, 0);
return_value_if_fail(head_widget != NULL, RET_BAD_PARAMS);
ret_t ret = RET_OK;
ret = darray_remove(&btn_arr, head_widget);
return_value_if_fail(ret == RET_OK, RET_BAD_PARAMS);
ret = darray_insert(&btn_arr, 6, head_widget);
return_value_if_fail(ret == RET_OK, RET_BAD_PARAMS);
widget_t *slide_view = widget_lookup(WIDGET(ctx), "slide_view", TRUE);
slide_view_activate_next(SLIDE_VIEW(slide_view));
for(int i = 0; i < btn_arr.size; i++){
int box_index = i / 6;
widget_t *box = widget_get_child(slide_view, box_index);
widget_t *elem = darray_get(&btn_arr, i);
widget_remove_child(elem->parent, elem);
widget_add_child(box, elem);
}
return RET_OK;
}
/**
* 初始化窗口的子控件
*/
static ret_t visit_init_child(void* ctx, const void* iter) {
widget_t* win = WIDGET(ctx);
widget_t* widget = WIDGET(iter);
const char* name = widget->name;
// 初始化指定名称的控件(设置属性或注册事件),请保证控件名称在窗口上唯一
if (name != NULL && *name != '\0') {
if (tk_str_eq(name, "btn_move")) {
widget_on(widget, EVT_CLICK, on_btn_move_click, win);
}
else if(tk_str_eq(name, "button")) {
darray_push(&btn_arr, widget);
}
}
return RET_OK;
}
/**
* 初始化窗口
*/
ret_t home_page_init(widget_t* win, void* ctx) {
(void)ctx;
return_value_if_fail(win != NULL, RET_BAD_PARAMS);
darray_init(&btn_arr, 10, NULL, NULL);
widget_foreach(win, visit_init_child, win);
return RET_OK;
}
复现:
Metadata
Metadata
Assignees
Labels
No labels