canvas 橡皮擦 解决滑动过快出现圆点问题
Posted Rand Tsui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了canvas 橡皮擦 解决滑动过快出现圆点问题相关的知识,希望对你有一定的参考价值。
先看第一段 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);
以上是关于canvas 橡皮擦 解决滑动过快出现圆点问题的主要内容,如果未能解决你的问题,请参考以下文章
滑动过快或连续左右滑动非常快时如何跟踪pageViewController的索引
IOS端小程序橡皮筋回弹效果解决方案及坑总结(uni-swipe-action在IOS端的坑)
IOS端小程序橡皮筋回弹效果解决方案及坑总结(uni-swipe-actiond在IOS端的坑)