如何使用LUA脚本语言绘制动态直线绕点旋转360°
用LUA脚本如何实现类似C语言的delay延时函数。(动态效果就相当于用底色把上一个状态的的线覆盖点,延时一会,画出新的线)以下程序是我参考LUA例程4 里面的定时器改的。想达到的效果是:点下开关,延迟2S画出图形来。但是功能未实现。很可能是stop_timer 这里有问题。 有会的人能帮忙看一看吗? 目前想先完成延时画线,在想后面的情况。
function on_control_notify(screen,control,value)
if screen==0 and control==1 and value==1 --按下第 0 页,第 1 个控件
then
start_timer(0,1000,1,0) --开启定时器 0,超时时间 2s
stop_timer(0) --停止定时器 0
end
end
function on_timer(timer_id) --定时器超时回调函数
if timer_id==0
then
function on_draw(screen)
if screen == 0
then
set_pen_color(0xF800)
draw_circle(400,250,150,0)
end
end
end
end
参考说明 on_draw(screen) 的用法 Cp`sir 发表于 2021-8-16 09:27
参考说明 on_draw(screen) 的用法
on_draw(screen)
当界面的显示内容需要更新时,系统自动调用此函数,用户在此函数中添加自定义
的绘图操作。用户绘制的内容叠加在画面内容之上。
此函数为系统回调函数,用户不要直接调用。
下面几种情况会触发此函数:
界面有动画播放、视频播放、RTC 时间显示的动态刷新;
用户操作屏幕控件控件;
通过 LUA 脚本或串口指令更新控件;
通过执行 redraw;
总之,界面上有任何变化,都会触发此回调函数。
这是界面发生变化,回调至on_draw, function on_init()
end
local j
function on_draw(screen)
if screen == 0then
start_timer(0,1000,1,0)
set_pen_color(0x0000)
draw_circle(400,250,150,0)
draw_circle(400,250,200,0)
set_pen_color(0xFFE0)
draw_line(400,250,400,100,2)
set_pen_color(0xF8200)
draw_line(400,250,529.9,325,2)
set_pen_color(0x07E0)
draw_line(400,250,270.1,325,2)
for i=10,200 do
if i%10==0 then
set_pen_color(0xFFE0)
draw_line(400,250,400+i,50,2)
set_pen_color(0xffff)
draw_line(400,250,400+i,50,4)
j=i
end
end
set_pen_color(0xFFE0)
draw_line(400,250,400+j,50,2)
set_pen_color(0xF800)
draw_line(400,250,573.2,350,2)
set_pen_color(0x07E0)
draw_line(400,250,240.1,350,2)
set_pen_color(0x0000)
draw_circle(400,250,150,0)
draw_circle(400,250,200,0)
end
end
function on_timer(timer_id)
if timer_id==0then
function on_draw(screen)
if screen == 0then
j=j+3
set_pen_color(0xFFE0)
draw_line(400,250,400+j,50,2)
set_pen_color(0xF800)
draw_line(400,250,573.2,350,2)
set_pen_color(0x07E0)
draw_line(400,250,240.1,350,2)
set_pen_color(0x0000)
draw_circle(400,250,150,0)
draw_circle(400,250,200,0)
end
end
end
end 需要自己动起来,而不是按键控制,按一下动一下 dsp 发表于 2021-8-16 09:52
需要自己动起来,而不是按键控制,按一下动一下
参考lua教程,绘图说明,如果你的是时钟应用,参考出厂工程,没有必要自己绘图 Cp`sir 发表于 2021-8-16 15:19
参考lua教程,绘图说明,如果你的是时钟应用,参考出厂工程,没有必要自己绘图 ...
不是时钟应用,下午又试一试。绘图说明:所有的绘图 API 函数需要写在回调函数 on_draw()中才能生效。
local j=10
timer_out=0
function on_timer(timer_id)
if timer_id == 0 then --定时器 0
function on_draw(screen)
if screen == 0then
j=j+3
set_pen_color(0xFFE0)
draw_line(400,250,400+j,50,2)
end
end
end
end
function on_control_notify(screen,control,value)
if screen == 0 and control == 1 and value == 1 then
start_timer(0,1000,1,0) --开启定时时器 0 工作,设置计时 1 秒触发一次 on_timer
end
end
我在想定时器里面是不能用function 利用其他函数?一般可以使用像set_value这种功能 Cp`sir 发表于 2021-8-16 15:19
参考lua教程,绘图说明,如果你的是时钟应用,参考出厂工程,没有必要自己绘图 ...
好的。我明天先看看绘图说明。好像跟进度条延迟差不多。明天试一试 Cp`sir 发表于 2021-8-16 15:19
参考lua教程,绘图说明,如果你的是时钟应用,参考出厂工程,没有必要自己绘图 ...
最后是参考LUA教程里面,动态进度条改的。下面代码是三根直线按一定规律移动。 根据自己所需要的移动方式,更改function on_timer 里面的算法即可。(但是,还有一个问题,就是不用progress这个变量,直线就不能自己动了,需要按键触发移动)
local progress = 0 --进度条百分比
local rectangle_x = 400 --进度条起始x
local rectangle_y = 50 --进度条起始y
local rectangle_x1=400
local rectangle_x2=400
--[[***************************************************************************
** Function name:on_init
** Descriptions: 系统初始化时,执行此回调函数。
注意:回调函数的参数和函数名固定不能修改
***************************************************************************--]]
function on_init()
end
--[[***************************************************************************
** Function name:on_systick
** Descriptions: 定时回调函数,系统每隔1秒钟自动调用。
注意:回调函数的参数和函数名固定不能修改
***************************************************************************--]]
function on_systick()
end
--[[***************************************************************************
** Function name:on_timer
** Descriptions: 定时器超时,执行此回调函数
注意:回调函数的参数和函数名固定不能修改
** Input value : timer_id 定时超时的定时器ID号,定时器编号0~31
***************************************************************************--]]
function on_timer(timer_id)
if timer_id == 2 then
rectangle_x = rectangle_x +30
if rectangle_x > 760 then
rectangle_x = 460
end
rectangle_x1 = rectangle_x1 +50
if rectangle_x1 > 760 then
rectangle_x1 = 460
end
set_value(2,3,progress)
rectangle_x2 = rectangle_x2 -50
if rectangle_x2 < 20 then
rectangle_x2 = 460
end
set_value(2,3,progress)
end
end
--[[***************************************************************************
** Function name:on_control_notify
** Descriptions: 用户通过触摸修改控件后,执行此回调函数。
点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
注意:回调函数的参数和函数名固定不能修改
** Input value : screen画面ID
control 控件ID
value 控件值(包括文本控件输入的值)
***************************************************************************--]]
function on_control_notify(screen,control,value)
--******************************************************
--功能: 打开定时器,定时绘图
--调用函数:start_timer(timer_id, timeout, countdown, repeat) 打开定时器
--参数 : timer_id 画面ID
-- timeout 超时时间
-- countdown 1或0顺计时 1 ,倒计时 0
-- repeat 计时器重复次数 0为无限循环
--调用函数:stop_timer(timer_id) 停止定时器
--调用函数:redraw() 重新绘图
--******************************************************
if screen == 0 then
if control == 8 and value == 1 then --按下启动定时器2
start_timer(2,300,1,0)
elseif control == 8 and value == 0 then
stop_timer(2) --按下按钮停止定时器2
end
end
end
--[[***************************************************************************
** Function name:on_screen_change
** Descriptions: 当画面切换至目标画面ID时,执行此回调函数
注意:回调函数的参数和函数名固定不能修改
** Input value : screen目标画面ID
*******************************************************************************--]]
function on_screen_change(screen)
end
--[[***************************************************************************
** Function name:on_draw
** Descriptions: 画面刷新时,或者使用API函数 redraw 申请重绘,执行此回调函数
注意:回调函数的参数和函数名固定不能修改
** Input value : screen目标画面ID
***************************************************************************--]]
function on_draw(screen)
set_pen_color(0x0000)
draw_circle(400,250,150,0)
draw_circle(400,250,200,0)
if screen == 0then
set_pen_color(0xFFE0)
draw_line(400,250,rectangle_x,rectangle_y,2) --进度条
set_pen_color(0xF8200)
draw_line(400,250,rectangle_x1,rectangle_y,2)
set_pen_color(0x07E0)
draw_line(400,250,rectangle_x2,rectangle_y,2)
end
end
页:
[1]