使用窗口事件调整画布元素大小

2024-01-10

我正在使用打字稿来绘制画布元素。我想让我的画布元素响应屏幕尺寸。这样我就可以将画布大小与父 div 元素相匹配。

我试过用这个删除画布中的大小并在 .css 中提供它。但这没有帮助,因为我有两个固定元素。我找到了这个已有 8 年历史的解决方案画布调整大小 https://stackoverflow.com/questions/5825447/javascript-event-for-canvas-resize.

我该如何解决这个问题?我发布的答案过度扭曲了图像质量。还有其他办法吗?

export class bar {

  private canvas: HTMLCanvasElement;
  private ctx: CanvasRenderingContext2D;
  private width_canvas: number;
  private height_canvas: number;

  constructor(canvas: HTMLCanvasElement) {
    this.canvas = < HTMLCanvasElement > canvas;

    this.ctx = < CanvasRenderingContext2D > canvas.getContext('2d');

    this.width_canvas = this.canvas.width;
    this.height_canvas = this.canvas.height;

    window.requestAnimationFrame(() => this.draw());
  };

  draw() {

      let wid_bar: number = this.width_canvas - 400;
      this.value.forEach((val, idx) => {

          // draw bar background
          this.ctx.save();
          this.ctx.beginPath();
          this.ctx.rect(200, (idx * (80)), wid_bar, 30);
          this.ctx.fillStyle = yellow;
          this.ctx.fill();
          window.requestAnimationFrame(() => this.draw());
        };
      }
<div class="bar">
  <canvas id="canvas" width="1200" height="200"> This does not work </canvas>
</div>

尝试(如果您仅使用 CSS 宽度而不重绘,那么图片将失去质量)而不是输入值读取屏幕尺寸

function change(inp) {
  can.width = inp.value;
  can.height = inp.value/4;
  draw(can, [5,10,15,20])
}

function draw(canvas,value) {
  let ctx = can.getContext('2d');
  let wid_bar = canvas.width - 400;
  value.forEach((val, idx) => {
      // draw bar background
      ctx.save();
      ctx.beginPath();
      ctx.rect(200, idx * 80, wid_bar, 30);
      ctx.fillStyle = 'yellow';
      ctx.fill();
  });
}

change(audio);
canvas { background: black; }
<input id="audio" type="range" min="100" max="600" oninput="change(this)" value=150 /><br>

<canvas id="can"></canvas>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用窗口事件调整画布元素大小 的相关文章

随机推荐

  • 使用java 7语法编译为java 5

    有没有办法使用 java 7 语法并生成适用于 1 5 的字节码 据我所知 选项 target and source不可能有什么不同 检查是否没有使用新的 API 也很好 但并不重要 不它不是 据我所知 不同 source and targ
  • Mule ESB 中的重连策略

    我正在尝试验证文档中提到的 Mule ESB 中的重新连接策略 我已将标准重新连接策略设置为重试次数为 5 次并设置一些超时 我的终点无法到达 因为故意停止它来测试场景 我在 Mule 控制台中有一个例外 异常堆栈是 1 连接被拒绝 con
  • 为什么我们会在每台计算机安装中收到非广告快捷方式的 ICE57 错误?

    此问题询问 ICE57 验证器之一是否会创建误报错误报告 我正在使用 WIX 3 9 生成安装程序 我想要使 用非广告快捷方式的每台计算机安装 此 WXS 示例安装一个文本文件和打开该文本文件的快捷方式
  • MongoDB $set 不更新记录

    我正在使用 PHP PECL 扩展尝试 MongoDB 但是我很难让某个更新查询正常工作 我在 SO 上四处寻找答案 但运气不佳 我创建了一个基本集合 m new Mongo collection m gt testdb gt testco
  • 如何在通知视图中制作倒计时器?

    我想出了如何使用来制作自定义视图RemoteViews http developer android com reference android widget RemoteViews html班级 我也知道怎么用Chronometer ht
  • 一个大的 javascript 文件还是多个较小的文件? [复制]

    这个问题在这里已经有答案了 好的 我有一个大小合理的项目 其中使用 jquery 主干和其他几个 javascript 库 我想知道是否应该为我的 javascript 库准备一个文件 为我的自定义代码准备另一个文件 或者一堆单独的 jav
  • HTTP/1.0 还在使用吗?

    比如说写一个HTTP服务器 客户端 支持HTTP 1 0有多重要 如今它还在任何地方使用吗 Edit 我不太关心 HTTP 1 0 的有用性 重要性 而是关心它的数量software实际上将其用于现实世界中的非内部 例如 单元测试是内部使用
  • 如何在Python中的段落中加入换行符

    我有一些采用以下格式的文本 r n 1 r n par1 par1 par1 r n r n par1 par1 par1 r n r n 2 r n r n par2 par2 par2 我想做的是将它们连接成段落 以便最终结果是 1 p
  • 如何在 React 组件中使用 @types/redux-form 定义的类型与 Field 和 FieldArray?

    我正在使用 React Redux Redux Form 和 TypeScript 开发应用程序 我正在努力使用包 types redux form 定义的类型 绝对打字 https github com DefinitelyTyped D
  • MailChimp 内容阻止拖放不起作用

    我必须在 MailChimp 服务中编辑现有的自定义模板 其中内容块的拖放功能不起作用 模板有很多嵌套表 因此我联系了他们的支持人员 他们的回复是某些块是嵌套的 可能会导致冲突 为了制作简单的测试用例场景 我删除了大部分代码 样式 只留下一
  • Onclick普通按钮正在提交表单

    SCENARIO 我有一个java带有长表单的 JSP 视图 这工作得很好 我可以通过在任何输入字段中按 Enter 键或使用提交按钮来提交表单 新要求 在一部分中 我必须添加按钮来替换一些
  • WPF System.ComponentModel.Win32Exception(0x80004005):无效的窗口句柄

    我在 WPF 上收到以下错误 我正在使用 MVVM 数据绑定到窗口上的 DataContext CollectionViewSources 视图模型和视图中有太多代码需要发布 但我想知道在哪里可以找到它 因为没有出现行号 该窗口使用 WPF
  • 拒绝浏览器通知权限

    根据规格 https developer mozilla org en US docs Web API Notification requestPermission 您可以提示浏览器允许用户授予或拒绝浏览器通知 一旦用户授予权限 是否也可以
  • 防止负载均衡器在长时间运行期间超时

    我使用 ASP NET MVC 4 接受最大 30 mb 的视频上传 视频上传到网站后 视频就会使用 HttpWebRequest 发布到第三方 Web 服务 向第三方服务的上传必须完成并返回响应 然后我的网站才能向浏览器返回响应 在 Ra
  • 编写我自己的 init 可执行文件

    我想创建自己的 init 并为下雪的周末带来一些 Linux 乐趣 我知道 内核使用 rootfs 启动 并在加载驱动程序和安装磁盘后将流程提供给 sbin init 我下载了ubuntu云镜像并尝试使用kvm直接启动内核 如下所示 kvm
  • Python Pandas:将具有唯一值的行连接起来

    在 Python pandas 中 我有一个大数据框 如下所示 df pd DataFrame a foo bar 3 b foo2 bar2 3 c foo3 bar3 3 d q w e r t y e q2 w2 e2 r2 t2 y
  • NHibernate 2.1 和 Oracle 10g 客户端出现错误

    我需要 NHibernate 2 1 才能与 Oracle 数据库对话 我被要求使用 Oracle 10g 客户端 尝试构建会话工厂时出现以下错误 无法转换类型的对象 Oracle DataAccess Client OracleConne
  • 如何将事件侦听器添加到对象数组

    我有一个对象数组 具体来说easelJS图片 像这样 var imageArray new Array gShape new createjs Shape shape is something imageArray push gShape
  • Cassandra 牺牲了 CAP 定理的哪一部分?为什么?

    有一个很棒的演讲 https github com strangeloop StrangeLoop2013 blob master slides sessions Kingsbury PartitionsForEveryone pdf关于在
  • 使用窗口事件调整画布元素大小

    我正在使用打字稿来绘制画布元素 我想让我的画布元素响应屏幕尺寸 这样我就可以将画布大小与父 div 元素相匹配 我试过用这个删除画布中的大小并在 css 中提供它 但这没有帮助 因为我有两个固定元素 我找到了这个已有 8 年历史的解决方案画