| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 | "use strict";Object.defineProperty(exports, "__esModule", { value: true });var color_1 = require("../common/color");var component_1 = require("../common/component");var utils_1 = require("../common/utils");var validator_1 = require("../common/validator");var version_1 = require("../common/version");var canvas_1 = require("./canvas");function format(rate) {    return Math.min(Math.max(rate, 0), 100);}var PERIMETER = 2 * Math.PI;var BEGIN_ANGLE = -Math.PI / 2;var STEP = 1;(0, component_1.VantComponent)({    props: {        text: String,        lineCap: {            type: String,            value: 'round',        },        value: {            type: Number,            value: 0,            observer: 'reRender',        },        speed: {            type: Number,            value: 50,        },        size: {            type: Number,            value: 100,            observer: function () {                this.drawCircle(this.currentValue);            },        },        fill: String,        layerColor: {            type: String,            value: color_1.WHITE,        },        color: {            type: null,            value: color_1.BLUE,            observer: function () {                var _this = this;                this.setHoverColor().then(function () {                    _this.drawCircle(_this.currentValue);                });            },        },        type: {            type: String,            value: '',        },        strokeWidth: {            type: Number,            value: 4,        },        clockwise: {            type: Boolean,            value: true,        },    },    data: {        hoverColor: color_1.BLUE,    },    methods: {        getContext: function () {            var _this = this;            var _a = this.data, type = _a.type, size = _a.size;            if (type === '' || !(0, version_1.canIUseCanvas2d)()) {                var ctx = wx.createCanvasContext('van-circle', this);                return Promise.resolve(ctx);            }            var dpr = (0, utils_1.getSystemInfoSync)().pixelRatio;            return new Promise(function (resolve) {                wx.createSelectorQuery()                    .in(_this)                    .select('#van-circle')                    .node()                    .exec(function (res) {                    var canvas = res[0].node;                    var ctx = canvas.getContext(type);                    if (!_this.inited) {                        _this.inited = true;                        canvas.width = size * dpr;                        canvas.height = size * dpr;                        ctx.scale(dpr, dpr);                    }                    resolve((0, canvas_1.adaptor)(ctx));                });            });        },        setHoverColor: function () {            var _this = this;            var _a = this.data, color = _a.color, size = _a.size;            if ((0, validator_1.isObj)(color)) {                return this.getContext().then(function (context) {                    if (!context)                        return;                    var LinearColor = context.createLinearGradient(size, 0, 0, 0);                    Object.keys(color)                        .sort(function (a, b) { return parseFloat(a) - parseFloat(b); })                        .map(function (key) {                        return LinearColor.addColorStop(parseFloat(key) / 100, color[key]);                    });                    _this.hoverColor = LinearColor;                });            }            this.hoverColor = color;            return Promise.resolve();        },        presetCanvas: function (context, strokeStyle, beginAngle, endAngle, fill) {            var _a = this.data, strokeWidth = _a.strokeWidth, lineCap = _a.lineCap, clockwise = _a.clockwise, size = _a.size;            var position = size / 2;            var radius = position - strokeWidth / 2;            context.setStrokeStyle(strokeStyle);            context.setLineWidth(strokeWidth);            context.setLineCap(lineCap);            context.beginPath();            context.arc(position, position, radius, beginAngle, endAngle, !clockwise);            context.stroke();            if (fill) {                context.setFillStyle(fill);                context.fill();            }        },        renderLayerCircle: function (context) {            var _a = this.data, layerColor = _a.layerColor, fill = _a.fill;            this.presetCanvas(context, layerColor, 0, PERIMETER, fill);        },        renderHoverCircle: function (context, formatValue) {            var clockwise = this.data.clockwise;            // 结束角度            var progress = PERIMETER * (formatValue / 100);            var endAngle = clockwise                ? BEGIN_ANGLE + progress                : 3 * Math.PI - (BEGIN_ANGLE + progress);            this.presetCanvas(context, this.hoverColor, BEGIN_ANGLE, endAngle);        },        drawCircle: function (currentValue) {            var _this = this;            var size = this.data.size;            this.getContext().then(function (context) {                if (!context)                    return;                context.clearRect(0, 0, size, size);                _this.renderLayerCircle(context);                var formatValue = format(currentValue);                if (formatValue !== 0) {                    _this.renderHoverCircle(context, formatValue);                }                context.draw();            });        },        reRender: function () {            var _this = this;            // tofector 动画暂时没有想到好的解决方案            var _a = this.data, value = _a.value, speed = _a.speed;            if (speed <= 0 || speed > 1000) {                this.drawCircle(value);                return;            }            this.clearMockInterval();            this.currentValue = this.currentValue || 0;            var run = function () {                _this.interval = setTimeout(function () {                    if (_this.currentValue !== value) {                        if (Math.abs(_this.currentValue - value) < STEP) {                            _this.currentValue = value;                        }                        else if (_this.currentValue < value) {                            _this.currentValue += STEP;                        }                        else {                            _this.currentValue -= STEP;                        }                        _this.drawCircle(_this.currentValue);                        run();                    }                    else {                        _this.clearMockInterval();                    }                }, 1000 / speed);            };            run();        },        clearMockInterval: function () {            if (this.interval) {                clearTimeout(this.interval);                this.interval = null;            }        },    },    mounted: function () {        var _this = this;        this.currentValue = this.data.value;        this.setHoverColor().then(function () {            _this.drawCircle(_this.currentValue);        });    },    destroyed: function () {        this.clearMockInterval();    },});
 |