7 绘图说明

LUA脚本可以支持画相应的线段、几何图形、填充色块、画图等等,其中M系列、F系列绘制时候,组态控件刷新时候,用户图层绘制的线条、图片会消失。即M/F/H系列使用绘制指令或LUA API绘制时,所在画面不要有组态控件。本章节主要讲述以下几点:

  1. 绘制基本图形:分别为直线、矩形、实心矩形、圆形、实心圆形、椭圆形和实心椭圆

  2. 绘图应用案例:模拟曲线和进度条

  3. 图片显示:图片调用显示

注意:不同系列的API兼容性不一样,以LUA 脚本API函数接口为准,查阅使用,本文在物联型平台上使用,本例程所提到的API均支持

例程下载链接:《绘图说明》(点击跳转)

本例程用到以下绘图函数,详细参考LUA 脚本API函数接口

  1. 绘图回调函数 :on_draw(screen)
  2. 发送重绘请求:redraw()
  3. 设置画笔的颜色:set_pen_color(color)
  4. 绘制直线:draw_line(x0,y0,x1,y1,width)
  5. 绘制矩形:draw_rect(x0,y0,x1,y1,fill)
  6. 绘制实心的半透明矩形:draw_rect_alpha(x0,y0,x1,y1,alpha)
  7. 绘制圆形:draw_circle(x,y,r,fill)
  8. 绘制椭圆:draw_ellipse(x0,y0,x1,y1,fill)
  9. 路径画图:draw_image_file(filename,dstx,dsty,width,height,srcx,srcy)
  10. 申请图层: load_surface (filename)
  11. 销毁图层: destroy_surface (surface)
  12. 绘制图层 draw_surface (surface,dstx,dsty,width,height,srcx,srcy)

7.1 绘制基本图形

绘制基本图形分别有直线、矩形、实心矩形、圆形、实心圆形、椭圆形和实心椭圆,本文结合按钮控件绘制每一图形

画面配置

画面中添加按钮控件,分别用于设置画笔颜色、绘制直线、空心矩形、实心矩形、空心圆形、实现圆形、空心椭圆、实心椭圆等,按钮控件的配置为开关描述、瞬变即可

draw01

LUA脚本

根据画面配置,定义一个全局变量“draw_type”,表示对应按钮按下,绘制对应的图形,LUA脚本代码段如下所示

local draw_type = 0

--[[***************************************************************************
** Function name:  on_control_notify
** Descriptions:   用户通过触摸修改控件后,执行此回调函数。
                   点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
                   注意:回调函数的参数和函数名固定不能修改
** Input value :   screen  画面ID
                   control 控件ID
                   value   控件值(包括文本控件输入的值)
***************************************************************************--]]
function on_control_notify(screen,control,value)
    ......
    --******************************************************
    --功能    : 选取对应的图形
    --调用函数: redraw() 重新绘图
    --******************************************************
    if screen == 1 
    then
        if (control >= 1 and control <= 8)and value == 1    --按下画对应的图形
        then
           draw_type = control
           redraw()
        elseif control == 9 and value == 1    --按下设置画笔颜色
        then
           draw_pen_color = 0xffe0
           redraw()
        end
    end
    ......
end

--[[***************************************************************************
** Function name:  on_draw
** Descriptions:   画面刷新时,或者使用API函数 redraw 申请重绘,执行此回调函数
                   注意:回调函数的参数和函数名固定不能修改
** Input value :   screen  目标画面ID
***************************************************************************--]]
function on_draw(screen)

    set_pen_color(draw_pen_color)
    ......
    if screen == 1
    then

        if draw_type == 1 
        then
            --*********************************************************************
            --调用函数:draw_line(x1,y1,x2,y2,level)
            --函数功能:   两点间画直线
            --参数:      
            --      x1           直线起始点x轴的坐标
            --      y1           直线起始点y轴的坐标
            --      x2           直线结束点X轴的坐标
            --      y2           直线结束点y轴的坐标
            --      level        直线的曲线等级,1~10级
            --*********************************************************************
            draw_line(400,250,550,250,2)

        elseif draw_type == 2 
        then
            --*********************************************************************
            --调用函数:draw_rect(x1,y1,x2,y2,fill)
            --函数功能:   画矩形
            --参数:       
            --       x1           矩形左上脚x轴的坐标
            --       y1           矩形左上脚y轴的坐标
            --       x2           矩形右下脚X轴的坐标
            --       y2           矩形右下角y轴的坐标
            --       fill         填充1,不填充0
            --*********************************************************************
            draw_rect(400,200,600,300,0)

        elseif draw_type == 3
        then
            draw_rect(400,200,600,300,1)

        elseif draw_type == 4
        then
            --*********************************************************************
            --调用函数:draw_circle(x1,y1,r,fill)
            --函数功能:   画圆
            --参数:    
            --       x1           直线起始点x轴的坐标
            --       y1           直线起始点y轴的坐标
            --       x2           直线结束点X轴的坐标
            --       r            直线结束点y轴的坐标
            --       fill         填充1,不填充0
            --*********************************************************************
            draw_circle(500,250,50,0)

        elseif draw_type == 5
        then
            draw_circle(500,250,50,1)

        elseif draw_type == 6
        then
            --*********************************************************************
            --调用函数:draw_ellipse(x1,y1,x2,y2,fill)
            --函数功能:   画椭圆
            --参数:       
            --       x1           左上角的x坐标
            --       y1           左上角的y坐标
            --       x2           右下角的x坐标
            --       y2           右下角的y坐标
            --       fill         填充1,不填充0
            --*********************************************************************
            draw_ellipse(400,200,600,300,0)

        elseif draw_type == 7
        then
            draw_ellipse(400,200,600,300,1)
        end
    end
    ......
