美文网首页
微信小程序canvas 画动态圆环百分比进度条实例 根据手机屏

微信小程序canvas 画动态圆环百分比进度条实例 根据手机屏

作者: 凉介Seven | 来源:发表于2018-09-29 19:52 被阅读0次
    image.png

    这里是wxml代码:

    <component-analysis-report active="0" bindselectReport="selectReport"></component-analysis-report>
    <component-no-data text="小喜正在统计中,敬请期待噢~" wx:if="{{!params.allAmount}}"></component-no-data>
    <view class="wrap" hidden="{{!params.allAmount}}">
        
        <!-- <view class="top" style="z-index:1;">{{reportName}}询盘统计报告</view> -->
        <view class="circle">
            <canvas class="more" canvas-id="canvasCircles"></canvas>
            <canvas class="more" canvas-id="canvasCircle"></canvas>
            <canvas class="more" canvas-id="canvasArcCir"></canvas>
            <view class="more circles" wx:if="{{current==0}}">
                <view>
                    <view class="circleone">
                        <text>{{params.gmvPercent}}</text> %
                    </view>
                    <view class="circletwo">成交占比</view>
                </view>
            </view>
    
            <!-- <view class="more circles" wx:if="{{current==1}}">
                <view>
                    <view class="circleone">
                        <text>{{params.effectivePercent}}</text> %
                    </view>
                    <view class="circletwo">有效询盘占比</view>
                </view>
            </view> -->
    
            <!-- <view class="more circles bottom" wx:if="{{current==0}}">
                <view class="ONE"></view>
                <view class="TWO"></view>
            </view>
            <view class="more circles bottom" wx:if="{{current==1}}">
                <view class="TWO"></view>
                <view class="ONE"></view>
            </view> -->
        </view>
        <swiper class="circle-box" bindchange="currentChange">
            <block>
                <swiper-item>
                </swiper-item>
                <!-- <swiper-item>
                </swiper-item> -->
            </block>
        </swiper>
        <view class="mainS">
            <view class="deal" wx:if="{{current==0}}">
                <view class="block">
                    <view class="pic">
                        <image src="{{images.totalValue}}" />
                    </view>
                    <view class="name"> {{enquireName.totalValue}} </view>
                    <view class="prc">¥{{params.allAmount}}</view>
                    <view class="num">{{params.allAmountCount}} 笔</view>
                </view>
                <view class="block">
                    <view class="pic">
                        <image src="{{images.tranValue}}" />
                    </view>
                    <view class="name"> {{enquireName.tranValue}} </view>
                    <view class="prc">¥{{params.gmvAmount}}</view>
                    <view class="num">{{params.gmvAmountCount}} 笔</view>
                </view>
                <view class="block">
                    <view class="pic">
                        <image src="{{images.enquireValue}}" />
                    </view>
                    <view class="name"> {{enquireName.enquireValue}} </view>
                    <view class="prc">¥{{params.followAmount}}</view>
                    <view class="num">{{params.followAmountCount}} 笔</view>
                </view>
                <view class="block">
                    <view class="pic">
                        <image src="{{images.lossCount}}" />
                    </view>
                    <view class="name"> {{enquireName.lossValue}} </view>
                    <view class="prc"> ¥{{params.lossAmount}} </view>
                    <view class="num">{{params.lossAmountCount}} 笔</view>
                </view>
                <view class="block">
                    <view class="pic">
                        <image src="{{images.gmvCount}}" />
                    </view>
                    <view class="name"> {{enquireName.gmvCount}} </view>
                    <view class="prc"> {{params.effective}}次</view>
                    <view class="num"></view>
                </view>
            </view>
            <!-- <view class="loss" wx:if="{{current==1}}">
                    <view class="block">
                            <view class="pic">
                                <image src="{{images.allCount}}" />
                            </view>
                            <view class="name"> {{enquireName.allCount}} </view>
                            <view class="prc"></view>
                            <view class="num red">{{params.enquiryCount}}</view>
                        </view>
                        <view class="block">
                            <view class="pic">
                                <image src="{{images.gmvCount}}" />
                            </view>
                            <view class="name">{{enquireName.gmvCount}} </view>
                            <view class="prc"></view>
                            <view class="num red">{{params.effective}}</view>
                        </view>
                        <view class="block">
                            <view class="pic">
                                <image src="{{images.lossCount}}" />
                            </view>
                            <view class="name"> {{enquireName.lossCount}} </view>
                            <view class="prc"></view>
                            <view class="num red">{{params.garbage}}</view>
                        </view>
            </view> -->
        </view>
    </view>
    
    

    这里是wxss代码:

    .wrap {
      /* width: 100%; */
      /* margin-top: 71rpx; */
      height: 100%;
      position: relative;
      font-size: 28rpx;
    }
    .circle-box {
      height: 500rpx;
      text-align: center;
      color: #fff;
      border-color: #55abf6;
      background-image: linear-gradient(165deg, #52a6db 0%, #6382d2 100%);
    }
    .top {
      position: absolute;
      top: 24rpx;
      width: 100%;
      height: 46rpx;
      line-height: 46rpx;
      font-size: 28rpx;
      color: #ffffff;
      letter-spacing: 0;
      text-align: center;
    }
    .circle {
      width: 380rpx;
      position: relative;
      margin: auto;
      top: 30rpx;
    }
    .more {
      width: 380rpx;
      height: 380rpx;
      position: absolute;
      right: 0;
    }
    .circles {
      width: 380rpx;
      height: 380rpx;
      color: #ffffff;
      
      font-size: 24rpx;
      display: flex;
      justify-content: center;
      align-items: center;
      text-align: center;
    }
    .circleone {
      font-size: 36rpx;
    }
    .circleone text {
      font-size: 80rpx;
    }
    .circletwo{
      opacity: 0.64;
    }
    .bottom {
      height:430rpx;
      justify-content: center;
      align-items: flex-end;
    }
    .bottom .ONE {
      width: 60rpx;
      height: 8rpx;
      background: #ffffff;
      margin: 5rpx;
      border-radius: 2rpx;
    }
    .bottom .TWO {
      width: 60rpx;
      height: 8rpx;
      background: #ffffff;
      margin: 5rpx;
      opacity: 0.3;
      border-radius: 2rpx;
    }
    .deal,
    .loss {
      height: auto;
      margin: -90rpx 24rpx 30rpx;
    }
    .block {
      height: 142rpx;
      /* box-shadow: 3px 3px 3px #eeeeee; */
      background: #ffffff;
      margin-bottom: 12rpx;
      /* border: 1rpx solid #e0e0e0; */
      display: flex;
      align-items: center;
      padding: 0 54rpx;
      box-shadow: 9rpx 9rpx 8rpx 0 rgba(168, 168, 169, 0.31);
      border-radius: 6rpx;
      text-align: center;
    }
    .block .name {
      flex: 1;
    }
    .block .prc {
      flex: 1.5;
      font-size: 32rpx;
      color: #CB2B2B;
    }
    .block .num {
      flex: 1;
      color: #999999;
    }
    .block .pic {
      width: 50rpx;
      height: 50rpx;
      margin-right: 20rpx;
    }
    .block .red {
      color: #CB2B2B;
    }
    
    

    这里是js代码:

    var app = getApp();
    var interval;
    var varName;
    var ctx = wx.createCanvasContext('canvasArcCir');
    Page({
      data: {
        params: {
          allAmount: '',
          allAmountCount: '',
          effective: '',
          effectivePercent: '',
          enquiryCount: '',
          followAmount: '',
          followAmountCount: '',
          garbage: '',
          gmvAmount: '',
          gmvAmountCount: '',
          gmvPercent: '',
          lossAmount: '',
          lossAmountCount: ''
        },
        images: {
          totalValue: app.CDN + 'enquiry_1.png',
          tranValue: app.CDN + 'enquiry_2.png',
          enquireValue: app.CDN + 'enquiry_3.png',
          lossValue: app.CDN + 'enquiry_4.png',
          allCount: app.CDN + 'enquiry_count.png',
          gmvCount: app.CDN + 'enquiry_success.png',
          lossCount: app.CDN + 'enquiry_loss.png'
        },
        enquireName: {
          totalValue: '总金额',
          enquireValue: '跟单金额',
          tranValue: '成交金额',
          lossValue: '流失金额',
          allCount: '询盘总次数',
          gmvCount: '有效询盘',
          lossCount: '垃圾询盘'
        },
        enquireuse: {
          totalValue: '询盘总次数',
          enquireValue: '垃圾询盘',
          tranValue: '有效询盘'
        },
        reportId: 1,
        reportName: '2018年1月',
        current: 0,
        // 自定义canvas缩放比例
        width: 190,
        height: 190,
        r: 100,
        r1: 80,
        r2: 92
      },
      //选择传入reportId
      selectReport(e) {
        this.setData({
          reportId: e.detail.params.reportId,
          reportName: e.detail.params.reportName
        });
        wx.setNavigationBarTitle({
          title: e.detail.params.reportName + '询盘分析报告'
        });
        this.getList();
    
        // console.log(e.detail.params.reportId, e.detail.params.reportName);
      },
      //获取分析报告列表
      getList() {
        if (wx.showLoading) {
          wx.showLoading({ title: '加载中...' });
        }
        app
          .get('/report/detail', { reportId: this.data.reportId })
          .then(e => {
            if (wx.hideLoading) {
              wx.hideLoading();
            }
            this.setData({
              params: e.data
            });
            this.drawCircle();
          })
          .catch(res => {
            if (wx.hideLoading) {
              wx.hideLoading();
            }
            console.log(res);
          });
      },
      drawCircle: function() {
        let that = this;
        //进度条
        var cxt_arc = wx.createCanvasContext('canvasCircle');
        cxt_arc.setLineWidth(6);
        cxt_arc.setStrokeStyle('#81C6F6');
        cxt_arc.setLineCap('round');
        cxt_arc.beginPath();
        cxt_arc.arc(that.data.r, that.data.r, that.data.r1, 0, 2 * Math.PI, false);
        cxt_arc.stroke();
        cxt_arc.draw();
        // 外线
        var cxt_arcs = wx.createCanvasContext('canvasCircles');
        cxt_arcs.setLineWidth(0.3);
        cxt_arcs.setStrokeStyle('rgba(255, 255, 255, 0.2)');
        cxt_arcs.setLineCap('round');
        cxt_arcs.beginPath();
        cxt_arcs.arc(that.data.r, that.data.r, that.data.r2, 0, 2 * Math.PI, false);
        cxt_arcs.stroke();
        cxt_arcs.draw();
        // 百分比
        clearInterval(varName);
        function drawArc(s, e) {
          ctx.setFillStyle('white');
          ctx.clearRect(0, 0, 2 * that.data.r, 2 * that.data.r);
          ctx.draw();
          var x = that.data.r,
            y = that.data.r,
            radius = that.data.r1;
          ctx.setLineWidth(5);
          ctx.setStrokeStyle('#76FBF6');
          ctx.setLineCap('round');
          ctx.beginPath();
          ctx.arc(x, y, radius, s, e, false);
          ctx.stroke();
          ctx.draw();
        }
        var step = 1,
          startAngle = 1.5 * Math.PI,
          endAngle = 0;
        var animation_interval = 10,
          n = 60;
        let a = 0;
        if (this.data.current == 0) {
          console.log(this.data.params);
          console.log(this.data.params.gmvPercent);
          a = this.data.params.gmvPercent / 100;
          // a = 0.02 / 100;
        } else {
          a = this.data.params.effectivePercent / 100;
        }
        var animation = function() {
          if (step <= n) {
            endAngle = step * a * 2 * Math.PI / n + 1.5 * Math.PI;
            drawArc(startAngle, endAngle);
            step++;
          } else {
            clearInterval(varName);
          }
        };
        varName = setInterval(animation, animation_interval);
      },
      // SWIPER
      currentChange: function(e) {
        this.setData({
          current: e.detail.current
        });
        this.drawCircle();
      },
    
      onReady: function() {
        // this.drawCircle();
      },
      onLoad: function(options) {
        let that = this;
        wx.getSystemInfo({
          //获取系统信息成功,将系统窗口的宽高赋给页面的宽高
          success: function(res) {
            var widths = res.windowWidth;
            var heights = res.windowHeight;
            that.setData({
              width: 190 / 414 * widths,
              height: 190 / 414 * heights,
              r: 100 / 414 * widths,
              r1: 80 / 414 * widths,
              r2: 92 / 414 * widths
            });
          }
        });
      }
    });
    
    

    相关文章

      网友评论

          本文标题:微信小程序canvas 画动态圆环百分比进度条实例 根据手机屏

          本文链接:https://www.haomeiwen.com/subject/gliboftx.html