硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2235|回复: 8
收起左侧

[ThreadX全家桶] guix滑动页面代码分享与请教

[复制链接]

61

主题

177

回帖

360

积分

高级会员

积分
360
发表于 2022-9-6 17:23:38 | 显示全部楼层 |阅读模式
本帖最后由 gck 于 2022-9-6 17:31 编辑

以下代码关于页面之间的滑动,
1、不同列表之间竖直滑动(仅仅当在主表盘页面);
2、主表盘列表的水平滑动;
官方例程修改的,可以当做智能穿戴的页面逻辑
同时也请教关于竖直页面中,类似窗帘滑动的效果。效果如同小米s1 pro手表中“控制中心”“主表盘”“信息”三个页面的滑动
https://www.mi.com/xiaomiwatchs1 ... 04&cfrom=search,小米手表界面



UINT main_screen_event_process(GX_WINDOW* window, GX_EVENT* event_ptr)
{
    GX_WIDGET *target_screen = (GX_WIDGET *)&home_screen;
    GX_WIDGET *target_screen1 = (GX_WIDGET *)&message_screen;
    GX_WIDGET *target_screen2 = (GX_WIDGET *)&my_control_center;
    GX_WIDGET *current_screen_container;
    GX_WIDGET *target_screen_container;
    GX_WIDGET *current_screen;
    UINT status = GX_SUCCESS;
    INT horizontal_dist;
    INT vertical_dist;
    GX_WIDGET *parent;

    switch (event_ptr->gx_event_type){
        case GX_EVENT_SHOW:
            /* Update system time. */
            system_clock_update();
            /* Start a timer to update time. */
            gx_system_timer_start(window, SYSTEM_CLOCK_TIMER_ID, GX_TICKS_SECOND, GX_TICKS_SECOND);
            return gx_window_event_process(window, event_ptr);

        case GX_EVENT_TIMER:
            if (event_ptr->gx_event_payload.gx_event_timer_id == SYSTEM_CLOCK_TIMER_ID){
                system_clock_update();
                music_play_progress_update();
            }
            break;
        
        case GX_EVENT_PEN_DOWN:
            if (slide_animation.gx_animation_status == GX_ANIMATION_IDLE){
                /* Reserve pen down event for later use.  */
                slide_pen_down_event = *event_ptr;
                slide_pen_down_valid = GX_TRUE;
            }
            break;
        
        case GX_EVENT_PEN_DRAG:
            if (slide_animation.gx_animation_status == GX_ANIMATION_IDLE && slide_pen_down_valid)
            {
                horizontal_dist = GX_ABS(slide_pen_down_event.gx_event_payload.gx_event_pointdata.gx_point_x - event_ptr->gx_event_payload.gx_event_pointdata.gx_point_x);
                vertical_dist = GX_ABS(slide_pen_down_event.gx_event_payload.gx_event_pointdata.gx_point_y - event_ptr->gx_event_payload.gx_event_pointdata.gx_point_y);
                //水平移动距离
                if ((horizontal_dist > ANIMATION_MIN_SLIDING_DIST) || vertical_dist > ANIMATION_MIN_SLIDING_DIST)
                {
                    if (horizontal_dist > vertical_dist)//水平移动
                    {
                        /* Horizontal slide direction. */
                        status = enable_horizontal_slide_animation();
                    }
                    else//竖直移动
                    {
                        /* Find the visible page container screen.  */
                        current_screen_container = find_visible_screen_of_screen_list(container_screen_list);
                        /* Find visible screen.  */
                        current_screen = find_visible_screen_of_screen_list(get_page_screen_list(current_screen_container));
                        if ((current_screen == target_screen)||(current_screen == target_screen1)||(current_screen == target_screen2)){
                            //最终效果,实现窗帘滑动的效果
                            status = enable_vertical_slide_animation();
                        }else
                            break;
                    }
                    if (status == GX_SUCCESS)
                    {
                        send_event_to_current_screen(USER_EVENT_ANIMATION_STOP);
                        parent = slide_animation.gx_animation_info.gx_animation_parent;
                        /* Pass pen down and pen drag event to slide animation parent to process sliding animation.  */
                        parent->gx_widget_event_process_function(parent, &slide_pen_down_event);
                        parent->gx_widget_event_process_function(parent, event_ptr);
                    }
                }
            }
            break;     
        case GX_EVENT_ANIMATION_COMPLETE:
            if (event_ptr->gx_event_sender == SCREEN_SLIDE_ANIMATION_ID)
            {
                /* Disable slide animation.  */
                gx_animation_drag_disable(&slide_animation, slide_animation.gx_animation_info.gx_animation_parent);
                send_event_to_current_screen(USER_EVENT_ANIMATION_START);
            }
            break;
        
        case GX_EVENT_PEN_UP:
            if (slide_animation.gx_animation_status == GX_ANIMATION_IDLE)
            {
                /* Disable slide animation.  */
                gx_animation_drag_disable(&slide_animation, slide_animation.gx_animation_info.gx_animation_parent);
            }
            slide_pen_down_valid = GX_FALSE;
            break;
        
        default:
            return gx_window_event_process((GX_WINDOW*)window, event_ptr);
    }
    return 0;
}