end

运行预览

根据画面配置和LUA脚本,运行结果如下所示

7.2 绘图应用案例

本章节主要根据上述的基本几何图形绘制的介绍,将模拟曲线,进度条的应用效果

画面配置

画面中,添加的控件主要作为模拟进度条效果,如下所示

文本控件ID3:用于显示进度百分比

矩形框控件ID5:用于显示矩形框,模拟进度条的显示进度

按钮控件ID8:用于开启定时器的开启、暂停,来控制模拟进度条draw03

LUA脚本

曲线数据为固定数据,进入到该画面后按照固定数据显示曲线 。按下画面中开始按钮后启动定时器 2 定时刷新进度条的进度 ,代码段如下所示

local graph_x = {70,120,160,200,240,280}     --曲线数据
local graph_y = {300,300,260,260,300,300}    --曲线数据
local progress = 0                           --进度条百分比
local rectangle_x = 460                      --进度条起始x
local rectangle_y = 354                      --进度条起始y

--[[***************************************************************************
** 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
        progress = progress + 10
        if rectangle_x > 760 
        then
            rectangle_x = 460
            progress = 0
        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 == 2 then
        if control == 8 and value == 1    --按下启动定时器2
        then
            start_timer(2,300,1,0)
        elseif control == 8 and value == 0    --按下按钮停止定时器2
        then
            stop_timer(2)
        end
    end
    ......
end

--[[***************************************************************************
** Function name:  on_draw
** Descriptions:   画面刷新时,或者使用API函数 redraw 申请重绘,执行此回调函数
                   注意:回调函数的参数和函数名固定不能修改
** Input value :   screen  目标画面ID
***************************************************************************--]]
function on_draw(screen)
    ......
   if screen == 2
   then
        draw_rect(460,320,rectangle_x,rectangle_y,1)    --进度条

        for i = 1 ,5
        do
            draw_line(graph_x[i],graph_y[i],graph_x[i+1],graph_y[i+1],1)    --曲线
        end
    end
    ......
end

运行预览

根据画面配置和LUA脚本,运行结果如下所示

img

7.3 图片显示

串口屏主要有3种画图方式,如下所示

1.路径画图:draw_image_file(filename,dstx,dsty,width,height,srcx,srcy)

2.加载图层画图:draw_surface (surface,dstx,dsty,width,height,srcx,srcy)

3.图片ID画图:draw_image(image_id,frame_id,dstx,dsty,width,height,srcx,srcy)

本例程中主要讲述第1、第2个应用,具体差别可参考LUA 脚本API函数接口

画面配置

画面配置

添加如下所示的控件:

矩形框控件ID1、ID2:表示图片显示的位置,没有实际意义

按钮控件ID4、ID6:分别调用路径画图、加载图层画图显示,如下所示:

draw05

添加被绘制的图片

1).在工程目录下创建private文件夹

2).将图片放在private文件夹里面,如下所示

img

如显示屏内的1.jpg图片,使用路径绘图函数如下所示

 draw_image_file("a:/1.png",80,160,270,230,0,100)    --显示内部存储a区中的1.png图片

使用图层指针函数如下所示

 surface = load_surface ("A:/0.jpg")

LUA脚本

local draw_pic1 = 0
local surface   = 0

--[[***************************************************************************
** Function name: on_control_notify
** Descriptions:  用户通过触摸修改控件后,执行此回调函数。
                  点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
                  注意:回调函数的参数和函数名固定不能修改
** Input value : screen  画面ID
                 control 控件ID
                 value   控件值(包括文本控件输入的值)
***************************************************************************--]]
function on_control_notify(screen,control,value)
    ......
    if screen == 3
    then
        if control == 6 and value == 1
        then
            --******************************************************
            --功能:   销毁图层指针
            --调用函数:destroy_surface(surface)   销毁图层指针
            --参数 :    surface         图层指针
            --调用函数:surface = load_surface (filepath)   加载图片到图层
            --参数      filepath               图片路径
            --返还值    surface                图层指针     指向所加载的图片
            --调用函数:redraw()               重新绘图
            --******************************************************
            if surface ~= 0 then
                destroy_surface(surface)           
                surface = 0
            end
            surface = load_surface ("A:/0.jpg")

    elseif control == 4 and value == 1
    then
        draw_pic1 = 1
        redraw()
    end
    ......
end

--[[***************************************************************************
** Function name:  on_draw
** Descriptions:   画面刷新时,或者使用API函数 redraw 申请重绘,执行此回调函数
                   注意:回调函数的参数和函数名固定不能修改
** Input value :   screen  目标画面ID
***************************************************************************--]]
function on_draw(screen)
    ......
    if screen == 3
    then

        if draw_pic1 == 1 then
            draw_image_file("a:/1.png",80,160,270,230,0,100)    --显示内部存储a区中的1.png图片
        end
        draw_surface(surface,460,160,270,230,0,0)    --显示内部存储a区中的0.jpg图片

    end
end

运行预览

根据画面配置和LUA脚本,编译并下载到实体屏体验

虚拟屏不支持,所指向的内存、路径不一致,需要实体屏测试

Copyright ©Dacai all right reserved,powered by Gitbook该文件修订时间: 2023-03-30 10:42:51

results matching ""

    No results matching ""