用 Canvas 画简易手电筒

news2024/11/24 22:54:55

本文章适合人群:

  • 具备 html、js 基础的人
  • 对于想入门 canvas 的人

本文章较为简单,大佬可略过

实验结果

一个跟随着鼠标移动的圆圈。
在这里插入图片描述

教学

要实现一个动态手电筒效果,我们可以使用Canvas来绘制一个黑色的遮罩层,并通过鼠标或触摸事件来控制光圈的位置和大小。 首先,我们需要在HTML中创建一个Canvas元素和一个用于控制光圈的滑块。

<canvas id="flashlightCanvas"></canvas>
<input type="range" id="lightSize" min="50" max="200" value="100"> 

接下来,在JavaScript中获取Canvas元素和滑块的引用,并设置Canvas的宽度和高度。

const canvas = document.getElementById("flashlightCanvas"); 
const ctx = canvas.getContext("2d"); 
canvas.width = window.innerWidth; 
canvas.height = window.innerHeight; 

然后,我们需要创建一个函数来绘制遮罩层和光圈。该函数会在滑块值改变和鼠标/触摸事件发生时被调用。

function drawFlashlight() { 
  // 清除画布 
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  // 绘制黑色遮罩层 
  ctx.fillStyle = "rgba(0, 0, 0, 0.7)";
  ctx.fillRect(0, 0, canvas.width, canvas.height); 
  // 获取光圈位置和大小 
  const lightSize = document.getElementById("lightSize").value; 
  const mouseX = event.clientX; const mouseY = event.clientY; 
  // 绘制光圈 
  ctx.globalCompositeOperation = "destination-out"; 
  ctx.beginPath(); 
  ctx.arc(mouseX, mouseY, lightSize, 0, Math.PI * 2); 
  ctx.fill(); 
  ctx.globalCompositeOperation = "source-over";
} 

最后,我们需要为滑块和鼠标/触摸事件添加事件监听器,并在事件发生时调用绘制函数。

document.getElementById("lightSize").addEventListener("input", drawFlashlight); 
canvas.addEventListener("mousemove", drawFlashlight); canvas.addEventListener("touchmove", drawFlashlight); 

现在,当滑块值改变或鼠标/触摸事件发生时,光圈会在Canvas上绘制出来,实现动态手电筒效果。

完整代码

<!DOCTYPE html>
<html>

<head>
    <title>Dynamic Flashlight</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
        }
    </style>
</head>

<body>
    <canvas id="flashlightCanvas"></canvas>
    <input type="range" id="lightSize" min="50" max="200" value="100">
    <script>
        const canvas = document.getElementById("flashlightCanvas");
        const ctx = canvas.getContext("2d");
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
        function drawFlashlight() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            ctx.fillStyle = "rgba(0, 0, 0, 0.7)";
            ctx.fillRect(0, 0, canvas.width, canvas.height);
            const lightSize = document.getElementById("lightSize").value;
            const mouseX = event.clientX; const mouseY = event.clientY;
            ctx.globalCompositeOperation = "destination-out"; ctx.beginPath();
            ctx.arc(mouseX, mouseY, lightSize, 0, Math.PI * 2); ctx.fill();
            ctx.globalCompositeOperation = "source-over";
        }
        document.getElementById("lightSize").addEventListener("input", drawFlashlight);
        canvas.addEventListener("mousemove", drawFlashlight);
        canvas.addEventListener("touchmove", drawFlashlight); 
    </script>
</body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JLink更新固件成砖头的QA

问题&#xff1a;用了新版的keil&#xff0c;更新固件后不能用了&#xff0c;怎么办啊 插上Jlink之后&#xff0c;驱动提醒您更新最新的V11版本固件&#xff0c;然后点了更新&#xff0c;更新结束之后/重新上电之后&#xff0c;Jlink的灯会变成红色闪烁5次然后变绿色&#xff0…

本地项目上传至码云gitee

1、springboot-mgx是需要上传的项目 2、码云后台创建一个新的仓库 3、创建完成后&#xff0c;复制下来https链接&#xff0c;后面要用到。 4、进入项目要上传的文件中 5、对git进行初始化&#xff0c;git指令 git init 6、 上传项目至gitee &#xff08;1&#xff09;连接远…

热烈祝贺润物成功入选航天系统采购供应商库

经过航天系统采购平台的严审&#xff0c;湖北润物食品有限公司成功入选中国航天系统采购供应商库。航天系统采购平台是航天系统内企业采购专用平台&#xff0c;服务航天全球范围千亿采购需求&#xff0c;目前&#xff0c;已有华为、三一重工、格力电器、科大讯飞等企业、机构加…

基于SSM的客户管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

重建大师密集匹配失败,是什么原因?

答&#xff1a;影像路径问题或者缓存不足&#xff0c;检查影像有无访问权限&#xff0c;清理下磁盘空间。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0c;输入倾斜照片&#xff0c;激光点云&#xff0c;POS信息及像控点&#xff0c;输出高精…

【数据分享】1901-2022年我国省市县镇四级的逐年最高气温数据(免费获取/Shp/Excel格式)

气象数据在日常研究中非常常用&#xff0c;之前我们分享过来自国家青藏高原科学数据中心提供的1901-2022年1km分辨率逐月最高气温栅格数据&#xff0c;2001-2022年我国省市县镇四级的逐月最高气温数据&#xff0c;以及基于该栅格数据处理得到的1901-2022年1km分辨率的逐年最高气…

