Skip to content

slide_view翻页时重设置子控件parent位置会导致slide_indicator显示异常 #954

@Tracker647

Description

@Tracker647

做类似手机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;
}

复现:

Image

test_slide.tar.gz

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions