|
本帖最后由 二哲科技 于 2023-6-17 12:19 编辑
1.介绍
圆形屏幕和方形屏幕不同,所以在想有什么适合圆形屏幕的菜单,经过一段时间的思考,发现可以做一个旋转菜单。
2.设计想法
以前介绍完都是直接上设计,发现对大家好像没有太大的帮助,从之后的设计都会给到大家一些我的设计想法,可能会比较啰嗦,有兴趣的可以看看,没兴趣的可以直接看后面的设计和演示视频。
关注我的朋友应该记得我之前发布的一款圆屏雷达Demo,上面就有对应显示雷达点位,当时设计的时候就是让8个点位显示在离中心点不同的角度,这样就可以让每个点不进行重叠,这次设计也是使用了这个方案。
这次设计一共设计了两种菜单,第一种是显示八个图片,在左右滑动的时候所有图标会以圆周的形式进行运动,同时我还设计了一个归位功能,就是当不再触摸的时候,图标会自行归位,这里就需要检测触摸松开了。
图标自动归位主要是在触摸松开里进行一个归位处理,归位处理则检测运动的角度,如果不是能整除45则递增或者递减,显示八个图标刚好就是45度。
第二种设计就比较麻烦了,因为要显示14个图标,这时候就需要有一个地方可以让图标进行替换,而且是那种FIFO模式的进出,这块设计非常麻烦,足足耗费了我两个晚上,刚开始我是想就用8个变量图标,然后到一定角度时显示不同的图标,不过发现这个极其复杂。后面我就定义了14个变量图标,把这些变量图标藏在一个图片后面,这样就用类似FIFO的模式把变量图标一个一个的扔出去就行了。
3.设计
首先是准备素材,这里给大家分享一个阿里巴巴对外提供的矢量图库【https://www.iconfont.cn/home/index】,下面是我准备的图标和背景图片。
图1
其次是界面设计,第一种就是放8个变量图标即可。
图2
第二种就是放14个变量图标,加上一个置顶图片,用于遮盖其他变量图标。
图3
然后在创建两个页面,用于菜单点击后的显示,一共设计了两个,分别对应两个旋转菜单。
图4
图5
接下来就是代码设计了,这里代码设计需要获取触摸情况,一共是两个页面,根据获取的按键值,判断进入的是哪一种菜单模式。然后获取滑动差值和结束触摸,将这些差值和结束触摸事件发送给相关的函数。 - //获取触摸位置
- void get_tp_status()
- {
- static u16 get_timer = 0;
- static u16 SildeValue = 0;
- static u16 lastX = 0;
- u16 SildeTemp = 0;
- u16 Va[3] = 0;
- u8 i = 0, j = 0;
-
- get_timer++;
- if(get_timer >= 1000)
- {
- get_timer = 0;
- SildeTemp = Read_Dgus(0x4000);
- if(SildeTemp != 0x0000)
- {
- SildeValue = SildeTemp;
- SildeTemp = 0x0000;
- write_dgus_vp(0x4000, &SildeTemp, 1); //清除
- Va[0] = 0x0000;
- Va[1] = 0x0000;
- Va[2] = 0x0000;
- write_dgus_vp(0x0016, Va, 3);
- if(SildeValue == 0x0001)
- {
- Va[0] = 0x0006;
- silde1MenuCurrent = 6;
- write_dgus_vp(0x17F0, Va, 1); //中间默认图标
- silde1_angle = 0;
- for(i = 0;i < 8;i++)
- {
- silde1_pos_set(i, 0);
- }
- }
- else if(SildeValue == 0x0002)
- {
- Va[0] = 0x0006;
- silde2MenuCurrent = 0;
- write_dgus_vp(0x27F0, Va, 1); //中间默认图标
- silde2_angle = DEFAULT_ANGLE;
- for(i = 0;i < 8;i++)
- {
- silde2_pos_set(i, DEFAULT_ANGLE, i);
- }
- }
- }
- if(SildeValue == 0x0001)
- {
- SildeTemp = Read_Dgus(0x4010);
- if(SildeTemp != 0x0000)
- {
- SildeTemp = 0x0000;
- write_dgus_vp(0x4010, &SildeTemp, 1); //清除
-
- if(silde1MenuCurrent == 0)
- {
- switch_screen(0x00);
- }
- else
- {
- u8 display_text[] = {'M', 'e', 'n', 'u', 0x00, 0x00};
- display_text[4] = silde1MenuCurrent + 0x30;
- write_dgus_vp(0x4100, display_text, 3);
- switch_screen(0x03);
- }
- }
- }
- else if(SildeValue == 0x0002)
- {
- SildeTemp = Read_Dgus(0x4020);
- if(SildeTemp != 0x0000)
- {
- SildeTemp = 0x0000;
- write_dgus_vp(0x4020, &SildeTemp, 1); //清除
-
- if(silde2MenuCurrent == 0)
- {
- switch_screen(0x00);
- }
- else
- {
- u8 display_text[] = {'M', 'e', 'n', 'u', 0x00, 0x00};
- if(silde2MenuCurrent < 10)
- {
- display_text[4] = silde2MenuCurrent + 0x30;
- }
- else
- {
- display_text[4] = silde2MenuCurrent / 10 + 0x30;
- display_text[5] = silde2MenuCurrent % 10 + 0x30;
- }
- write_dgus_vp(0x4200, display_text, 3);
- switch_screen(0x04);
- }
- }
- }
-
- if(SildeValue > 0)
- {
- if(SildeValue == 1)
- {
- for(i = 0;i < 3;i++) //获取触摸值
- {
- Va[i] = Read_Dgus(0x0016 + i);
- if(Va[0] == 0x5A03)
- {
- //UART2_Sendbyte(Va[i] / 256);
- //UART2_Sendbyte(Va[i] % 256);
- }
- else
- {
- break;
- }
- }
- if(Va[0] == 0x5A03)
- {
- if(lastX != 0)
- {
- s16 move = Va[1] - lastX;
- silde1_move(move);
- lastX = Va[1];
- }
- else
- {
- lastX = Va[1];
- }
- }
- else if(Va[0] == 0x5A02) //松开
- {
- lastX = 0;
- //自动归位
- silde1_reset();
- Va[0] = 0x0000;
- Va[1] = 0x0000;
- Va[2] = 0x0000;
- write_dgus_vp(0x0016, Va, 3);
- }
- }
- else if(SildeValue == 2)
- {
- for(i = 0;i < 3;i++) //获取触摸值
- {
- Va[i] = Read_Dgus(0x0016 + i);
- if(Va[0] == 0x5A03)
- {
- //UART2_Sendbyte(Va[i] / 256);
- //UART2_Sendbyte(Va[i] % 256);
- }
- else
- {
- break;
- }
- }
- if(Va[0] == 0x5A03)
- {
- if(lastX != 0)
- {
- s16 move = Va[1] - lastX;
- silde2_move(move);
- lastX = Va[1];
- }
- else
- {
- lastX = Va[1];
- }
- }
- else if(Va[0] == 0x5A02) //松开
- {
- lastX = 0;
- //自动归位
- silde2_reset();
- Va[0] = 0x0000;
- Va[1] = 0x0000;
- Va[2] = 0x0000;
- write_dgus_vp(0x0016, Va, 3);
- }
- }
- }
- }
- }
复制代码
这个是第一种滑动旋转的函数: - //滑动旋转
- void silde1_move(s16 dis)
- {
- u16 i = 0;
-
- silde1_angle = silde1_angle + (dis / 2);
- while(silde1_angle < 0)
- {
- silde1_angle += 360;
- }
- while(silde1_angle > 360)
- {
- silde1_angle -= 360;
- }
- for(i = 0;i < 8;i++)
- {
- silde1_pos_set(i, silde1_angle);
- }
- }
复制代码
这是第一种自动归位的函数:
- //自动归位
- void silde1_reset()
- {
- u8 add_flag = 0;
- u8 i = 0;
-
- if(silde1_angle % 45 > 22)
- {
- add_flag = 1;
- }
- else if(silde1_angle % 45 <= 22 && (silde1_angle % 45) != 0)
- {
- add_flag = 2;
- }
- while(1)
- {
- if(add_flag == 1)
- {
- silde1_angle++;
- }
- else if(add_flag == 2)
- {
- silde1_angle--;
- }
-
- for(i = 0;i < 8;i++)
- {
- silde1_pos_set(i, silde1_angle);
- }
- if(silde1_angle % 45 == 0)
- {
- break;
- }
- Delay_ms(5);
- }
- if(silde1_angle % 45 == 0)
- {
- silde1MenuCurrent = 7 - Read_Dgus(0x1000 + 0x100 * (((silde1_angle / 45) + 1) % 8));
- write_dgus_vp(0x17F0, &silde1MenuCurrent, 1);
- //UART2_Sendbyte(silde1MenuCurrent % 256);
- }
- }
复制代码
第二种的相对比较复杂,大家可以自行下载源码去阅读,这里就不贴出来了。 这是演示时的图片,大家可以看一下。
图6
4.总结 这次设计让我觉得迪文屏的自定义功能还是挺强的,不仅局限于图片,这种自定义动画显示的也是挺流畅的,这让我有了更多的设计想法,让我们一起期待更好的设计吧~
源码: |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|