深度学习-全连接神经网络-训练过程-欠拟合、过拟合和Dropout- [北邮鲁鹏]

目录标题 机器学习的根本问题过拟合overfitting泛化能力差。应对过拟合最优方案次优方案调节模型大小约束模型权重&#xff0c;即权重正则化(常用的有L1、L2正则化)L1 正则化L2 正则化对异常值的敏感性随机失活(Dropout)随机失活的问题 欠拟合 机器学习的根本问题 机器学习的根…

SpringCLoud——服务的拆分和远程调用

服务拆分 服务拆分注意事项 一般是根据功能的不同&#xff0c;将不同的服务按照功能的不同而分开。 微服务拆分注意事项 不同微服务&#xff0c;不要重复开发相同业务微服务数据独立&#xff0c;不要访问其他微服务的数据库微服务可以将自己的业务暴露为接口&#xff0c;供…

「打造个人网盘」教你一招使用Net2FTP即可搭建免费web文件管理器

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

VR全景算不算好的创业项目?有哪些特性?

现在是全民创业的时代&#xff0c;大家都在找创业项目&#xff0c;那么什么是好的创业项目呢&#xff1f;有人会问VR全景算不算创业好项目呢&#xff1f;一般情况下好的创业项目&#xff0c;发展前景和市场消费群体都是比较大的&#xff0c;市场需求大才能满足多数消费者的需求…

acclerator和tensorboard共同使用采坑记录

acclerator和tensorboard共同使用采坑记录 问题描述可采用的方案可采用的方案1可采用的方案2其他可采用方案可采用方案的总结 建议的最终方案 问题描述 最近在做用多个GPU训练&#xff0c;我选择的是hugging face开源团队的acclerate库中的accelerator类来实现的&#xff0c;在…

多元函数的微分法

目录 复合函数微分法 隐函数微分法 复合函数求导与全微分 隐函数偏导数与全微分 复合函数微分法 复合函数微分法是一种求导方法&#xff0c;用于计算复合函数的导数。 假设有一个复合函数yf(u)&#xff0c;其中ug(x)&#xff0c;则复合函数微分法可以用于计算y对x的导数。根…

3D模型转换工具HOOPS Exchange如何实现OBJ格式轻量化?

什么是OBJ模型轻量化&#xff1f; OBJ格式是一种常用的三维模型文件格式&#xff0c;通常包含模型的顶点、法线、纹理坐标等信息&#xff0c;但有时候这些信息可能会使模型文件变得较大&#xff0c;不利于网络传输、加载和运行。 OBJ&#xff08;Object&#xff09;模型轻量化…

又一重磅利好来袭!Zebec Payroll 集成至 Nautilus Chain 主网

流支付协议 Zebec Protocol 正在积极的拓展自身生态&#xff0c;随着此前其全新路线图的发布&#xff0c;揭示了该生态从 Web3 世界向 Web2 世界跨越的决心。根据其最新路线图&#xff0c;Zebec Protocol 正在从最初构建在 Solana 上的流支付协议&#xff0c;拓展为囊括模块化公…

Linux下修改jar包中的配置文件application.conf

文件位置 jar包文件工程目录 打包后解压jar包目录 提取和上传 jar tf XXX.jar # 获取包内文件 application.conf是jar包的配置文件&#xff0c;如果修改需要 提取文件 jar xf my-app.jar application.conf 修改后上传文件 jar uf my-app.jar application.conf

快速加入Health Kit,一文了解审核流程

HUAWEI Health Kit是为华为生态应用打造的基于华为帐号和用户授权的运动健康数据开放平台。 在获取用户授权后&#xff0c;开发者可以使用Health Kit提供的开放能力获取运动健康数据&#xff0c;基于多种类型数据构建运动健康领域应用与服务&#xff0c;为用户打造丰富、便捷、…

EXCEL如何把一个单元格内的文本和数字分开?例如:龚龚15565 = 龚龚 15565

使用工具&#xff1a;WPS 举例&#xff1a; EXCEL如何把一个单元格内的文本和数字批量分开&#xff1f;不使用数据分列。 第一步、将第二行数据冻结 第二步、在B1、C1单元格输入需要分开的示例 第三步、点击选中B1单元格&#xff0c;输入快捷键【CTRLE】进行填充。B2单元格也是…

C++新经典 | C++ 查漏补缺(类)

目录 1. 类对象的复制 2. 权限修饰符 3. 成员函数的定义与声明 4. 构造函数 &#xff08;1&#xff09;explicit关键字 &#xff08;2&#xff09;构造函数初始化列表 &#xff08;3&#xff09;默认构造函数 &#xff08;4&#xff09;default&#xff1b;和delete&…

SEC的下一步目标是什么?过时的证券法与加密货币行业,哪个会被先淘汰?

加密货币已经“不合规”了&#xff0c;尤其是其“商业模式”&#xff0c;至少美国证券交易委员会(SEC)主席Gary Gensler这样认为。由于这种观点在美国监管机构中普遍存在&#xff0c;因此涉及加密的执法行动达到历史最高水平也不足为奇。 在短短几年内&#xff0c;我们目睹了所…

MFC项目改为多字节字符集界面风格变为win98风格的问题

在项目->属性->配置属性中,将字符集改为多字节字符集&#xff0c;则界面风格变成了win98风格 解决办法&#xff0c;在stdafx.h中有 #ifdef _UNICODE #if defined _M_IX86 #pragma comment(linker,"/manifestdependency:\"typewin32 nameMicrosoft.Windows.Com…