canvas 橡皮擦 解决滑动过快出现圆点问题
2016-03-29 12:28
525 查看
先看第一段 js 代码
canvas.addEventListener('touchmove', function (e) {
ctx.beginPath();
ctx.arc(e.targetTouches[0].clientX, e.targetTouches[0].clientY, 25, 0, 2 * Math.PI);
ctx.fill();
});
第二段 js 代码 ,解决这个问题,但是加了点算法,时间空间复杂度也大,换来好的用户体验
canvas.addEventListener('touchmove', function (e) {
ctx.beginPath();
ctx.arc(e.targetTouches[0].clientX, e.targetTouches[0].clientY, 25, 0, 2 * Math.PI);
ctx.fill();
});
</pre><p></p><pre>很简单的代码 ,每次触发 touchmove 事件 画一个圆擦去canvas背景,但是如果手指滑动过快,获取的鼠标点间距就会太大,那么会出现间隔的圆,用户体验较差。
第二段 js 代码 ,解决这个问题,但是加了点算法,时间空间复杂度也大,换来好的用户体验
var flag = true; canvas.addEventListener('touchmove', function (e) { setTimeout(function () { if (flag) { //第一次触发 只记录p1点 flag = false; p1 = new point(e.targetTouches[0].clientX, e.targetTouches[0].clientY); return; } p2 = new point(e.targetTouches[0].clientX, e.targetTouches[0].clientY); //后面n次触发 记录p2点 k = (p2.y - p1.y) / (p2.x - p1.x); // p1 p2直线斜率 b = p1.y - k * p1.x; //y = kx + b 的 b var d = Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2)); //两点之间的距离 var num = d * 0.2; //两点之间要画多少个圆才能看起来像条平滑直线,0.2 是平均每像素的距离 画0.2个圆,100像素的距离画20个圆足够 //注意 这里圆点半径为15 - 25像素适应 var x = p1.x, y = p1.y; //第一个圆的位置 var n = (p2.x - p1.x) / num;//每个圆心之间的间距 for (var i = 0; i < num; i++) { //依次在这条直线上画 num 个圆 ctx.beginPath(); ctx.arc(x, y, 25, 0, 2 * Math.PI); ctx.fill(); x += n; y = k * x + b; } p1 = p2; //最后 将p2 赋给 p1 }, 1); }); canvas.addEventListener('touchend', function (e) { //最后手指弹起重新开始 flag = true; }, 1);
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解