ZetCode

JavaScript Canvas getLineDash 教程

最后修改于 2025 年 4 月 3 日

本教程将深入探讨 JavaScript 中的 Canvas getLineDash 方法。此方法对于在 Canvas 绘图中处理虚线图案至关重要。学习如何有效地检索和操作虚线图案。

基本定义

getLineDash 方法返回当前的虚线图案。它与 setLineDash 配合使用来创建和检查虚线描边。该图案是一个数字数组,用于指定虚线/间隙的长度。

虚线可用于多种目的,例如焦点指示器、网格线或装饰性元素。理解 getLineDash 有助于在复杂的绘图中保持一致的虚线图案。

基本的 getLineDash 用法

此示例演示了如何检索默认的虚线图案。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Basic getLineDash</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>
<p id="dashInfo"></p>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    const dashPattern = ctx.getLineDash();
    document.getElementById('dashInfo').textContent = 
        `Default dash pattern: [${dashPattern}]`;
</script>

</body>
</html>

此代码在修改任何内容之前检索默认的虚线图案。该图案显示在 Canvas 下方的段落元素中。

默认情况下,getLineDash 返回一个空数组,表示实线。这为理解虚线图案的变化提供了一个基准。

获取当前虚线图案

此示例展示了在设置虚线图案后如何获取当前的虚线图案。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Current Dash Pattern</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>
<p id="dashInfo"></p>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.setLineDash([10, 5, 3, 5]);
    const dashPattern = ctx.getLineDash();
    
    document.getElementById('dashInfo').textContent = 
        `Current dash pattern: [${dashPattern}]`;
    
    ctx.beginPath();
    ctx.moveTo(50, 100);
    ctx.lineTo(250, 100);
    ctx.stroke();
</script>

</body>
</html>

在这里,我们设置了一个复杂的虚线图案 [10,5,3,5],然后使用 getLineDash 检索它。该图案的含义是:10px 虚线,5px 间隙,3px 虚线,5px 间隙,循环重复。

检索到的图案将被显示并用于绘制一条水平线。这演示了 getLineDash 如何反映当前状态。

绘制前的图案检查

此示例展示了如何在绘制前检查和修改虚线图案。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Pattern Inspection</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Save current dash pattern
    const originalDash = ctx.getLineDash();
    
    // Set new pattern
    ctx.setLineDash([15, 5]);
    
    // Draw with new pattern
    ctx.beginPath();
    ctx.moveTo(50, 50);
    ctx.lineTo(250, 50);
    ctx.stroke();
    
    // Restore original pattern
    ctx.setLineDash(originalDash);
</script>

</body>
</html>

此代码演示了一种常见的图案工作流程:保存当前的虚线设置,应用新图案,绘制,然后恢复原始设置。

使用 getLineDash 存储原始图案可确保我们在临时修改后能够恢复到之前的状态。这在复杂的绘图操作中非常有用。

图案比较

此示例并排比较了不同的虚线图案。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Pattern Comparison</title>
</head>
<body>

<canvas id="myCanvas" width="400" height="300"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    const patterns = [
        { pattern: [5, 5], y: 50, color: 'red' },
        { pattern: [10, 5], y: 100, color: 'blue' },
        { pattern: [15, 3, 3, 3], y: 150, color: 'green' },
        { pattern: [20], y: 200, color: 'purple' }
    ];
    
    patterns.forEach(item => {
        ctx.setLineDash(item.pattern);
        const currentPattern = ctx.getLineDash();
        console.log(`Pattern at y=${item.y}:`, currentPattern);
        
        ctx.beginPath();
        ctx.strokeStyle = item.color;
        ctx.moveTo(50, item.y);
        ctx.lineTo(350, item.y);
        ctx.stroke();
    });
</script>

</body>
</html>

此代码创建了四条具有不同虚线图案的线。每个图案都使用 getLineDash 记录到控制台进行检查。

这些图案展示了各种配置:相等的虚线/间隙,较长的虚线,复杂的图案,以及产生点的单个值图案。这有助于可视化不同图案的渲染方式。

动态图案调整

此示例展示了如何根据条件动态调整虚线图案。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Dynamic Adjustment</title>
</head>
<body>

<canvas id="myCanvas" width="400" height="300"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    function drawDashedLine(x1, y1, x2, y2, baseLength) {
        const currentPattern = ctx.getLineDash();
        const newPattern = currentPattern.length === 0 ?
            [baseLength, baseLength/2] :
            currentPattern.map(v => v * 1.5);
        
        ctx.setLineDash(newPattern);
        ctx.beginPath();
        ctx.moveTo(x1, y1);
        ctx.lineTo(x2, y2);
        ctx.stroke();
        
        return newPattern;
    }
    
    // Draw progressively changing dashed lines
    let lastPattern = [];
    for (let i = 0; i < 5; i++) {
        lastPattern = drawDashedLine(50, 50 + i*40, 350, 50 + i*40, 10);
        console.log(`Line ${i+1} pattern:`, lastPattern);
    }
</script>

</body>
</html>

此示例创建了一个函数,该函数使用动态图案绘制虚线。它会检查当前图案,然后创建一个新图案或修改现有图案。

后续的每一条线都会获得不同的图案——要么以 [10,5] 开始,要么将前一个图案乘以 1.5 倍。图案会被记录下来以显示进度。这演示了 getLineDash 的实际应用。

来源

MDN getLineDash 文档

本教程涵盖了 getLineDash 方法的各个方面。从基本检索到动态图案调整,这些示例提供了对 Canvas 中虚线处理的全面理解。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 JS Canvas 教程