cvs
Version:
A basic canvas framework for 2d drawing.
185 lines (167 loc) • 4.52 kB
JavaScript
import Matrix from './matrix'
/**
* 删除 arr 中的某项
*/
export function remove (arr, item) {
const idx = arr.findIndex(ele => ele.id === item.id)
if (idx > -1) arr.splice(idx, 1)
}
/**
* 获取 arr 中的某项
*/
export function getItem (arr, id) {
const idx = arr.findIndex(ele => ele.id === id)
return arr[idx]
}
// 报错提示
export function error (message) {
throw Error('cvs: ' + message)
}
// // 四舍五入取整(将目标数字加上 0.5,然后对结果执行逐位运算以消除小数部分)
// export function int (num) {
// let rounded
// // With a bitwise or.
// rounded = (0.5 + num) | 0
// // A double bitwise not.
// rounded = ~~(0.5 + num)
// // Finally, a left bitwise shift.
// rounded = (0.5 + num) << 0
// return rounded
// }
// /**
// * 去除字符串两侧的空格,内含的多个空格转化为一个空格
// * @param {需要处理的字符串} str
// */
// export function delBlank (str) {
// let regEx = /\s+/g
// return str.trim().replace(regEx, ' ')
// }
/**
* 根据 key 获取对象中的值
* @param {取值对象} obj
* @param {描述键的字符串,支持链式键,如 a.b.c} key
*/
export function getValInObj (obj, key) {
return key.split('.').reduce((obj, name) => obj[name], obj)
}
/**
* 对数组进行排序
* @param {需要处理的数组} arr
* @param {处理对象数组时需要传入的每项的标记属性} key
* @param {是否是降序,默认升序} isDescend
*/
export function arrSort (arr, key, isDescend = false) {
if (!arr.length) return arr
arr.sort(function (a, b) {
if (isDescend) return getValInObj(b, key) - getValInObj(a, key)
else return getValInObj(a, key) - getValInObj(b, key)
})
return arr
}
export function arrSort2 (arr, key, isDescend = false) {
if (!arr.length) return arr
arr.sort(function (a, b) {
if (isDescend) return b.attr(key) - a.attr(key)
else return a.attr(key) - b.attr(key)
})
return arr
}
// 全局动画循环周期
export const period = 16
// 折返动画容错毫秒
export const tolerance = 50
// 开启动画循环
export const animFrame = (function () {
return (
requestAnimationFrame ||
webkitRequestAnimationFrame ||
mozRequestAnimationFrame ||
oRequestAnimationFrame ||
msRequestAnimationFrame ||
function (callback) {
setTimeout(callback, period)
}
)
})()
// 取消动画循环
export const cancelAnim = (function () {
return (
cancelAnimationFrame ||
webkitCancelAnimationFrame ||
mozCancelAnimationFrame ||
msCancelAnimationFrame ||
function (id) {
clearTimeout(id)
}
)
})()
// 判断是否是移动端
export const isMobile = (() => {
if (
navigator.userAgent.match(
/\b(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
)
) {
return true
} else {
return false
}
})()
const cacheCanvas = document.createElement('canvas')
// 创建 canvas 的上下文环境
export function createCtx (w, h) {
let canvas = cacheCanvas.cloneNode()
if (w) canvas.width = w
if (h) canvas.height = h
return canvas.getContext('2d')
}
// 循环遍历数组,vert 表示倒序遍历
export function forArr (arr, cb, vert) {
const len = arr.length
if (vert) {
for (let i = len - 1; i > -1; i--) {
cb(arr[i], i)
}
} else {
for (let i = 0; i < len; i++) {
cb(arr[i], i)
}
}
}
// 按写入顺序遍历对象
export function forObj (obj, cb) {
Object.entries(obj).forEach(item => {
let [key, val] = item
cb(key, val)
})
}
// 获得变换矩阵
export function getMatrix (transforms) {
let matrix = new Matrix()
if (Array.isArray(transforms)) {
matrix.multiply(transforms)
} else if (typeof transforms === 'object') {
Object.entries(transforms).forEach(([key, val]) => {
if (/\b(scale|translate|skew)\b/.test(key)) {
matrix[key](...oneOrTwoValues(val))
} else if (key === 'rotate') {
matrix[key](val)
} else if (key === 'transform') {
matrix.multiply(val)
}
})
}
return matrix.m
}
// 转化为二项数组
export function oneOrTwoValues (val) {
if (!Array.isArray(val)) return [val, val]
if (val.length === 1) return [val[0], val[0]]
return val
}
export function getRelativePos (x, y, rx, ry) {
return { x: x - rx, y: y - ry }
}
export function getFloatNum (str) {
return str.split('%')[0] / 100
}