更新记录

1.0.0(2026-09-24)

首次发布 wui-charts-annular 环形进度条 组件 uniapp-x 蒸汽模式下跨全端。


平台兼容性

uni-app x(5.23)

Chrome Safari Android iOS 鸿蒙 微信小程序
√ - √ √ √ √

其他

多语言 暗黑模式 宽屏模式
× × √

wui-charts-annular 环形进度条 组件 开发文档介绍

简介:

wui-charts-annular 环形进度条 组件, 仅支持uniapp-x项目蒸汽模式下跨全端通用,支持js / ts/ uts 跨语言使用,高性能。

优势:

组件逻辑依然采用uts语法,支持新版Vapor蒸汽模式,跨全端,体积小,高性能。

使用说明:

通过插件市场下载会自动导入插件到项目中,然后就可以直接写wui-charts-annular标签使用了。

<wui-charts-annular :data="50"></wui-charts-annular>

wui-charts-annular 组件的所有属性如下:

属性名称 属性类型 属性默认值 属性说明
data Number 50 设置进度条的数据
isAnimate Boolean true 是否开关进场动画
timehand Number 100 设置进场动画毫秒
styleOpts UTSJSONObject 见下面styleOpts介绍 设置绘制组件样式

组件的 styleOpts 对象属性介绍:

属性名称 属性类型 属性默认值 属性说明
width Number 100 设置组件的宽
height Number 100 设置组件的高
padding Number 0 设置画布内边距
font Number 0 设置字体大小
bgColor String "rgba(255,255,255,0)" 设置画布背景色
textColor String "0000ff" 设置数值文字颜色
ringColor String "#2ba0fb" 设置进度环前景色
ringBgColor String "#e5f1fa" 设置进度环背景色
lineWidth Number 4 设置进度条的宽度

wui-charts-annular组件对外暴露的方法如下:

方法名称 方法参数类型 方法返回值 方法说明
drawing Number 无返回值 更新数据data
toDataURL 无参数 String 返回包含base64图片png

属性响应式代码示例:

<template>
    <scroll-view style="flex:1" bounces="false">
        <view style="align-items: center;padding-top: 20px;">
            <text>默认颜色</text>
            <text style="margin: 10px 0;">用法1:利用vue的数据驱动更新来更新进度条</text>
            <view style="background-color: #fff;align-items: center;padding: 10px;width: 100%;">
                <wui-charts-annular ref="annular" :data="data" :isAnimate="isAnimate" :timehand="timehand"
                    :styleOpts="styleOpts"></wui-charts-annular>
            </view>
            <view class="btn-box">
                <button @click="clikWH('修改线宽')">修改线宽</button>
                <button @click="clikWH('修改宽高')">修改宽高</button>
                <button @click="clikWH('修改背景')">修改背景</button>
                <button @click="clikWH('修改前景')">修改前景</button>
            </view>

            <view class="slid" style="margin-top: 15px;">
                <slider style="flex: 1;" valueColor="#fff" @changing="changing" :value="data" :min="0" :max="100"
                    :step="1" :show-value="true" />
                <button @click="btnClik1">{{btntxt}}</button>
            </view>
        </view>
    </scroll-view>
