| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | /*** 水球图 wataerbubble* @author fiona23 (fiona_fanmy@163.com)*/(function($) {    $.fn.waterbubble = function(options) {            var config = $.extend({                radius: 100,                lineWidth: undefined,                data: 0.5,                waterColor: 'rgba(25, 139, 201, 1)',                textColor: 'rgba(06, 85, 128, 0.8)',                font: '',                wave: true,                txt: undefined,                animation: true            }, options);            var canvas = this[0];//          config.lineWidth = config.lineWidth ? config.lineWidth : config.radius/24;			config.lineWidth = options.lineWidth;            var waterbubble = new Waterbubble(canvas, config);            return this;        }                function Waterbubble (canvas, config) {            this.refresh(canvas, config);        }        Waterbubble.prototype = {            refresh: function (canvas, config) {                canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height)                this._init(canvas, config)            },            _init: function (canvas, config){                var radius = config.radius;                var lineWidth = config.lineWidth;                canvas.width = radius*2 + lineWidth;                canvas.height = radius*2 + lineWidth;                this._buildShape(canvas, config);            },            _buildShape: function (canvas, config) {                var ctx = canvas.getContext('2d');                var gap = config.lineWidth*2;                //raidus of water                var r = config.radius - gap;                var data = config.data;                var lineWidth = config.lineWidth                var waterColor = config.waterColor;                var textColor = config.textColor;                var font = config.font;                var wave = config.wave                // //the center of circle                var x = config.radius + lineWidth/2;                var y = config.radius + lineWidth/2;                ctx.beginPath();                                ctx.arc(x, y, config.radius, 0, Math.PI*2);                ctx.lineWidth = lineWidth;                ctx.strokeStyle = waterColor;                ctx.stroke();                //if config animation true                if (config.animation) {                    this._animate(ctx, r, data, lineWidth, waterColor, x, y, wave)                } else {                    this._fillWater(ctx, r, data, lineWidth, waterColor, x, y, wave);                }                                if (typeof config.txt == 'string'){                    this._drawText(ctx, textColor, font, config.radius, data, x, y, config.txt);                }                return;            },            _fillWater: function (ctx, r, data, lineWidth, waterColor, x, y, wave) {                ctx.beginPath();                ctx.globalCompositeOperation = 'destination-over';                //start co-ordinates                var sy = r*2*(1 - data) + (y - r);                var sx = x - Math.sqrt((r)*(r) - (y - sy)*(y - sy));                //middle co-ordinates                var mx = x;                var my = sy;                //end co-ordinates                var ex = 2*mx - sx;                var ey = sy;                var extent; //extent                if (data > 0.9 || data < 0.1 || !wave) {                    extent = sy                } else{                    extent = sy - (mx -sx)/4                }                ctx.beginPath();                                ctx.moveTo(sx, sy)                ctx.quadraticCurveTo((sx + mx)/2, extent, mx, my);                ctx.quadraticCurveTo((mx + ex)/2, 2*sy - extent, ex, ey);                var startAngle = -Math.asin((x - sy)/r)                var endAngle = Math.PI - startAngle;                ctx.arc(x, y, r, startAngle, endAngle, false)                ctx.fillStyle = waterColor;                ctx.fill()            },            _drawText: function (ctx, textColor, font, radius, data, x, y, txt) {                ctx.globalCompositeOperation = 'source-over';                var size = font ? font.replace( /\D+/g, '') : 0.4*radius;                ctx.font = font ? font : 'bold ' + size + 'px Microsoft Yahei';                txt = txt.length ? txt : data*100 + '%'                var sy = y + size/2;                var sx = x - ctx.measureText(txt).width/2                ctx.fillStyle = textColor;                ctx.fillText(txt, sx, sy)            },            _animate: function (ctx, r, data, lineWidth, waterColor, x, y, wave) {                var datanow = {                    value: 0                };                var requestAnimationFrame = window.requestAnimationFrame || window.msRequestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function (func) {                    setTimeout(func, 16);                };                var self = this;                var update = function () {                    if (datanow.value < data - 0.01) {                        datanow.value += (data - datanow.value)/15                        self._runing = true;                    } else {                        self._runing = false;                    }                }                var step = function () {                    self._fillWater(ctx, r, datanow.value, lineWidth, waterColor, x, y, wave);                    update();                    if (self._runing) {                        requestAnimationFrame(step);                    }                }                step(ctx, r, datanow, lineWidth, waterColor, x, y, wave)            }        }}(jQuery));
 |