HTML5 canvas 线条教程
使用 Konva
创建线条形状时,可以实例化一个 Konva.Line()
对象。线条可以通过不同配置创建各种形状,如简单线条、样条曲线、blob 和多边形。
欲查看完整属性和方法列表,请参考 Line API 参考。
简单线条
- Vanilla
- React
- Vue
import Konva from 'konva'; const stage = new Konva.Stage({ container: 'container', width: window.innerWidth, height: window.innerHeight }); const layer = new Konva.Layer(); stage.add(layer); const redLine = new Konva.Line({ points: [5, 70, 140, 23, 250, 60, 300, 20], stroke: 'red', strokeWidth: 15, lineCap: 'round', lineJoin: 'round' }); // 虚线 const greenLine = new Konva.Line({ points: [5, 70, 140, 23, 250, 60, 300, 20], stroke: 'green', strokeWidth: 2, lineJoin: 'round', dash: [33, 10] }); greenLine.y(50); layer.add(redLine, greenLine);
import { Stage, Layer, Line } from 'react-konva'; const App = () => { return ( <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Line points={[5, 70, 140, 23, 250, 60, 300, 20]} stroke="red" strokeWidth={15} lineCap="round" lineJoin="round" /> <Line points={[5, 70, 140, 23, 250, 60, 300, 20]} stroke="green" strokeWidth={2} lineJoin="round" dash={[33, 10]} y={50} /> </Layer> </Stage> ); }; export default App;
<template> <v-stage :config="stageSize"> <v-layer> <v-line :config="redLineConfig" /> <v-line :config="greenLineConfig" /> </v-layer> </v-stage> </template> <script setup> const stageSize = { width: window.innerWidth, height: window.innerHeight }; const redLineConfig = { points: [5, 70, 140, 23, 250, 60, 300, 20], stroke: 'red', strokeWidth: 15, lineCap: 'round', lineJoin: 'round' }; const greenLineConfig = { points: [5, 70, 140, 23, 250, 60, 300, 20], stroke: 'green', strokeWidth: 2, lineJoin: 'round', dash: [33, 10], y: 50 }; </script>
样条曲线(弯曲线条)
要创建弯曲的线条,添加 tension
属性:
- Vanilla
- React
- Vue
import Konva from 'konva'; const stage = new Konva.Stage({ container: 'container', width: window.innerWidth, height: window.innerHeight }); const layer = new Konva.Layer(); stage.add(layer); const line = new Konva.Line({ points: [5, 70, 140, 23, 250, 60, 300, 20], stroke: 'red', strokeWidth: 15, lineCap: 'round', lineJoin: 'round', tension: 1 }); layer.add(line);
import { Stage, Layer, Line } from 'react-konva'; const App = () => { return ( <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Line points={[5, 70, 140, 23, 250, 60, 300, 20]} stroke="red" strokeWidth={15} lineCap="round" lineJoin="round" tension={1} /> </Layer> </Stage> ); }; export default App;
<template> <v-stage :config="stageSize"> <v-layer> <v-line :config="lineConfig" /> </v-layer> </v-stage> </template> <script setup> const stageSize = { width: window.innerWidth, height: window.innerHeight }; const lineConfig = { points: [5, 70, 140, 23, 250, 60, 300, 20], stroke: 'red', strokeWidth: 15, lineCap: 'round', lineJoin: 'round', tension: 1 }; </script>
多边形
要创建多边形,将 closed
属性设置为 true:
- Vanilla
- React
- Vue
import Konva from 'konva'; const stage = new Konva.Stage({ container: 'container', width: window.innerWidth, height: window.innerHeight }); const layer = new Konva.Layer(); stage.add(layer); const polygon = new Konva.Line({ points: [73, 192, 73, 160, 340, 23, 500, 109, 499, 139, 342, 93], fill: '#00D2FF', stroke: 'black', strokeWidth: 5, closed: true }); layer.add(polygon);
import { Stage, Layer, Line } from 'react-konva'; const App = () => { return ( <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Line points={[73, 192, 73, 160, 340, 23, 500, 109, 499, 139, 342, 93]} fill="#00D2FF" stroke="black" strokeWidth={5} closed /> </Layer> </Stage> ); }; export default App;
<template> <v-stage :config="stageSize"> <v-layer> <v-line :config="polygonConfig" /> </v-layer> </v-stage> </template> <script setup> const stageSize = { width: window.innerWidth, height: window.innerHeight }; const polygonConfig = { points: [73, 192, 73, 160, 340, 23, 500, 109, 499, 139, 342, 93], fill: '#00D2FF', stroke: 'black', strokeWidth: 5, closed: true }; </script>
Blob(流体形状)
要创建 blob,结合使用 closed
和 tension
属性:
- Vanilla
- React
- Vue
import Konva from 'konva'; const stage = new Konva.Stage({ container: 'container', width: window.innerWidth, height: window.innerHeight }); const layer = new Konva.Layer(); stage.add(layer); const blob = new Konva.Line({ points: [23, 20, 23, 160, 70, 93, 150, 109, 290, 139, 270, 93], fill: '#00D2FF', stroke: 'black', strokeWidth: 5, closed: true, tension: 0.3 }); layer.add(blob);
import { Stage, Layer, Line } from 'react-konva'; const App = () => { return ( <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Line points={[23, 20, 23, 160, 70, 93, 150, 109, 290, 139, 270, 93]} fill="#00D2FF" stroke="black" strokeWidth={5} closed tension={0.3} /> </Layer> </Stage> ); }; export default App;
<template> <v-stage :config="stageSize"> <v-layer> <v-line :config="blobConfig" /> </v-layer> </v-stage> </template> <script setup> const stageSize = { width: window.innerWidth, height: window.innerHeight }; const blobConfig = { points: [23, 20, 23, 160, 70, 93, 150, 109, 290, 139, 270, 93], fill: '#00D2FF', stroke: 'black', strokeWidth: 5, closed: true, tension: 0.3 }; </script>