如何使用canvas画出平滑的曲线?(代码)


本文摘自PHP中文网,作者不言,侵删。

本篇文章给大家带来的内容是关于如何使用canvans画出平滑的曲线?(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

背景概要

相信大家平时在学习canvas 或 项目开发中使用canvas的时候应该都遇到过这样的需求:实现一个可以书写的画板小工具。

嗯,相信这对canvas使用较熟的童鞋来说仅仅只是几十行代码就可以搞掂的事情,以下demo就是一个再也简单不过的例子了:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

<!DOCTYPE html>

<html>

<head>

    <title>Sketchpad demo</title>

    <style type="text/css">

        canvas {

            border: 1px blue solid;

        }

    </style>

</head>

<body>

    <canvas id="canvas" width="800" height="500"></canvas>

    <script type="text/javascript">

        let isDown = false;

        let beginPoint = null;

        const canvas = document.querySelector('#canvas');

        const ctx = canvas.getContext('2d');

 

        // 设置线条颜色

        ctx.strokeStyle = 'red';

        ctx.lineWidth = 1;

        ctx.lineJoin = 'round';

        ctx.lineCap = 'round';

 

        canvas.addEventListener('mousedown', down, false);

        canvas.addEventListener('mousemove', move, false);

        canvas.addEventListener('mouseup', up, false);

        canvas.addEventListener('mouseout', up, false);

 

        function down(evt) {

            isDown = true;

            beginPoint = getPos(evt);

        }

 

        function move(evt) {

            if (!isDown) return;

            const endPoint = getPos(evt);

            drawLine(beginPoint, endPoint);

            beginPoint = endPoint;

        }

 

        function up(evt) {

            if (!isDown) return;

             

            const endPoint = getPos(evt);

            drawLine(beginPoint, endPoint);

 

            beginPoint = null;

            isDown = false;

        }

 

        function getPos(evt) {

            return {

                x: evt.clientX,

                y: evt.clientY

            }

        }

 

        function drawLine(beginPoint, endPoint) {

            ctx.beginPath();

            ctx.moveTo(beginPoint.x, beginPoint.y);

            ctx.lineTo(endPoint.x, endPoint.y);

            ctx.stroke();

            ctx.closePath();

        }

    </script>

</body>

</html>

它的实现逻辑也很简单:

  1. 我们在canvas画布上主要监听了三个事件:mousedown、mouseup和mousemove,同时我们也创建了一个isDown变量;

  2. 当用户按下鼠标(mousedown,即起笔)时将isDown置为true,而放下鼠标(mouseup)的时候将它置为false,这样做的好处就是可以判断用户当前是否处于绘画状态;

  3. 通过mousemove事件不断采集鼠标经过的坐标点,当且仅当isDown为true(即处于书写状态)时将当前的点通过canvas的lineTo方法与前面的点进行连接、绘制;

通过以上几个步骤我们就可以实现基本的画板功能了,然而事情并没那么简单,仔细的童鞋也许会发现一个很严重的问题――通过这种方式画出来的线条存在锯齿,不够平滑,而且你画得越快,折线感越强。表现如下图所示:

3585474570-5bc1baacc8d5b_articlex.png

为什么会这样呢?

问题分析

阅读剩余部分

相关阅读 >>

html实现像百度的首页效果一样的背景图(代码)

html5容易被忽略的小知识

storage event如何实现页面间通信

h5编辑器核心思想的实例分析

h5有哪些清空画布方法

javascript中function的详细理解(附代码)

html object 元素使用教程

javascript如何进行文档注释

html怎么设置label标签的颜色

html2 canvas实现浏览器截图

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...