dsp 发表于 2021-8-13 16:04:26

如何使用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



Cp`sir 发表于 2021-8-16 09:27:39

参考说明 on_draw(screen)       的用法

dsp 发表于 2021-8-16 09:49:22

Cp`sir 发表于 2021-8-16 09:27
参考说明 on_draw(screen)       的用法

on_draw(screen)
当界面的显示内容需要更新时,系统自动调用此函数,用户在此函数中添加自定义
的绘图操作。用户绘制的内容叠加在画面内容之上。
此函数为系统回调函数,用户不要直接调用。
下面几种情况会触发此函数:
 界面有动画播放、视频播放、RTC 时间显示的动态刷新;
 用户操作屏幕控件控件;
 通过 LUA 脚本或串口指令更新控件;
 通过执行 redraw;
总之,界面上有任何变化,都会触发此回调函数。

这是界面发生变化,回调至on_draw,

dsp 发表于 2021-8-16 09:51:33

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:37

需要自己动起来,而不是按键控制,按一下动一下

Cp`sir 发表于 2021-8-16 15:19:01

dsp 发表于 2021-8-16 09:52
需要自己动起来,而不是按键控制,按一下动一下

参考lua教程,绘图说明,如果你的是时钟应用,参考出厂工程,没有必要自己绘图

dsp 发表于 2021-8-16 15:25:19

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这种功能

dsp 发表于 2021-8-16 17:18:41

Cp`sir 发表于 2021-8-16 15:19
参考lua教程,绘图说明,如果你的是时钟应用,参考出厂工程,没有必要自己绘图 ...

好的。我明天先看看绘图说明。好像跟进度条延迟差不多。明天试一试

dsp 发表于 2021-8-17 10:32:42

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]
查看完整版本: 如何使用LUA脚本语言绘制动态直线绕点旋转360°