Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
柿饼_PersimmonUI
【PersimmonUI柿饼学习营】+ A Byte of China + 汽车仪表盘
发布于 2018-09-16 03:20:05 浏览:3581
订阅该版
* 本帖最后由 ianhom 于 2018-9-16 11:41 编辑 * 第三周作业:汽车仪表盘 **_开发环境_** RTT + PerimmonUI + 野火RT1052Mini + 5寸800*480触屏 ![TIM截图20180916110416.png](/uploads/201809/16/112041cjom5gl4ijqql7bm.png) **_开发过程_** 本次作业的关键就是画布插件,以往界面都是通过贴图,但有了这个控件,我们就可以直接在画布上绘制特定的图形,比如汽车仪表盘。同时为了有更好的演示,我们在画布控件下方增加启动、油门、刹车的按钮,便于操作。整体布局如下。 ![TIM截图20180916111150.png](/uploads/201809/16/112046z8k9iy6k9a9ungsn.png) 正如前文所说,柿饼的API非常丰富,且提供了很多实用的例程,在现有JS例程之上,稍做风格上调整即可呈现期待的效果。后面结合其他API,就可以实现动态效果。主要实现的效果有:指针转动,换挡效果,超速效果; 具体请详见JS源码 ``` var k = 0; // 转速值 var speed = 0; // 速度值 var sft = 0; // 档位 var flg = 3; // 加速标志 var startflg = 0; // 启动启动,0-未启动,1-已启动,2-启动中 var page = { data : {timer1 : 0}, // 启动按钮功能 onstart : function(e) { if(startflg == 0){ k = 0; speed = 0; startflg = 2; }else{ k = 0; speed = 0; startflg = 0; sft = 0; flg = 3; this.setData({imagebox1 : {hide : false}}) this.setData({imagebox2 : {hide : false}}) this.setData({imagebox3 : {hide : false}}) this.setData({imagebox4 : {hide : false}}) this.setData({page1 : {refresh : true}}) } }, // Speed up onup : function(e) { flg = 3; if (startflg == 0){ return; } if((sft < 5) && (k >45)){ k = 26; sft += 1; } if(k <= 100){ k += 4*((100-k)/100); } if((speed <= 100)&&(speed >= 0)){ speed += 5*((100-speed)/100); } }, // Break function onbreak : function(e) { if (startflg == 0){ return; } if(k >= 26){ k -= 3; }else{ k = 25; } if(speed >= 5){ speed -= 5 }else{ speed = 0; } }, // Init function onLoad : function() { var thiz = this; // Register a timer callback function this.data.timer1 = setInterval(function() { if(flg > 0){ flg -= 1; } if((flg == 0)&&(startflg == 1)){ if(k >= 26){ k -= 1 }else{ k = 25 } if(speed >= 1){ speed -= 1 }else{ speed = 0; } if(sft > 0){ if(speed < 1){ sft = 0; }else if(speed < 5){ sft = 1; } else if(speed < 15){ sft = 2; } else if(speed < 25){ sft = 3; } else if(speed < 40){ sft = 4; } } } if(startflg == 0) { k = 0; speed = 0; sft = 0; flg = 3; }else if(startflg == 2){ k+=3; if(k > 25){ startflg = 1; thiz.setData({imagebox1 : {hide : true}}) thiz.setData({imagebox2 : {hide : true}}) thiz.setData({imagebox3 : {hide : true}}) thiz.setData({imagebox4 : {hide : true}}) thiz.setData({page1 : {refresh : true}}) } } thiz.display(); }, 100); this.display() }, // Display function display : function() { var context = pm.createCanvasContext('Canvas1', this) //获取画布对象 //绘制渐变背景 var grd = context.createLinearGradient(0, -9900 + 100*speed,0,360) grd.addColorStop(0, 'red') grd.addColorStop(1, 'black') context.setFillStyle(grd) context.fillRect(0, 0, 800, 480) //绘制小屏 var grd = context.createLinearGradient(345, 10, 455, 10) grd.addColorStop(0, 'BlueViolet') grd.addColorStop(1, 'blue') context.setFillStyle(grd) context.fillRect(345, 5, 110, 60) var grd = context.createLinearGradient(350, 10, 430, 10) grd.addColorStop(0, 'blue') grd.addColorStop(1, 'BlueViolet') context.setFillStyle(grd) context.fillRect(350, 10, 100, 50) context.setFillStyle('white') context.fillText('.', 436,5) context.fillText(sft.toString(), 355,12) context.fillText('25 C', 420,12) context.fillText('------------------', 355,22) context.fillText('RT-Thread', 370,35) context.fillText('Persimmon GUI', 351,45) //绘制转速表 if (context) { var point = { x: 200, y: 200 }; //圆心坐标,相对于画布 var radius = 165; //半径 var start = -1.25 * Math.PI; //起始弧度 context.setLineWidth(25) context.setStrokeStyle('white') context.setFillStyle('white'); for( var i = 0; i <= 9; i++ ) { var stop = start + 0.1875 * Math.PI ; //结束弧度 var x = Math.floor(140 * Math.cos(start)) + 200; var y = Math.floor(140 * Math.sin(start)) + 200; var v = 1 * i; var s = v.toString() context.setFontSize(40) if (i == 9) break; context.fillText(s, x, y); context.beginPath(); //开始新的路径 context.arc( point.x, point.y, radius, start, stop - 0.175 * Math.PI, false); //画一段圆弧 context.stroke(); //填充路径 context.closePath(); //关闭路径 start = stop; if (i == 5) { context.setStrokeStyle('#C23531') context.setFillStyle('#C23531'); } } // End of cycle radius = 170; start = -1.25 * Math.PI; context.setLineWidth(15) context.setStrokeStyle('white') context.setFillStyle('white') context.fillText('rpm', 65,237) context.fillText('x 1000', 70,247) for( var i = 0; i < 40; i++ ) { var stop = start + 0.0375 * Math.PI ; context.beginPath(); context.arc( point.x, point.y, radius, start, stop - 0.0325 * Math.PI, false); context.stroke(); context.closePath(); start = stop; if (i == 29) { context.setStrokeStyle('#C23531') } }// End of scale { //绘制指针 var value = k var v1 = Math.floor(value * 800) var radius = 130; var x = Math.floor(radius * Math.cos((-1.25 * Math.PI + value * 1.5 * Math.PI / 100))) + point.x; var y = Math.floor(radius * Math.sin((-1.25 * Math.PI + value * 1.5 * Math.PI / 100))) + point.y; context.beginPath(); context.setFillStyle('red'); context.moveTo(x, y) radius = 10; x = Math.floor(radius * Math.cos((-0.75 * Math.PI + value * 1.5 * Math.PI / 100))) + point.x; y = Math.floor(radius * Math.sin((-0.75 * Math.PI + value * 1.5 * Math.PI / 100))) + point.y; context.lineTo(x, y); radius = 20; x = Math.floor(radius * Math.cos((-0.25 * Math.PI + value * 1.5 * Math.PI / 100))) + point.x; y = Math.floor(radius * Math.sin((-0.25 * Math.PI + value * 1.5 * Math.PI / 100))) + point.y; context.lineTo(x, y); radius = 10; x = Math.floor(radius * Math.cos((0.25 * Math.PI + value * 1.5 * Math.PI / 100))) + point.x; y = Math.floor(radius * Math.sin((0.25 * Math.PI + value * 1.5 * Math.PI / 100))) + point.y; context.lineTo(x, y); context.fill(); context.setTextAlign('center') context.fillText(v1.toString(), 200, 250) context.closePath(); } /////////////////////////////////////////////////////////////////////////////////////////// // 绘制时速表 var point = { x: 600, y: 200 }; //圆心坐标,相对于画布 var radius = 165; //半径 var start = -1.25 * Math.PI; //起始弧度 context.setLineWidth(25) context.setStrokeStyle('white') context.setFillStyle('white'); context.setFillStyle('white') context.fillText('km/h', 480,255) for( var i = 0; i <= 11; i++ ) { var stop = start + 0.15 * Math.PI ; //结束弧度 var x = Math.floor(140 * Math.cos(start)) + 600; var y = Math.floor(140 * Math.sin(start)) + 200; var v = 20 * i; var s = v.toString() context.setFont('DROIDSA') context.setFontSize(40) if (i == 11) break; context.fillText(s, x, y); context.beginPath(); //开始新的路径 context.arc( point.x, point.y, radius, start, stop - 0.14 * Math.PI, false); //画一段圆弧 context.stroke(); //填充路径 context.closePath(); //关闭路径 start = stop; if (i == 7) { context.setStrokeStyle('#C23531') context.setFillStyle('#C23531'); } } // End of cycle radius = 170; start = -1.25 * Math.PI; context.setLineWidth(15) context.setStrokeStyle('white') for( var i = 0; i < 50; i++ ) { var stop = start + 0.03 * Math.PI ; context.beginPath(); context.arc( point.x, point.y, radius, start, stop - 0.025 * Math.PI, false); context.stroke(); context.closePath(); start = stop; if (i == 39) { context.setStrokeStyle('#C23531') } }// End of scale { //绘制指针 var value = speed var v1 = Math.floor(value * 2) var radius = 130; var x = Math.floor(radius * Math.cos((-1.25 * Math.PI + value * 1.5 * Math.PI / 100))) + point.x; var y = Math.floor(radius * Math.sin((-1.25 * Math.PI + value * 1.5 * Math.PI / 100))) + point.y; context.beginPath(); context.setFillStyle('red'); context.moveTo(x, y) radius = 10; x = Math.floor(radius * Math.cos((-0.75 * Math.PI + value * 1.5 * Math.PI / 100))) + point.x; y = Math.floor(radius * Math.sin((-0.75 * Math.PI + value * 1.5 * Math.PI / 100))) + point.y; context.lineTo(x, y); radius = 20; x = Math.floor(radius * Math.cos((-0.25 * Math.PI + value * 1.5 * Math.PI / 100))) + point.x; y = Math.floor(radius * Math.sin((-0.25 * Math.PI + value * 1.5 * Math.PI / 100))) + point.y; context.lineTo(x, y); radius = 10; x = Math.floor(radius * Math.cos((0.25 * Math.PI + value * 1.5 * Math.PI / 100))) + point.x; y = Math.floor(radius * Math.sin((0.25 * Math.PI + value * 1.5 * Math.PI / 100))) + point.y; context.lineTo(x, y); context.fill(); context.setTextAlign('center') context.fillText(v1.toString(), 600, 250) context.closePath(); } context.draw(); } } }; Page(page); ``` **_效果展示_** 汽车仪表盘 ![hw4-1.gif](/uploads/201809/16/031924mzh9l7qziblpb9bt.gif) **_总结_** 这一周作业有了更多的交互,动画效果已经可以初见形态,还有更厉害的animation控件没使用,估计会更炫酷 画布中绘制图形要注意先后关系 柿饼工程 ![hw4-1-4.rar](/uploads/201809/16/113919pedhpp3hvesjq3wj.rar)
查看更多
2
个回答
默认排序
按发布时间排序
bernard
2018-09-18
这家伙很懒,什么也没写!
这个加速非常有感觉,速度飙上去后,然后转速慢慢变红(整体背景变红),有才的!
hnhebing
2018-09-28
这家伙很懒,什么也没写!
能在nuc972开发板上使用吗?
撰写答案
登录
注册新账号
关注者
0
被浏览
3.6k
关于作者
ianhom
这家伙很懒,什么也没写!
提问
17
回答
16
被采纳
0
关注TA
发私信
相关问题
1
【PersimmonUI柿饼学习营】+ A Byte of China + 环境搭建&20W年薪广告
2
【柿饼学习营】+werrysuzhen+20W年薪作业
3
【PersimmonUI柿饼学习营】+ meetwit + 20W年薪广告&lesson01
4
【PersimmonUI柿饼学习营】+ DaZhou + 20W年薪作业+视频有彩蛋
5
【PersimmonUI柿饼学习营】+ DMY+ lesson01 20W年薪广告
6
【PersimmonUI柿饼学习营】+ Bigmagic+20W年薪广告&day01
7
【PersimmonUI柿饼学习营】+ chowguohua+年薪广告
8
【柿饼学习营】+werrysuzhen+脚本及事件学习
9
【PersimmonUI柿饼学习营】+ DaZhou+ 手把手教你做计算器
10
【PersimmonUI柿饼学习营】+ A Byte of China + 2048游戏
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
在用clangd开发RTT吗,快来试试如何简单获得清晰干净的工作区
2
GD32F450 片内 flash驱动适配
3
STM32H7R7运行CherryUSB
4
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
5
使用RC522软件包驱动FM1722
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部