react中使用react-konva实现画板框选内容

本文介绍了如何在React应用中利用react-konva库创建画板,并实现图形的拖拽、图片导入及变形功能。通过示例代码展示了如何添加拖拽事件、导入图片以及使用Transformer组件进行元素变形。文章还提供了组件源码和实现效果的截图。
摘要由CSDN通过智能技术生成

一、前言

本文用到的react-konva是基于react封装的图形绘制。Konva 是一个HTML5 Canvas JavaScript 框架,它通过对 2d context 的扩展实现了在桌面端和移动端的可交互性。Konva 提供了高性能的动画,补间,节点嵌套,布局,滤镜,缓存,事件绑定(桌面/移动端)等等功能。你可以使用 Konva 在舞台上绘制图形,给图形添加事件,移动、缩放和旋转图形并且支持高性能的动画即使包含数千个图形。

1.1、API文档

英文文档点击【前往】,中文文档点击【前往

1.2、Github仓库

点击【前往】访问Github仓库,在线示例地址,点击【前往

二、图形

在线制图最基础的应用是拖拽元素,比如,在画布上拖拽一张图片或某种形状,对该图片进行缩放或旋转操作。

画布就是<Stage>,每个图层为<Layer>

2.1、拖拽draggable

konva 中内置了很多形状的元素,比如圆形、矩形等,以下示例为星型,这里先用<Star>试一下:

import Konva from 'konva'
import { Circle, Rect, Stage, Layer, Text, Star } from 'react-konva'

const Shape = () => {
    const [star, setStar] = useState({
        x: 300,
        y: 300,
        rotation: 20,
        isDragging: false,
    })

    const handleDragStart = () => {
        setStar({
            ...star,
            isDragging: true,
        })
    }

    const handleDragEnd = (e: any) => {
        setStar({
            ...star,
            x: e.target.x(),
            y: e.target.y(),
            isDragging: false,
        })
    }

    return (
        <Stage width={1000} height={600}>
            <Layer>
                <Star
                    key="starid"
                    id="starid"
                    x={star.x}
                    y={star.y}
                    numPoints={5}
                    innerRadius={20}
                    outerRadius={40}
                    fill="#89b717"
                    opacity={0.8}
                    draggable
                    rotation={star.rotation}
                    shadowColor="black"
                    shadowBlur={10}
                    shadowOpacity={0.6}
                    shadowOffsetX={star.isDragging ? 10 : 5}
                    shadowOffsetY={star.isDragging ? 10 : 5}
                    scaleX={star.isDragging ? 1.2 : 1}
                    scaleY={star.isDragging ? 1.2 : 1}
                    onDragStart={handleDragStart}
                    onDragEnd={handleDragEnd}
                />
            </Layer>
        </Stage>
    )
}

其中,可以给 Star 配置一些基础的属性,如:xy 指该元素在画布上的坐标位置,rotaition 指元素的旋转角度;fill 指元素的填充颜色,scaleXscaleY 指元素在 xy 轴上的放大比例等等。

在拖拽的时候,我们要给该元素添加一些拖拽事件,如上:添加 handleDragStart 更改isDragging属性,使其在拖动时产生形变;添加 onDragEnd 事件,更改isDraggingxy 属性,来改变拖动位置,关闭拖动形变特效等。

观察上面的代码发现某些属性和react-dnd类似,但在使用 drag 事件的时候,发现比 react-dnd 方便很多,可能因为底层是 canvas 的原因吧!

2.2、图片Image

有两种方式可以导入图片,一个是用 react-hooks,一个是调用 react 生命周期函数,这里为了图省事,用 hooks

先安装 konva 的官方库use-imageuse-image提供好了跨域属性anonymous,封装一下图片组件:

import { Image } from 'react-konva'
import useImage from 'use-image'

const KonvaIm
  • 32
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
React Konva,`<Stage>`是用于创建一个舞台(Stage)的组件,它是所有Konva图形的容器。下面是一些常用的`<Stage>`标签属性以及它们的使用方法: - `width`:设置舞台的宽度,可以是一个数字或字符串,例如`width={500}`或`width="50%"`。 - `height`:设置舞台的高度,可以是一个数字或字符串,例如`height={300}`或`height="30vh"`。 - `draggable`:设置舞台是否可被拖动,默认为`false`。如果设置为`true`,则可以通过鼠标拖动舞台。 - `onMouseEnter`:当鼠标进入舞台时触发的事件处理函数。 - `onMouseLeave`:当鼠标离开舞台时触发的事件处理函数。 - `onWheel`:当鼠标滚轮滚动时触发的事件处理函数。 - `onMouseDown`:当鼠标在舞台上按下时触发的事件处理函数。 - `onMouseUp`:当鼠标在舞台上松开时触发的事件处理函数。 以下是一个示例代码,展示了如何使用`<Stage>`组件: ```jsx import React from 'react'; import { Stage, Layer, Rect } from 'react-konva'; const App = () => { return ( <div> <Stage width={500} height={300}> <Layer> <Rect x={20} y={20} width={100} height={50} fill="red" draggable /> </Layer> </Stage> </div> ); }; export default App; ``` 在上面的示例,我们创建了一个大小为500x300的舞台,并在舞台上添加了一个矩形(Rect)图形,设置其位置为(20, 20),宽度为100,高度为50,填充颜色为红色,并启用了拖动功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马甲丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值