konvajs -基础图形-标签-箭头,动画,学习笔记

官网:

Konva 框架概述 |Konva - JavaScript 2d 画布 图书馆 (konvajs.org)icon-default.png?t=O83Ahttps://konvajs.org/docs/overview.html

konva是canvas的一个库,可快速画出想要的图形。

基础创建步骤:

// 第一步,创建一个Stage舞台
var stage = new Konva.Stage({container: 'container',   // id of container <div>width: 500,height: 500
});// 第二步,创建一个layer图层
var layer = new Konva.Layer();//第三步,创建图形
var circle = new Konva.Circle({x: stage.width() / 2,y: stage.height() / 2,radius: 70,fill: 'red',stroke: 'black',strokeWidth: 4
});// 第四步,添加到图层中
layer.add(circle);// 第五步,图层添加到舞台中
stage.add(layer);// draw the image
layer.draw();

画基础图形:(vue3项目)

<template><div class="rect"><div id="canvas"></div></div>
</template>
<script setup lang="ts">
import {onMounted} from 'vue'
import Konva from 'konva'onMounted(()=>{init()
})
const init=()=>{
const el=document.getElementById("canvas")if(!el){return}const {clientWidth,clientHeight}=el//1创建一个stage平台const stage=new Konva.Stage({
container:'canvas',width:clientWidth,height:clientHeight,})//2创建一个layer图层const layer=new Konva.Layer()//矩形//   const width =400
//   const height=200
//   const x=clientWidth/2-width/2
//   const y=clientHeight/2-height/2
//   const rect=new Konva.Rect({
//     x:x,
//     y:y,
//     width:width,
//     height:height,
//     fill:'#ff8800',
//     stroke:'black',
//     strokeWidth:1
//   })
// layer.add(rect)
//   //圆
//   const circle=new Konva.Circle({
//     x:clientWidth/2,
//     y:clientHeight/2,
//     radius:100,
//     fill:'#ff8800',
//     stroke:"#000000",
//     strokeWidth:1,
//     draggable:true,
//   })
//   layer.add(circle)
//   //椭圆
//   const ellipse=new Konva.Ellipse({
//     x:100,
//     y:100,
//     radiusX:200,
//     radiusY:100,
//     fill:"red",
//     stroke:"black",
//     strokeWidth:1,
//     draggable:true,
//   })
//   layer.add(ellipse)
//   //扇形
//   const wedge=new Konva.Wedge({
//     x:200,
//     y:300,
//
//     radius: 150, // 使用 radius 而不是 radiusX 和 radiusY
//     angle: 45,   // 定义扇形的角度
//     fill:"#ff0000",
//     stroke:"black",
//     strokeWidth:1,
//     draggable:true,
//     rotation:60
//   })
//   layer.add(wedge)
//线,曲线,闭合
//   const  line= new Konva.Line({
//     points:[100,100,200,300,500,500],//[x1,y1,x2,y2,x3,y3....]
//     stroke:'red',
//     strokeWidth:2,
//     //设置闭合
//     closed:true,
//     fill:"red",
//     //设置曲线,
//     tension:0.5//值越大,拉伸越大
//
//   })
//   layer.add(line)//文本五角心const text=new Konva.Text({x:0,y:clientHeight/2,text:"ni好niHao",fontSize:40,fill:"black"})text.x(clientWidth/2-text.width()/2)layer.add(text)const star=new Konva.Star({x:clientWidth/2,y:clientHeight/2-100,numPoints:5,innerRadius:50,outerRadius:100,fill:"#ff8800",stroke:"black",strokeWidth:1,})
layer.add(star)//环形
const  ring=new Konva.Ring({x:clientWidth/2,y:clientHeight/2-80,innerRadius:180,outerRadius:200,fill:'#ff8800',stroke:"black",strokeWidth:1
})layer.add(ring)//弧形const arc=new Konva.Arc({x:clientWidth/2,y:clientHeight/2,innerRadius:40,outerRadius:70,angle:90,fill:'#ff8800',stroke:"black",strokeWidth:1,rotation:45})layer.add((arc))stage.add(layer)
}</script><style scoped lang="scss">
.rect {padding: 20px;#canvas {background-color: #eee;border: 1px solid #666;height: calc(100vh - 42px);}
}
</style>