回复

使用道具 举报

4

主题

1441

回帖

1453

积分

至尊会员

积分
1453
发表于 2022-9-6 20:34:40 | 显示全部楼层
  有实际效果展示不?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2022-9-7 01:18:09 | 显示全部楼层
GUIX最好用ScreenFlow控制滑动设置。这样移植修改也方便。
回复

使用道具 举报

61

主题

177

回帖

360

积分

高级会员

积分
360
 楼主| 发表于 2022-9-7 09:09:46 | 显示全部楼层
eric2013 发表于 2022-9-7 01:18
GUIX最好用ScreenFlow控制滑动设置。这样移植修改也方便。

硬汉哥,你可以通过相关视频或者案例说明吗?前期screeflow例子有点简单,不太适合,
回复

使用道具 举报

61

主题

177

回帖

360

积分

高级会员

积分
360
 楼主| 发表于 2022-9-7 09:13:28 | 显示全部楼层
morning_enr6U 发表于 2022-9-6 20:34
有实际效果展示不?

如附件视频所示

accd219ad5843994e78e371a40704fea.mp4

4.49 MB, 下载次数: 22

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2022-9-8 09:54:41 | 显示全部楼层
gck 发表于 2022-9-7 09:13
如附件视频所示

这个我之前不是做了一期。

基于STM32H7的ThreadX GUIX桌面窗口滑动操作章节已经发布
https://www.armbbs.cn/forum.php? ... 2863&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

61

主题

177

回帖

360

积分

高级会员

积分
360
 楼主| 发表于 2022-9-13 15:17:51 | 显示全部楼层
eric2013 发表于 2022-9-8 09:54
这个我之前不是做了一期。

基于STM32H7的ThreadX GUIX桌面窗口滑动操作章节已经发布

