Konva是一个HTML5 Canvas JavaScript框架,支持桌面和移动应用程序的高性能动画,转换,节点嵌套,分层,过滤,缓存,事件处理。
为什么konva.js组被视为解决太多层问题的解决方案? 我正在使用NextJS和Konva建立数字音频工作站。我刚刚打了6层并收到了警告: Konva警告:舞台有6层。建议的最大层数为3-5。
Konva warning: The stage has 6 layers. Recommended maximum number of layers is 3-5. Adding more layers into the stage may drop the performance. Rethink your tree structure, you can use Konva.Group.
构建一个简单的视频创建者,我在其中操纵
使用Konva(Konva-react),我使用此组件渲染行: const renderline =(PathProps:CanvasPath | ActivePath,key?:number)=>( 使用konva(konva-react),我使用此组件渲染行: const renderLine = (pathProps: CanvasPath | ActivePath, key?: number) => ( <Line key={key} points={pathProps.points} stroke={pathProps.tool === "eraser" ? ERASER_COLOR : STROKE_COLOR} strokeWidth={pathProps.strokeWidth} tension={0.5} lineCap="round" globalCompositeOperation={ pathProps.tool === "eraser" ? "destination-out" : "source-over" } /> ); 这是我的Mouseevent: const handleMouseMove = useCallback( (e: Konva.KonvaEventObject<MouseEvent | TouchEvent>) => { if (!activePath?.isDrawing) return; const pos = e.target.getStage()?.getPointerPosition(); if (!pos || !isPointInImage(pos.x, pos.y)) return; setActivePath({ ...activePath, points: [...activePath.points, pos.x, pos.y], }); }, [activePath, isPointInImage] ); const handleMouseUp = useCallback(() => { if (!activePath) return; const newPath: CanvasPath = { tool: activePath.tool, points: activePath.points, strokeWidth: activePath.strokeWidth, }; setPaths(newPaths); setActivePath(null); }, [activePath, paths]); NB:设定功能是React状态 我想要,在鼠标上,它将是一个单一的形状(或至少在同一层中形状),它保留了中风的宽度,无论是'x'和'i'。是否可以?因为,我的目标是: 创建可以通过另一种形状减去/切割的形状。 即使在单层的形状上使不透明度变得不透明,因此它不会重叠。 如果是在Adobe Illustrator中,该行为类似于expandtoshape。因此,它将采取行,将其转换为形状,并且将不再是可编辑的线路。 求助您采用与Adobe相同的方法,并为“展开形状”进行一些按钮,您可以制作自定义形状以替换已构造的路径形状。 自定义形状是Konva中的一流形状,这意味着它响应所有常规事件,Z index等。有关信息和示例,请参见Konva Docs。 customshape.scenefunc是您编码绘图命令的位置。
预期的3D效果: 代码: 预期的3D效果: 代码: <Group ref={mainRef} x={x} y={y} scaleX={scaleX} scaleY={scaleY} onTap={onTap} rotation={rotation} onClick={onTap} draggable onDragEnd={onDragEnd} onDragMove={onDragMove} onTransformEnd={onTransformEnd} > {[...Array(6)].map((_, i) => <Text text={letter} x={i} y={i} fontFamily="Bangers-Regular" fontSize={fontSize} stroke="red" strokeWidth={3} fill="red" fillPriority="color" />)} < Text ref={(ref) => onRender(ref)} text={letter} fontFamily="Bangers-Regular" fontSize={fontSize} stroke="blue" strokeWidth={3} fill="blue" fillPriority="color" /> </Group> 上面代码的结果: 与 在比较中可以看到,参考3D效果的质量要高得多,并且没有锯齿,理论上我可以通过增加副本数量获得更好的效果,但放大时看起来仍然更差。 参考来源:https://www.graffiti-empire.com/graffiti-generator/ 一个可能的解决方案是在规模增加时增加步数: import React from "react"; import { createRoot } from "react-dom/client"; import { Stage, Layer, Rect, Text, Circle, Line, Group } from "react-konva"; const App = () => { const [scale, setScale] = React.useState(1); return ( <> <input type="range" min="0.5" max="5" step="0.1" value={scale} onChange={() => { setScale(Number(event.target.value)); }} /> <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Group draggable scaleX={scale} scaleY={scale}> {[...Array(Math.round(6 * scale))].map((_, i) => ( <Text text={"Hello"} x={i / scale} y={i / scale} stroke="red" strokeWidth={3} fill="red" fillPriority="color" fontSize={50} /> ))} <Text text={"Hello"} stroke="blue" strokeWidth={3} fill="blue" fillPriority="color" fontSize={50} /> </Group> </Layer> </Stage> </> ); }; const container = document.getElementById("root"); const root = createRoot(container); root.render(<App />); https://codesandbox.io/p/sandbox/react-konva-3d-text-fj5gg4 注意:创建很多层可能会严重损害性能。我建议如果可能的话缓存该组。
我正在使用 konvajs 创建一个画布,允许用户上传图像并移动/调整图像大小,他们还可以选择字体并添加一些文本。 然而,当我尝试移动图像时,它们会涂抹并留下......
我注意到,当我创建一个矩形并将其 fillPattern 设置为某个图像时,填充从矩形的左上角开始。 函数 addRectangle() { window.rect = new Konva.Rect({...
如何在变换过程中直观地调整 KonvaJS 矩形的边框半径?
我想在视觉上调整矩形的边框半径,因此它在变换过程中保持“相同”。 发生的情况是边界半径在变换过程中被拉伸,它......
我正在使用Line绘制曲线(张力0.5)。假设该线已包含 3 个点。当我单击该线时,我想在该位置添加新点。我不明白的是我怎样才能...
我似乎无法找到直接的答案。我将 Konva 与 Vue 结合使用,我希望图层与舞台具有相同的宽度和高度。 我尝试用 width: var 更改图层宽度...
说明: 当尝试在剪切层内创建工作空间时,我们遇到了一个问题,即转换器相对于剪切层的原点而不是ca...
我有一个代码,显示一张可以缩放和拖动的图片,但是拖动或缩放时,会看到白色背景。我想让它充当交互式地图,但不
从“react”导入React,{useEffect,useRef,useState}; 从“react-konva”导入{Circle,Layer,Rect,Stage,Transformer}; 从“konva”导入 Konva; 常量应用程序 = ...
从react-konva-utils导入Html时出现以下错误。我尝试过使用动态导入和标准导入来导入它。例如: 导出常量 Html = 动态( ()...
开门见山,我希望实现的是能够用这个形状在两个元素之间创建一条连接线: 数据库图.IO 当元素移动时,线条会重置,但始终
我正在使用 Konvajs 库。我试图在主舞台元素周围放置一个边框框,但似乎无法使其工作。 CSS 仅适用于 ,Konva.Stage 元素不适用于 我正在使用 Konvajs 库。我试图在主 Stage 元素周围放置一个边框框,但似乎无法使其工作。 CSS 仅适用于 <div>,而 Konva.Stage 元素似乎没有这方面的特定属性。 在舞台层的 4 个边框上添加线条形状是唯一的方法吗? 我的 Konva 容器 <div class="TSPKonvaStage" id="KonvaContainer"></div> 下面是我的 Konva 宣言 var stage = new Konva.Stage({ container: 'KonvaContainer', // id of container <div> width: 600, height: 180 }); 您可以使用 CSS 作为容器元素: stage.getContainer().style.border = '1px solid black'. 这是对@lavrton 答案的实验。我很好奇舞台的大小是否被边界调整了。答案似乎是否定的——至少在 Chrome 上是这样。 // Set up the stage var stage1 = new Konva.Stage({container: 'container1', width: 300, height: 100}); // add a layer. var layer1 = new Konva.Layer(); stage1.add(layer1); console.log('Stage size before border=' + stage1.width() + ' x ' + stage1.height()); stage1.getContainer().style.border = '5px solid black'; console.log('Stage size after border=' + stage1.width() + ' x ' + stage1.height()); var rect1 = new Konva.Rect({x:0, y: 0, width: 50, height: 40, strokeWidth: 10, stroke: 'lime'}); layer1.add(rect1) stage1.draw() p { padding: 4px; } #container1 { display: inline-block; width: 500px; height: 200px; background-color: silver; overflow: hidden; } <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdn.rawgit.com/konvajs/konva/1.6.5/konva.min.js"></script> <p>This answers the question 'does the border reduce the size of the stage?'. Answer is no. The green rect appears with its left and top edges under the border - at least on Chrome. </p> <div id='container1'></div> var containerId = 'drawContainer'; var 容器 = document.getElementById(containerId); var width = 容器.offsetWidth; var height = 容器.offsetHeight; var stage = new Konva.Stage({ 容器:容器ID, 宽度:宽度, 高度: 高度 });
Konvajs 如何连接两个形状并表现得像一个形状? 例如,我有两个像这样的 Konva.Text const 文本 = 新 Konva.Text({ text : '第一个文本', 填充:'蓝色' }); const text2 = 新 Konv...
允许通过拖动移动元素,但仅限在一定范围内且有 Konva 的限制
所以我在我的React项目中使用react-konva制作一个画布,其中包含许多元素。 我希望允许人们拖动元素,但只能在一定范围内。例如,有...