</template>
<script setup lang="uts">
    let timehand = 50;
    let isAnimate = ref(false);
    let btntxt = ref('开启进场动画');
    let data = ref(80);
    let styleOpts = ref({
        width: 150,
        height: 150,
        lineWidth: 8
    });
    const annular = ref<ComponentPublicInstance | null>(null);
    function clikWH(str : string) {
        if (str == "修改线宽") {
            if (styleOpts.value['lineWidth'] != 20) {
                styleOpts.value['lineWidth'] = 20;
            } else {
                styleOpts.value['lineWidth'] = 8;
            }

        }
        if (str == "修改宽高") {
            if (styleOpts.value['width'] != 200) {
                styleOpts.value['width'] = 200;
                styleOpts.value['height'] = 200;
            } else {
                styleOpts.value['width'] = 150;
                styleOpts.value['height'] = 150;
            }

        }
        if (str == "修改背景") {
            if (styleOpts.value['bgColor'] != '#ffff7f') {
                styleOpts.value['bgColor'] = '#ffff7f';
            } else {
                styleOpts.value['bgColor'] = '#ffffff';
            }

        }
        if (str == "修改前景") {
            if (styleOpts.value['textColor'] != '#37ff14') {
                styleOpts.value['textColor'] = '#37ff14';
                styleOpts.value['ringColor'] = '#37ff14';
                styleOpts.value['ringBgColor'] = '#5e5e2f'
            } else {
                styleOpts.value['textColor'] = '#2ba0fb';
                styleOpts.value['ringColor'] = '#2ba0fb';
                styleOpts.value['ringBgColor'] = '#e5f1fa'
            }

        }
    }

    /* 拖动滑动条模拟改变数据data*/
    function changing(e : UniSliderChangeEvent) {
        data.value = e.detail.value;
    }

    /* 进场动画 */
    function btnClik() {
        isAnimate1.value = isAnimate1.value ? false : true;
        btntxt1.value = isAnimate1.value ? '关闭进场动画' : '开启进场动画';
    }
</script>

<style>
    .btn-box {
        flex-direction: row;
        align-items: first baseline;
        justify-content: space-around;
        width: 100%;
    }

    .slid {
        display: flex;
        justify-content: space-around;
        flex-direction: row;
        align-items: center;
        height: 40px;
        width: 100%;
        margin: 2px 10px;
        background-color: #ddd;
        border: 1rpx #999 solid;
        border-radius: 4px;
        padding-left: 20px;
    }
</style>

内部方法调用示例利用drawing方法更新百分比数据:

<template>
    <scroll-view style="flex:1" bounces="false">
        <view style="align-items: center;padding-top: 20px;">
            <text> 默认颜色</text>
            <text style="margin: 10px 0;">用法2:利用组件的drawing函数来更新进度条</text>
            <view style="background-color: #fff;align-items: center;padding: 10px;width: 100%;">
                <wui-charts-annular ref="annular" :data="data" :isAnimate="isAnimate" :timehand="timehand"
                    :styleOpts="styleOpts"></wui-charts-annular>
            </view>
            <view class="slid-box">
                <view style="flex: 1;">
                    <slider class="slid" valueColor="#fff" @changing="changing" :value="data" :min="0" :max="100"
                        :step="1" :show-value="true" />
                </view>
                <button class="btn" @click="btnClik">{{btntxt}}</button>
            </view>
        </view>

    </scroll-view>
</template>

<script setup lang="uts">
    let timehand = 50;
    let isAnimate = ref(true);
    let btntxt = ref('关闭进场动画');
    let data = 60;
    let styleOpts = {
        width: 150,
        height: 150,
    }
    const annular = ref<ComponentPublicInstance | null>(null);

    /* 拖动滑动条模拟改变数据data */
    function changing(e : UniSliderChangeEvent) {
        //无ref赋值时,直接用wui-charts-annular组件的drawing函数改变数据
        data = e.detail.value;
        if (annular2.value != null) {
            annular2.value!.$callMethod('drawing', data);
        }
    }

    /* 进场动画 */
    function btnClik2() {
        isAnimate.value = isAnimate.value ? false : true;
        btntxt.value = isAnimate.value ? '关闭进场动画' : '开启进场动画';
    }
</script>

<style>
    .btn {
        margin-left: 5px;
        border-radius: 50px;
    }

    .btn-box {
        flex-direction: row;
        align-items: center;
        justify-content: space-around;
        width: 100%;
    }
    .slid-box{
        display: flex;
        justify-content: space-between;
        flex-direction: row;
        align-items: center;
        height: 40px;
        width: 100%;
        margin: 2px 10px;
        background-color: #ddd;
        border: 1rpx #999 solid;
        border-radius: 4px;
        padding:0 5px;
        margin-top: 15px;
        border-right: 50px;
    }
    .slid {
        background-color: #fff;
        border-radius: 50px;
    }
</style>

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。