标签:

<template><div class="rect"><div id="canvas"></div></div>
</template>
<script setup lang="ts">
import {onMounted} from 'vue'
import Konva from 'konva'onMounted(()=>{init()
})
const init=()=>{const el=document.getElementById("canvas")if(!el){return}const {clientWidth,clientHeight}=el//创建一个stage平台const stage=new Konva.Stage({container:'canvas',width:clientWidth,height:clientHeight,})//创建一个layer图层const layer=new Konva.Layer()//标签:主要有label,tag,text三部分组成//1先添加一个labelconst  tooltip=new  Konva.Label({x:clientWidth/2,y:clientHeight/2,})//2定义一个标签const tag=new  Konva.Tag({fill:'#ff8800',pointerDirection:'down',stroke:'black',strokeWidth:1,pointerWidth:10,pointerHeight:10,shadowBlur:10,shadowOffsetX:10,shadowOffsetY:0.5,})//3添加文本const tagText=new Konva.Text({text:'nihao你好',fontSize:18,padding:15,fill:"#fff"})tooltip.add(tag)tooltip.add(tagText)layer.add(tooltip)stage.add(layer)
}</script><style scoped lang="scss">
.rect {padding: 20px;#canvas {background-color: #eee;border: 1px solid #666;height: calc(100vh - 42px);}
}
</style>

 正多边形,箭头:

<template><div class="rect"><div id="canvas"></div></div>
</template>
<script setup lang="ts">
import {onMounted} from 'vue'
import Konva from 'konva'onMounted(()=>{init()
})
const init=()=>{const el=document.getElementById("canvas")if(!el){return}const {clientWidth,clientHeight}=el//创建一个stage平台const stage=new Konva.Stage({container:'canvas',width:clientWidth,height:clientHeight,})//创建一个layer图层const layer=new Konva.Layer()
//多边形
const  regularPolygon=new Konva.RegularPolygon({x:clientWidth/2,y:clientHeight/2,sides:6,radius:100,//中心到每个顶点的距离fill:"#ff8800",stroke:"black",strokeWidth:1
})layer.add(regularPolygon)//箭头const arrow=new Konva.Arrow({x:clientWidth/2,y:clientHeight/2,points:[0,0,clientWidth/2,clientHeight/2],pointerLength:10,//箭头的尖端部分将有 10 像素的长度pointerWidth:10,stroke:"black",strokeWidth:5,draggable:true//移动})layer.add(arrow)stage.add(layer)
}</script><style scoped lang="scss">
.rect {padding: 20px;#canvas {background-color: #eee;border: 1px solid #666;height: calc(100vh - 42px);}
}
</style>

图片加载动画:

konva动画1

