广州大彩串口屏论坛_大彩开发者交流论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4600|回复: 8

如何使用LUA脚本语言绘制动态直线绕点旋转360°

[复制链接]

1

主题

7

帖子

35

积分

新手上路

Rank: 1

积分
35
发表于 2021-8-13 16:04:26 | 显示全部楼层 |阅读模式
用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



回复

使用道具 举报

0

主题

207

帖子

6873

积分

论坛元老

Rank: 8Rank: 8

积分
6873
发表于 2021-8-16 09:27:39 | 显示全部楼层
参考说明 on_draw(screen)       的用法
VisualHMI 人机界面 & VisualTFT 串口屏
回复

使用道具 举报

1

主题

7

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2021-8-16 09:49:22 | 显示全部楼层
Cp`sir 发表于 2021-8-16 09:27
参考说明 on_draw(screen)       的用法

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

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

使用道具 举报

1

主题

7

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2021-8-16 09:51:33 | 显示全部楼层
function on_init()

end
local j
function on_draw(screen)
  if screen == 0  then
  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==0  then
   function on_draw(screen)
      if screen == 0  then
         
        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[img][/img]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

1

主题

7

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2021-8-16 09:52:37 | 显示全部楼层
需要自己动起来,而不是按键控制,按一下动一下
回复

使用道具 举报

0

主题

207

帖子

6873

积分

论坛元老

Rank: 8Rank: 8

积分
6873
发表于 2021-8-16 15:19:01 | 显示全部楼层
dsp 发表于 2021-8-16 09:52
需要自己动起来,而不是按键控制,按一下动一下

参考lua教程,绘图说明,如果你的是时钟应用,参考出厂工程,没有必要自己绘图
VisualHMI 人机界面 & VisualTFT 串口屏
回复

使用道具 举报

1

主题

7

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 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 == 0  then
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这种功能
回复

使用道具 举报

1

主题

7

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 2021-8-16 17:18:41 | 显示全部楼层
Cp`sir 发表于 2021-8-16 15:19
参考lua教程,绘图说明,如果你的是时钟应用,参考出厂工程,没有必要自己绘图 ...

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

使用道具 举报

1

主题

7

帖子

35

积分

新手上路

Rank: 1

积分
35
 楼主| 发表于 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 == 0  then       
        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  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|广州大彩串口屏论坛_大彩开发者交流论坛

GMT+8, 2024-4-27 02:01 , Processed in 0.046432 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表