UNPKG

paint-canvas

Version:
328 lines (308 loc) 11 kB
const libs={ /** *数组去重 *适用[string,number]类型 *ES6 版 :Array.from(new Set(array)); */ unique:(arr) => { let res = []; let json = {}; for(let i = 0;i < arr.length;i++){ if(!json[arr[i]]){ res.push(arr[i]); json[arr[i]] = true; } } return res; }, unique2:(arr) => { let [tempObj,newArray] = [{},[]]; for(let i = 0;i < arr.length;i++){ if(!tempObj[arr[i]]){ tempObj[arr[i]] = arr[i]; newArray.push(arr[i]); } } return newArray; }, /** *冒泡排序 *@param:arr(Array) */ dobbleSort:(arr) => { for(let i = 0;i < arr.length-1;i++){ for(let j = 0;j < arr.length-i-1;j++){ if(arr[j] > arr[j+1]){ var temporary = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temporary; } } } }, /** *快速排序 *@param:arr(Array) */ quickSort:function(arr) { if(arr.length <= 1){return arr;} let pivotIdx = Math.floor(arr.length / 2); let pivot = arr.splice(pivotIdx,1)[0]; let [left,right] = [[],[]] for(let i = 0;i < arr.length;i++){ if(arr[i] < pivot){ left.push(arr[i]); }else{ right.push(arr[i]); } } return this.quickSort(left).concat([pivot],this.quickSort(right)); }, /** *插入排序 *@param:arr(Array) */ insertSort:(arr) => { let j,step,key; for(let i = 0;i < arr.length;i++){ step = j = i; key = arr[j]; while(--j > -1){ if(arr[j] > key){ arr[j+1] = arr[j]; }else{ break; } } arr[j+1] = key; } return arr; }, /** *二分查找 *@param:data(Array) *@param:item(Number) */ binarySearch:(data,item) => { let len = data.length - 1; let bes = 0; while(bes <= len){ let m = Math.floor((len + bes) / 2); if(data[m] == item){ return m; } if(item > data[m]){ bes = m + 1; }else{ len = m - 1; } } return false; }, /** *对象或数组类型深拷贝 *@param:arg(Array or Object) *Array.isArray(target):只有IE9以上标准模式下的浏览器支持。 */ clone:(arg) => { let o = (arg.constructor === Array && arg instanceof Array && Object.prototype.toString.call((arg)) == '[object Array]' ) ? [] : {}; for(let e in arg){ o[e] = arg.typeof === 'object' ? arg.clone() : arg[e]; } return o; }, /** *圆弧进度条 *@param:canvasParentEle(String:eleID) canvas外层div的ID *@param:canvasSelf(String:eleID) canvas的ID *@param:isTrueOrFalse(boolean) true为圆弧进度条,false为整园进度条 *@param:progrColor(String) 绘制进度圆的颜色值 *进度条的值设置在canvas的data-progress上,值区间0~100 */ drawCricle:(canvasParentEle,canvasSelf,isTrueOrFalse,progrColor)=>{ if(!canvasParentEle && !canvasSelf && !isTrueOrFalse){ console.error('arguments not meeting expectations'); return }; let canvasParent = document.getElementById(canvasParentEle); let canvas = document.getElementById(canvasSelf); let dataPorgress = Number(canvas.dataset.progress); // 字符串'%'替换处理 if(isNaN(dataPorgress)){ dataPorgress = Number(canvas.dataset.progress.replace('%','')); } let porgress = isTrueOrFalse ? 1.4*(dataPorgress)/100 : 2*(dataPorgress)/100; let CanvasWidth = (window.getComputedStyle(canvasParent).getPropertyValue('width')).replace(/px/g,''); let CanvasHeight = (window.getComputedStyle(canvasParent).getPropertyValue('height')).replace(/px/g,''); canvas.width = CanvasWidth*2; canvas.height = CanvasHeight*2; // canvas.style.width为canvas.width的一半用于避免绘制后出现模糊不清晰 canvas.style.width = canvas.width/2+'px'; canvas.style.height = canvas.height/2+'px'; let res;// 绘制百分比所需的半径 let lineWidth = CanvasWidth/12.5;// 绘制圆弧线宽 let setData={ x:canvas.width/2, y:canvas.height/2, r:(canvas.width-lineWidth-2)/2// 减2控制绘制的圆弧与canvas的边界紧密贴合,防止出现canvas边界出现模糊 } let ctx = canvas.getContext('2d'); ctx.lineCap="round"; // 绘制底圆 ctx.beginPath(); if(isTrueOrFalse==true){ ctx.arc( setData.x, setData.y, setData.r, 0.8*Math.PI,//开始角 2.2*Math.PI,//结束角 false//False = 顺时针,true = 逆时针。 );//绘制圆弧进度条所需的半径总共1.5PI }else if(isTrueOrFalse==false){ ctx.arc( setData.x, setData.y, setData.r, 0*Math.PI,//开始角 2*Math.PI,//结束角 false//False = 顺时针,true = 逆时针。 );//绘制圆弧进度条所需的半径总共1.5PI } ctx.strokeStyle = '#e6e6e6'; ctx.lineWidth = isTrueOrFalse ? lineWidth : lineWidth/3; ctx.stroke(); ctx.closePath(); if(porgress>100 || porgress==0){return} // 绘制进度圆 ctx.beginPath(); ctx.arc( setData.x, setData.y, setData.r, 0.8*Math.PI,//开始角 (0.8+porgress)*Math.PI,//结束角 false ); ctx.strokeStyle = progrColor || '#ff9331'; ctx.lineWidth = lineWidth; ctx.stroke(); ctx.closePath(); }, /** *@param:promise(Promise) promise对象 *@param:type(String) 'json' 返回json格式 *返回一个promise对象,可以使用.then来处理response参数 */ Fetch:(promise,type)=>{ if(!promise && typeof promise !== 'object' && JSON.stringify(promise) != '{}') return 'arguments error!'; return new Promise((resolve,reject) => { fetch(promise).then((response) => { if(response.status == 200){ // console.log(response.headers.get('Content-Type')); // console.log(response.headers.get('Date')); // resolve(response.json()); (type && type == 'json') ? resolve(response.json()) : resolve(response); }else{ reject(response); } }).catch((err) => {console.log(err);}) }) }, /** *移动端手势判断 *根据起点和终点返回方向 1:向上,2:向下,3:向左,4:向右,0:未滑动 *@param:startX(Number) 开始坐标X轴 *@param:startY(Number) 开始坐标Y轴 *@param:endX(Number) 结束坐标X轴 *@param:endY(Number) 结束坐标Y轴 */ GetSlideDirection:(startX,startY, endX, endY)=>{ let dy = startY - endY; let dx = endX - startX; let result = 0; //如果滑动距离太短 if (Math.abs(dx) < 2 && Math.abs(dy) < 2) { return result; } // 获取手势方向 let angle = Math.atan2(dy,dx) * 180 / Math.PI;//返回角度 if (angle >= -45 && angle < 45) { result = 4; }else if (angle >= 45 && angle < 135) { result = 1; }else if (angle >= -135 && angle < -45) { result = 2; }else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) { result = 3; } return result; }, /** *根据传入的值获取当前时间YY-MM-DD or YY-MM-DD h:m:s *@param:strDate(String) 'max:最大时间 min:最小时间 cur:当前时间' 默认当前时间 *@param:sizeDate(Number) '最大、小年数值' 默认为0 */ getFormDate:(strDate = 'cur',sizeDate = 0)=>{ let date = new Date(); let [splice1,splice2] = ["-",":"]; let year = date.getFullYear(); let month = date.getMonth() + 1; let day = date.getDate(); let hours = date.getHours(); let minutes = date.getMinutes(); let seconds = date.getSeconds(); let cur = [year , month , day]; let max = [(year + sizeDate) , month , day]; let min = [(year - sizeDate) , month , day]; if(strDate == 'cur'){ return cur; }else if(strDate == 'max'){ return max; }else if(strDate == 'min'){ return min; }else{ return year + splice1 + month + splice1 + day + " " + hours + splice2 + minutes + splice2 + seconds; } }, /** *根据传入的年和月份返回当月天数 *@param:year(Number) *@param:month(Number) */ getDaysInMonth:(year,month) => { //parseInt(number,type)这个函数后面如果不跟第2个参数来表示进制的话,默认是10进制。 month = parseInt(month,10); var temp = new Date(year,month,0); return temp.getDate(); }, /** *获取正数组的最大差值 *@param:arr(array) */ getMaxProfilt:(arr) => { let minPrice = arr[0]; let maxProfit = 0; for(let i = 0;i < arr.length;i++){ let currentPrice = arr[i]; minPrice = Math.min(minPrice,currentPrice); let potentailProfit = currentPrice - minPrice; maxProfit = Math.max(maxProfit,potentailProfit); } return maxProfit; }, /** *随机生成指定n位数的字符串 *@param:n(number) */ randomString:(n) => { let str = 'abcdefghijklmnopqrstuvwxyz9876543210'; let tmp = ''; let len = str.length; for(let i = 0; i < n;i++){ tmp += str.charAt(Math.floor(Math.random()*len)); } return tmp; } } module.exports = libs;