<template><div class="rect"><div id="canvas"></div></div>
</template>
<script setup lang="ts">
import {onMounted} from 'vue'
import Konva from 'konva'
import logoUrl from "@/assets/logo.svg"
onMounted(()=>{init()
})
const init=()=> {const el = document.getElementById("canvas")if (!el) {return}const { clientWidth, clientHeight } = el//创建一个stage平台const stage = new Konva.Stage({container: 'canvas',width: clientWidth,height: clientHeight,})//创建一个layer图层const layer = new Konva.Layer()//图片引入Konva.Image.fromURL(logoUrl, (image: Konva.Image) => {image.setAttrs({x: clientWidth / 2,y: clientHeight / 2,height: 50,width: 50,scaleY: 1,scaleX: 1})layer.add(image)const amplitude = 10;  // 振幅,表示图像上下波动的最大距离const period = 1000;   // 周期,表示完成一个完整波动所需的时间(毫秒)const y = image.y() - 10; // 记录图像的初始 Y 坐标,减去 10 是为了让波动的中心更高///Konva.Animation 是 Konva 库中用于创建动画的一个类。它允许你在指定的图层上进行动画效果,能够通过每一帧的回调函数更新图形的状态。//https://konvajs.org/docs/animations/Create_an_Animation.html#HTML5-Canvas-Konva-Animation-Templateconst animation = new Konva.Animation((frame) => {if (!frame) {return;}image.y(amplitude * Math.sin(frame?.time * 2 * Math.PI / period) + y);}, layer);animation.start()})stage.add(layer)
}</script><style scoped lang="scss">
.rect {padding: 20px;#canvas {background-color: #eee;border: 1px solid #666;height: calc(100vh - 42px);}
}
</style>

具体网址:HTML5 Canvas Konva 动画教程 |Konva - JavaScript 2d 画布 图书馆 (konvajs.org)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/454947.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element设置时间和日期框早于现在的时间和日期禁用

效果: 今日此时此刻之前的日期、时间禁止选用&#xff0c;切换日期和时间为“2024-10-19 00:00:00"&#xff0c;再切换为”2024-10-18 00:00:00"时&#xff0c; 会给form.time默认赋值为今日此时此刻&#xff08;日期时间少于今日此时此刻则重新赋值&#xff09; 安…

Go语言基础学习(Go安装配置、基础语法)

一、简介及安装教程 1、为什么学习Go&#xff1f; 简单好记的关键词和语法&#xff1b;更高的效率&#xff1b;生态强大&#xff1b;语法检查严格&#xff0c;安全性高&#xff1b;严格的依赖管理&#xff0c; go mod 命令&#xff1b;强大的编译检查、严格的编码规范和完整的…

【优选算法】探索双指针之美(一):双指针与单调性的完美邂逅

文章目录 前言&#xff1a;1.盛水最多的容器2.有效三角形个数3. 和为s的两个数字4. 三数之和5. 四数之和 最后想说&#xff1a; 前言&#xff1a; 在上一章中我们已经认识到了双指针&#xff0c;在这章里我们就来探索一下当双指针和单调性遇见后会擦出怎样的火花呢&#xff1f…

几何算法系列:空间实体体积计算公式推导

1.前言 面积和体积的计算是常见和基础的几何算法话题&#xff0c;面积和体积通常作为面或构件的基本信息参与相关的建模、计算、分析等过程。 有关面积的计算&#xff0c;可以参考博主此前的文章&#xff0c; 一种误差较小的轮廓面积计算算法_轮廓面积计算原理-CSDN博客文章…

深入理解Qt中的QTableView、Model与Delegate机制

文章目录 显示效果QTableViewModel(模型)Delegate(委托)ITEM控件主函数调用项目下载在Qt中,视图(View)、模型(Model)和委托(Delegate)机制是一种非常强大的架构,它们实现了MVC(模型-视图-控制器)设计模式。这种架构分离了数据存储(模型)、数据展示(视图)和数据操作(委托),使…

Apple 新品发布会亮点有哪些 | Swift 周报 issue 61

文章目录 前言新闻和社区苹果据称正洽谈投资 OpenAI 英伟达也有意跟投消息称苹果公司服务部门将裁员约百人&#xff0c;波及 Apple Books / Apple News 等业务苹果拟 9 月 10 日举行今年最重磅新品发布会&#xff0c;iPhone 16 亮相&#xff1f;都有哪些看点&#xff1f; 提案正…

京东笔试题

和谐敏感词 &#x1f517; 题目地址 &#x1f389; 模拟 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();String s scanner.next();String[] words new String[…

【Spring篇】Spring中的Bean管理

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f3af;Spring IOC容器 &#x1f6a…

如何开启华为交换机 http

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