UINT gx_studio_auto_event_handler(GX_WIDGET *widget, GX_EVENT *event_ptr, GX_CONST GX_STUDIO_EVENT_PROCESS *record)
{
    UINT status = GX_SUCCESS;
    GX_CONST GX_STUDIO_ACTION *action;
    GX_CONST GX_WIDGET *parent = GX_NULL;
    GX_WIDGET *target = GX_NULL;
    GX_CONST GX_STUDIO_EVENT_ENTRY *entry = record->event_table;

    while(entry->event_type)
    {
        if (entry->event_type == event_ptr->gx_event_type)
        {
            if((entry->event_type == GX_EVENT_ANIMATION_COMPLETE) &&
               (entry->event_sender != event_ptr->gx_event_sender))
            {
                entry++;
                continue;
            }
            action = entry->action_list;

            while(action->opcode)
            {
                switch(action->opcode)
                {
                case GX_ACTION_TYPE_ATTACH:
                    if((action->flags & GX_ACTION_FLAG_POP_TARGET) ||
                       (action->flags & GX_ACTION_FLAG_POP_PARENT))
                    {
                        gx_system_screen_stack_get((GX_WIDGET **)&parent, &target);
                    }

                    if(!(action->flags & GX_ACTION_FLAG_POP_PARENT))
                    {
                        parent = action->parent;
                    }
                    if(!(action->flags & GX_ACTION_FLAG_POP_TARGET))
                    {
                        target = gx_studio_action_target_get(widget, action);
                    }
                    if (parent && target)
                    {
                        gx_widget_attach(parent, target);
                    }
                    break;

                case GX_ACTION_TYPE_DETACH:
                    target = gx_studio_action_target_find(widget, action);
                    if (target)
                    {
                        gx_widget_detach(target);
                        if (target->gx_widget_status & GX_STATUS_STUDIO_CREATED)
                        {
                            gx_widget_delete(target);
                        }
                    }
                    break;

                case GX_ACTION_TYPE_TOGGLE:
                    if(action->flags & GX_ACTION_FLAG_POP_TARGET)
                    {
                       gx_system_screen_stack_get(GX_NULL, &target);
                    }
                    else
                    {
                        target = gx_studio_action_target_get(widget, action);
                    }
                    gx_studio_screen_toggle(widget, target);
                    break;

                case GX_ACTION_TYPE_SHOW:
                    target = gx_studio_action_target_get(widget, action);
                    if(target)
                    {
                        gx_widget_show(target);
                    }
                    break;

                case GX_ACTION_TYPE_HIDE:
                    target = gx_studio_action_target_find(widget, action);
                    if(target)
                    {
                        gx_widget_hide(target);
                    }
                    break;

                case GX_ACTION_TYPE_ANIMATION:
                    gx_studio_animation_execute(widget, action);
                    break;

                case GX_ACTION_TYPE_WINDOW_EXECUTE:
                    if((action->flags & GX_ACTION_FLAG_POP_TARGET) ||
                       (action->flags & GX_ACTION_FLAG_POP_PARENT))
                    {
                        gx_system_screen_stack_get((GX_WIDGET **)&parent, &target);
                    }

                    if(!(action->flags & GX_ACTION_FLAG_POP_PARENT))
                    {
                        parent = widget->gx_widget_parent;
                    }
                    if(!(action->flags & GX_ACTION_FLAG_POP_TARGET))
                    {
                        target = gx_studio_action_target_get(widget, action);
                    }
                    if (parent && target)
                    {
                        gx_widget_attach(parent, target);
                        gx_window_execute((GX_WINDOW *) target, GX_NULL);
                    }
                    break;

                case GX_ACTION_TYPE_WINDOW_EXECUTE_STOP:
                    return event_ptr->gx_event_sender;

                case GX_ACTION_TYPE_SCREEN_STACK_PUSH:
                    target = gx_studio_action_target_get(widget, action);
                    if(target)
                    {
                        gx_system_screen_stack_push(target);
                    }
                    break;

                case GX_ACTION_TYPE_SCREEN_STACK_POP:
                    gx_system_screen_stack_pop();
                    break;

                case GX_ACTION_TYPE_SCREEN_STACK_RESET:
                    gx_system_screen_stack_reset();
                    break;

                default:
                    break;
                }
                action++;
            }
        }
        entry++;
    }

    if (record->chain_event_handler)
    {
        status = record->chain_event_handler(widget, event_ptr);
    }
    return status;
}
硬汉哥,你说的类似这种例程,实质应该也在自动生成的函数中实现了,只不过存在一定的被动,比如,有的按钮需要条件判断来跳转……

回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-10-23 18:02:50 | 显示全部楼层
eric2013 发表于 2022-9-8 09:54
这个我之前不是做了一期。

基于STM32H7的ThreadX GUIX桌面窗口滑动操作章节已经发布

hi  硬汉

请问是按键触摸滑动?看着代码是自动滑动吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-10-24 10:00:55 | 显示全部楼层
龙馗 发表于 2024-10-23 18:02
hi  硬汉

请问是按键触摸滑动?看着代码是自动滑动吧

这个是触摸滑动控制。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-26 00:26 , Processed in 0.426395 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表