HTML5 Canvas 使用 Konva 监听或不监听事件
要使用 Konva 监听或不监听事件,我们可以在实例化形状时将配置对象的 listening 属性设置为 true 或 false,或者可以使用 setListening()
方法设置 listening 属性。 一旦我们为一个或多个节点设置了 listening 属性,我们还需要使用 drawHit()
方法重新绘制每个受影响的层的命中图形。
说明:将鼠标悬停在椭圆上以观察事件处理程序未被执行。点击“监听”以开始监听事件,并观察事件处理程序现在被执行。
- 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 text = new Konva.Text({ x: 10, y: 10, fontFamily: 'Calibri', fontSize: 24, text: '', fill: 'black', }); layer.add(text); const oval = new Konva.Ellipse({ x: stage.width() / 2, y: stage.height() / 2, radiusX: 100, radiusY: 50, fill: 'yellow', stroke: 'black', strokeWidth: 4, listening: false, }); oval.on('mouseover', function () { writeMessage('鼠标悬停在椭圆上'); }); oval.on('mouseout', function () { writeMessage(''); }); function writeMessage(message) { text.text(message); } layer.add(oval); // 添加切换监听的按钮 const button = document.createElement('button'); button.innerHTML = '监听'; document.body.appendChild(button); button.addEventListener('click', () => { const listening = !oval.listening(); oval.listening(listening); button.innerHTML = listening ? '停止监听' : '监听'; layer.drawHit(); });
import { Stage, Layer, Ellipse, Text } from 'react-konva'; import { useState } from 'react'; const App = () => { const [message, setMessage] = useState(''); const [listening, setListening] = useState(false); return ( <> <button onClick={() => setListening(!listening)}> {listening ? '停止监听' : '监听'} </button> <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Text x={10} y={10} fontFamily="Calibri" fontSize={24} text={message} fill="black" /> <Ellipse x={window.innerWidth / 2} y={window.innerHeight / 2} radiusX={100} radiusY={50} fill="yellow" stroke="black" strokeWidth={4} listening={listening} onMouseover={() => setMessage('鼠标悬停在椭圆上')} onMouseout={() => setMessage('')} /> </Layer> </Stage> </> ); }; export default App;
<template> <div> <button @click="toggleListening"> {{ listening ? '停止监听' : '监听' }} </button> <v-stage :config="stageSize"> <v-layer> <v-text :config="textConfig" /> <v-ellipse :config="ovalConfig" @mouseover="handleMouseover" @mouseout="handleMouseout" /> </v-layer> </v-stage> </div> </template> <script setup> import { ref, computed } from 'vue'; const message = ref(''); const listening = ref(false); const stageSize = { width: window.innerWidth, height: window.innerHeight }; const textConfig = computed(() => ({ x: 10, y: 10, fontFamily: 'Calibri', fontSize: 24, text: message.value, fill: 'black' })); const ovalConfig = computed(() => ({ x: window.innerWidth / 2, y: window.innerHeight / 2, radiusX: 100, radiusY: 50, fill: 'yellow', stroke: 'black', strokeWidth: 4, listening: listening.value })); const handleMouseover = () => { message.value = '鼠标悬停在椭圆上'; }; const handleMouseout = () => { message.value = ''; }; const toggleListening = () => { listening.value = !listening.value; }; </script>