kafka自定义配置信息踩坑

org.apache.kafka.common.config.ConfigException: Invalid value 0 for configuration acks: Expected value to be a string, but it was a java.lang.Integer 场景描述&#xff1a; 单个kafka使用springboot框架自带的 yml 配置完全OK&#xff08;因为底层会帮我们处理好类…

QGraphics类型学习使用【Qt】【C++】

QGraphics类型学习使用 需求过程全部完整代码 首先已知&#xff0c;QGraphicsView&#xff0c;QGraphicsScene, QGraphicsItem&#xff0c;分别称为&#xff1a;视图&#xff0c;场景&#xff0c;图元&#xff0c;图表就是各种各样的元素&#xff0c;图片元素&#xff0c;线条元…

排序算法 —— 归并排序(理论+代码)

目录 1.归并排序的认识 归并排序的思想 归并排序动图演示 2.归并排序的递归实现 归并排序的遍历方式 归并排序的归并流程 归并排序的递归代码实现 3.归并排序的非递归实现 非递归实现分析 边界分析 非递归实现代码 4.归并排序总结 时间复杂度 空间复杂度 稳定性…

Postman使用-基础篇

前言 本教程将结合业界广为推崇和使用的RestAPI设计典范Github API&#xff0c;详细介绍Postman接口测试工具的使用方法和实战技巧。 在开始这个教程之前&#xff0c;先聊一下为什么接口测试在现软件行业如此重要&#xff1f; 为什么我们要学习Postman&#xff1f; 现代软件…

ubuntu 安装keepalived+haproxy

一、安装keepalived sudo apt update sudo apt install keepalived sudo systemctl start keepalived sudo systemctl enable keepalived sudo systemctl status keepalived#配置Keepalived sudo cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf …

Jmeter 实战 JDBC配置

​ JDBC JDBC&#xff08;Java Database Connectivity&#xff09;是一种用于执行SQL语句的Java API。通过这个API&#xff0c;可以直接连接并执行SQL脚本&#xff0c;与数据库进行交互。 使用JMeter压力测试时&#xff0c;操作数据库的场景 在使用JMeter进行接口压力测试时…

大规模多传感器滑坡检测数据集,利用landsat,哨兵2,planet,无人机图像等多种传感器采集数据共2w余副图像,mask准确标注滑坡位置

大规模多传感器滑坡检测数据集&#xff0c;利用landsat&#xff0c;哨兵2&#xff0c;planet&#xff0c;无人机图像等多种传感器采集数据共2w余副图像&#xff0c;mask准确标注滑坡位置 大规模多传感器滑坡检测数据集介绍 数据集概述 名称&#xff1a;大规模多传感器滑坡检测…

R语言建模线性回归

一、 a. # 给定的 (x, y) 数据 x <- c(2, 9, 10, 7) y <- c(3, 13, 12, 11)# 线性回归模型 y a bx model1 <- lm(y ~ x) summary(model1) # 查看回归结果# 提取系数 a 和 b a <- coef(model1)[1] b <- coef(model1)[2]# 预测值 y_pred <- predict(mode…

数据字典是什么?和数据库、数据仓库有什么关系?

一、数据字典的定义及作用 数据字典是一种对数据的定义和描述的集合&#xff0c;它包含了数据的名称、类型、长度、取值范围、业务含义、数据来源等详细信息。 数据字典的主要作用如下&#xff1a; 1. 对于数据开发者来说&#xff0c;数据字典包含了关于数据结构和内容的清晰…

【C++篇】探索STL之美:熟悉使用String类

CSDN 文章目录 前言 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&…

基于SSM+微信小程序的家庭记账本管理系统(家庭1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 1、管理员端功能有首页、个人中心、用户管理&#xff0c;消费详情管理、收入详情管理、系统管理等。 2、用户端功能有首页、消费详情、收入详情、论坛信息、我的等功能。 2、项目技术 …