圆形进度条-图片方式

11 篇文章 0 订阅

此方式有别于之前的一篇纯绘制,这个基于图片,通过路径剪裁,达到显示的目的

代码跟之前有做删减

import QtQuick 2.0
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4

Item {

    //该控件绘制角度为 顺时针

    property int minimumuValue: 0
    property int maximumuValue: 100
    property real currentValue: 0

    //property int maxValue: 100

    //默认起始和终止角度
    property int startAngle: 150
    property int endAngle: 180 - startAngle

    property int arcWidth: 10

    property real warningAngle: 30

    property bool showOutLine: true

    //默认颜色
    property variant backgroundColor: 'rgba(67,67, 67, 0.5)'
    property variant colorGradientBegin: 'rgba(51, 147, 248, 1.0)'
    property variant colorGradientEnd: 'rgba(45, 63, 119,1.0)'

    property string backgroundImg: ""
    property string forceImg: ""


    onCurrentValueChanged: {
        canvasImage.requestPaint();
    }

    Canvas{
        id:canvasImage
        width: parent.width
        height: parent.height
        antialiasing: true

        property real centerWidth: width/2
        property real centerHeight: height/2
        property real radius: width/2 - arcWidth - 10
        //property real outRadius: radius+10
        //property real inRadius: radius

        property real angle: 0.0
        property real angleOffset: 1.9*(Math.PI/180)
        property real m_startAngle: startAngle*(Math.PI/180)
        property real m_endAngle: endAngle*(Math.PI/180)
        property real m_warningOffset: 0.0

        onPaint: {
            var ctx = getContext("2d");            


            ctx.save();
            ctx.clearRect(0,0, canvasImage.width, canvasImage.height);

            ctx.drawImage(backgroundImg, 0,0, canvasImage.width, canvasImage.height);

            if(endAngle>startAngle)
            {
                angle = (currentValue - minimumuValue)/(maximumuValue-minimumuValue)*((Math.abs(endAngle-startAngle))*(Math.PI/180));

            }
            else
            {
                angle = (currentValue - minimumuValue)/(maximumuValue-minimumuValue)*((Math.abs(endAngle-startAngle+360))*(Math.PI/180));

            }

            ctx.beginPath();

            ctx.arc(canvasImage.centerWidth, canvasImage.centerHeight, canvasImage.centerHeight, m_startAngle, m_startAngle + canvasImage.angle, false);
            ctx.lineTo(canvasImage.centerWidth, canvasImage.centerHeight);
            //ctx.closePath();
            ctx.clip();

            ctx.drawImage(forceImg,0,0, canvasImage.width, canvasImage.height);

            //描边,此函数会画出边线
            //ctx.stroke();

            ctx.restore();
        }

    }

    //当外部Timer的频率低于此duration的时候,回影响currentValue的置0效果,无法置0
//    Behavior on currentValue{
//        NumberAnimation{
//            easing.type: easing.InOutSine
//            duration: 300
//        }
//    }
}

 

使用:

 CircularProcessorByImage{
        id:myImageProcess
        x:490
        y:0
        width: 165
        height: 165
        startAngle: 150
        endAngle: 270
        currentValue: 0
        arcWidth: 30
        showOutLine: false
        backgroundImg: "qrc:/Image/45.png"
        forceImg: "qrc:/Image/53.png"
    }

    Timer{
        interval: 200
        running: true
        repeat: true
        onTriggered: {
            if(myProcess.currentValue < myProcess.maximumuValue)
            {
                //console.log(myProcess.currentValue);

                myProcess.currentValue +=1;

                myImageProcess.currentValue +=1;

                if(!isChangeImg && (myProcess.currentValue >= myProcess.maximumuValue*0.8))
                {
                    myImageProcess.forceImg = "qrc:/Image/54.png";

                    isChangeImg = true;
                }

            }
            else{
                myProcess.currentValue = 0;
                myImageProcess.currentValue = 0;

                myImageProcess.forceImg = "qrc:/Image/53.png";

                isChangeImg = false;
            }
        }
    }

 

效果演示:

附背景图片:

    

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UniApp是一个基于Vue.js的跨平台开发框架,可以用于开发iOS、Android、H5等多个平台的应用程序。要实现一个圆环进度条,可以按照以下步骤进行: 1. 在UniApp项目中创建一个组件,可以命名为CircleProgress。 2. 在CircleProgress组件的template中,使用canvas标签来绘制圆环。设置canvas的宽度和高度,并通过样式设置圆环的颜色、宽度等属性。 3. 在CircleProgress组件的script中,定义一个data属性,用于存储进度条的数值。可以设置默认值为0。 4. 在CircleProgress组件的mounted生命周期钩子函数中,获取canvas的上下文对象,并通过上下文对象的方法来绘制圆环。可以使用arc方法来绘制圆弧,再使用stroke方法来描边。 5. 在CircleProgress组件的watch属性中,监听进度条数值的变化,并在变化时重新绘制圆环。 6. 在需要使用圆环进度条的页面中,引入CircleProgress组件,并通过v-model指令来绑定进度条数值。 下面是一个简单的示例代码: ```html <template> <view class="circle-progress"> <canvas canvas-id="progressCanvas" style="width: 200px; height: 200px;"></canvas> </view> </template> <script> export default { data() { return { progress: 0, // 进度条数值 }; }, mounted() { this.drawProgress(); }, watch: { progress() { this.drawProgress(); }, }, methods: { drawProgress() { const ctx = uni.createCanvasContext('progressCanvas', this); const centerX = 100; // 圆心x坐标 const centerY = 100; // 圆心y坐标 const radius = 80; // 圆环半径 const startAngle = -Math.PI / 2; // 起始角度(-90度) const endAngle = startAngle + (this.progress / 100) * (Math.PI * 2); // 结束角度 ctx.clearRect(0, 0, 200, 200); // 清空画布 ctx.setLineWidth(10); // 设置圆环宽度 ctx.setStrokeStyle('#ff0000'); // 设置圆环颜色 ctx.setLineCap('round'); // 设置圆环端点样式为圆形 ctx.beginPath(); ctx.arc(centerX, centerY, radius, startAngle, endAngle, false); ctx.stroke(); ctx.draw(); }, }, }; </script> <style> .circle-progress { display: flex; justify-content: center; align-items: center; } </style> ``` 在上述示例代码中,我们使用canvas标签来绘制圆环,并通过uni.createCanvasContext方法获取canvas的上下文对象。然后,根据进度条数值计算起始角度和结束角度,并使用arc方法绘制圆弧,再使用stroke方法描边。最后,通过调用draw方法来绘制圆环
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值