UI设计工具文档UI设计工具文档
反馈钉钉群
  • AC791
  • AC792
  • AC63
  • GPMCU
  • AD14/15/17/18/AD104
  • AD16
  • AD24
  • AC82
  • AW30
  • AW31
反馈钉钉群
  • AC791
  • AC792
  • AC63
  • GPMCU
  • AD14/15/17/18/AD104
  • AD16
  • AD24
  • AC82
  • AW30
  • AW31
  • 1.工具前言

    • 1.1.工具首页
    • 1.2.前言说明
  • 2.快速使用

    • 2.1.快速使用
    • 2.2.快速上手
    • 2.3.板子配置
    • 2.4.视频教程
    • 2.5.硬件资料
  • 3.控件说明

    • 3.1.控件说明
    • 3.2.基础控件

      • 页面
      • 按钮
      • 图片按钮
      • 标签
      • 图片
      • 文本框
      • 开关
      • 数字微调器
      • 复选框
      • 下拉框
      • 进度条
      • Lottie动画
      • 帧动画
      • 图表
      • 滑动条
      • 弧线
      • 仪表盘
      • 相册
    • 3.3.菜单控件

      • 圆弧菜单
      • 齿轮菜单
      • 列表菜单
      • 曲线菜单
      • 网格菜单
      • 万花筒菜单
      • 多边形菜单
      • 轮盘菜单
    • 3.4.容器控件

      • 通用容器
      • Flex布局
  • 4.高级功能

    • 4.1.时间轴动画
    • 4.2.模型绑定
    • 4.3.资源管理
    • 4.4.国际化
    • 4.5.硬件仿真
    • 4.6.自动化测试
    • 4.7.控件组
    • 4.8.菜单管理
    • 4.9.页面管理
    • 4.10.主题
    • 4.11.动态页面
  • 5.插件系统

    • 5.1.插件说明
    • 5.2.开发指南
    • 5.3.字体合并
    • 5.4.图片编辑
    • 5.5.截图
    • 5.6.项目合并
    • 5.7.项目属性编辑
    • 5.8.视频转图片
    • 5.9.图片转换
  • 6.使用案例

    • 6.1.倒计时案例
    • 6.2.键盘和鼠标滚轮控制菜单滑动
    • 6.3.自定义Symbol
    • 6.4.暗色键盘主题
  • 7.常见问题

    • 7.1.问题说明
    • 7.2.编译问题
    • 7.3.LVGL问题
    • 7.4.仿真问题
    • 7.5.UI工具问题
    • 7.6.其他问题
  • 8.工具杂项

    • 8.1.杂项1
    • 8.2.杂项2
    • 8.3.工具生成API接口

轮盘菜单

轮盘菜单(ArcWheel)用于以椭圆/圆形轨迹展示菜单项,支持拖拽旋转、循环/非循环、松手吸附,以及默认的 滑动缩放 效果和 自定义 位置变换回调。

本章目录
  • 1. 属性
    • 1.1. Visible Count(可见数量)说明
    • 1.2. 样式属性
  • 2. 样式
  • 3. 使用
    • 3.1. 滑动缩放
    • 3.2. 自定义
本章正文

属性

PropertyDescription
Menu菜单项列表
Visible Count可见菜单数量;0 表示自动(使用实际菜单项数量)
Radius X椭圆 X 轴半径
Radius Y椭圆 Y 轴半径
Angle Offset角度偏移,用于控制子项的起始方向(0° 右、90° 下、180° 左、270° 上)
Px Per Angle每度像素数
Scroll Dir滑动方向,支持 水平 垂直
Friction Factor摩擦系数(0~1),控制滑动后的减速速率;值越小减速越快
Snap Factor吸附系数(0~1),控制吸附动画的速度/强度
Is Snap是否吸附,启用后松手会自动对齐到最近的菜单项
LoopMode循环模式,启用后可循环旋转;关闭后到达首尾将停止
Menu Image Zoom菜单项图片基础缩放比例(256 为原始大小;启用文件存储时生效)
Menu Style菜单样式,支持 滑动缩放 自定义

轮盘菜单 的 Menu 属性可以选择在 菜单管理 中配置好的菜单项列表。具体使用参见菜单

Visible Count(可见数量)说明

  • Visible Count = 0:角度间隔由菜单项总数决定(angle_step = 360 / 菜单项数量),默认显示全部菜单项。
  • Visible Count > 0:角度间隔固定为(angle_step = 360 / Visible Count),当菜单项数量大于 Visible Count 时,仅显示距离当前角度最近的 Visible Count 个菜单项,其余会隐藏以减少遮挡。
  • 当菜单项数量 <= 1 或 Visible Count <= 1 时,角度间隔为 0,控件无法旋转。

样式属性

不同菜单样式,支持的属性不同,具体如下:

  • 滑动缩放
PropertyDescription
Zoom Min最小缩放值(256 为 1.0)
Zoom Max最大缩放值(256 为 1.0)

滑动缩放 会根据子项当前角度计算缩放:默认 270° 方向(上方)的子项更大、90° 方向(下方)的子项更小;可通过反向设置 Zoom Min 和 Zoom Max 的值来调整。

  • 自定义
PropertyDescription
Nop1自定义属性1
Nop2自定义属性2
Nop3自定义属性3
Nop4自定义属性4

当 Menu Style 选择 自定义 时,可以通过 位置变换 编写子项位置/缩放的变换回调函数。

样式

StylePartDescription
Padding LeftMain左内边距
Padding RightMain右内边距
Padding TopMain上内边距
Padding BottomMain下内边距

使用

  • 菜单配置

滑动缩放

  • 控件属性
  • 仿真

自定义

在 自定义 样式中,设计阶段会以 滑动缩放 的 Zoom Min/Zoom Max = 256 来显示。

  • 控件属性

点击 位置变换 按钮,可以编写 位置变换 回调函数的实现。

  • 螺旋纵深 回调实现
uint16_t transform_cb(const lv_obj_t * arcwheel, const lv_obj_t * item, lv_coord_t angle, lv_point_t * item_pos)
{
	lv_arcwheel_t *wheel = (lv_arcwheel_t *)arcwheel;
	lv_obj_t *item_mut = (lv_obj_t *)item;
	
	uint16_t zoom_min = wheel->transform_param.custom.nop1;
	uint16_t zoom_max = wheel->transform_param.custom.nop2;
	lv_coord_t shrink_x = wheel->transform_param.custom.nop3;
	lv_coord_t shrink_y = wheel->transform_param.custom.nop4;
	
	int32_t a = angle % 360;
	if (a > 180)
	    a -= 360;
	if (a < -180)
	    a += 360;
	
	const int32_t max_angle = 120;
	int16_t a_clamped = (int16_t)LV_CLAMP(-max_angle, a, max_angle);
	uint16_t abs_a = (uint16_t)LV_ABS(a_clamped);
	
	lv_coord_t rx = (lv_coord_t)(wheel->radius_x - (int32_t)shrink_x * abs_a / max_angle);
	lv_coord_t ry = (lv_coord_t)(wheel->radius_y - (int32_t)shrink_y * abs_a / max_angle);
	if (rx < 10)
	    rx = 10;
	if (ry < 10)
	    ry = 10;
	
	lv_coord_t sin_val = lv_trigo_sin((int16_t)angle);
	lv_coord_t cos_val = lv_trigo_sin((int16_t)(angle + 90));
	
	item_pos->x = (lv_coord_t)((int32_t)rx * cos_val / LV_TRIGO_SIN_MAX);
	item_pos->y = (lv_coord_t)((int32_t)ry * sin_val / LV_TRIGO_SIN_MAX);
	item_pos->x -= (lv_coord_t)(shrink_x / 2);
	
	uint32_t t256 = 0;
	if (max_angle > 0)
	{
	    t256 = (abs_a >= (uint16_t)max_angle) ? 256u : (uint32_t)abs_a * 256u / (uint32_t)max_angle;
	}
	t256 = (t256 * t256) / 256u;
	
	int32_t zoom_i32 = (int32_t)zoom_max + (((int32_t)zoom_min - (int32_t)zoom_max) * (int32_t)t256) / 256;
	zoom_i32 = LV_CLAMP(0, zoom_i32, 0xFFFF);
	uint16_t zoom = (uint16_t)zoom_i32;
	
	int32_t opa_i32 = (int32_t)LV_OPA_COVER + (((int32_t)80 - (int32_t)LV_OPA_COVER) * (int32_t)t256) / 256;
	opa_i32 = LV_CLAMP(0, opa_i32, 255);
	lv_opa_t opa = (lv_opa_t)opa_i32;
	
	lv_obj_set_style_transform_pivot_x(item_mut, lv_obj_get_width(item_mut) / 2, LV_PART_MAIN);
	lv_obj_set_style_transform_pivot_y(item_mut, lv_obj_get_height(item_mut) / 2, LV_PART_MAIN);
	lv_obj_set_style_transform_angle(item_mut, (lv_coord_t)(a_clamped / 2) * 10, LV_PART_MAIN);
	lv_obj_set_style_img_opa(item_mut, opa, LV_PART_MAIN);
	
	return zoom;
}
  • 仿真
上一页
多边形菜单