dart - 自动调整 Canvas 大小以占用其容器的全部大小

标签 dart polymer dart-polymer

我正在将dart聚合物应用程序更新为最新的聚合物,核心元素和纸质元素。我以前使用的是聚合物元素,在该聚合物布局中有一个on-polymer-layout事件,我正在使用该事件来帮助调整 Canvas 元素的大小,以获取其容器的整个大小(请参阅Autosizing canvas inside a polymer grid layout)。

我找不到等效的int核心元素,因此回到正题。我现在该如何处理?

我回到使用聚合物布局事件之前的状态。我可以将容器的大小调整为整个浏览器的宽度,但是它的高度是 Canvas 的默认高度。如果我调整浏览器窗口的大小,它可以工作,所以这是一个初始化问题。
在添加聚合物布局事件之前,我必须使用带有超时的hack。那真的是胡扯,所以我祈祷我缺少的新核心元素中有一个干净的方法。

另请参阅there doesn't seem to be a polymer-layout event

我的代码

的HTML

<link rel="import" href="packages/paper_elements/paper_slider.html">

<polymer-element name="delme-canvas">

  <template>
    <style>
      #top {
        background-color: red;
        height: 100%;
      }
      #slider-container {
        margin: 10px;
        padding: 10px;
        border-top-left-radius: 10px;
        border-top-right-radius: 10px;
        border-bottom-right-radius: 10px;
        border-bottom-left-radius: 10px;
        background-color: rgb(238, 238, 238);
      }
      paper-slider {
        width: 150px;
      }
      canvas {
        border: 2px solid black;
      }
      #canvasContainer {
        border: 2px solid blue;
        height: 100%;
      }
    </style>
    <section id="top" vertical layout flex>
      <section id="section" horizontal layout>
        <div id="slider-container" center horizontal layout>
          <div id="label">Roundness</div>
          <paper-slider id="paper_slider" editable min="0" max="100" step="0.1"></paper-slider>
        </div>
        <div id="div" flex></div>
      </section>
      <section id="canvasContainer" flex>
        <canvas id="canvas" flex></canvas>
      </section>
    </section>
  </template>

  <script type="application/dart" src="delme_canvas.dart">
  </script>

</polymer-element>


import 'dart:html';
import 'package:polymer/polymer.dart';

@CustomTag('delme-canvas')
class CanvasViewElement extends PolymerElement  {

  CanvasElement canvas;
  HtmlElement canvasContainer;

  CanvasViewElement.created() : super.created();

  void _resize() {
    if (canvasContainer.clientWidth == 0)
      return;
    canvas.width = canvasContainer.clientWidth;
    canvas.height = canvasContainer.clientHeight;


    _redraw();
  }

  void _redraw() {
    final context = canvas.context2D;
    context.fillRect(10, 10, 100, 100);
    context.stroke();
  }

  @override
  void ready() {
    canvas = $['canvas'];
    canvasContainer = $['canvasContainer'];

    window.onResize.listen((_) {
      _resize();
    });

    _resize();

  }

}

index.hml
<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>delme</title>
    <script src="packages/web_components/platform.js"></script>
    <script src="packages/web_components/dart_support.js"></script>
    <link rel="import" href="delme_canvas.html">
  </head>
<body unresolved fit vertical layout>
  <delme-canvas flex></delme-canvas>
  <script type="application/dart">export 'package:polymer/init.dart';</script>
</body>
</html>

最佳答案

我尝试了Günter使用attached的建议,但是那也不起作用。但是,在此过程中,我发现有一个名为domReady的新生命周期事件(因为编写了原始代码)。这似乎可以解决问题。

因此,ready方法更改为domReady,例如

@override
void domReady() {
  canvas = $['canvas'];
  canvasContainer = $['canvasContainer'];

  window.onResize.listen((_) {
    _resize();
  });

  _resize();

}

关于dart - 自动调整 Canvas 大小以占用其容器的全部大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25467796/

相关文章:

javascript - 我们如何在脚本标签中正确使用 polymer 属性?

jquery - 在 Dart 中使用 Jquery UI

dart - 错误删除SelectElement上的不允许的属性

firebase - Flutter:Firebase FieldValue.serverTimestamp() 到 DateTime 对象

flutter - 潜在无限项目列表 : ListView. builder、StreamBuilder、FutureBuilder 还是其他?

Dart:Dart 如何匹配类的构造函数中的命名参数?

polymer - 优雅地降级自定义元素(或 polymer 元素)

flutter - 如何在Flutter中将渐变颜色设置为图标?

javascript - Mixin 是什么以及何时在 polymer 中使用它?

dart - 您如何以编程方式仅从核心元素中禁用/隐藏 CoreTooltip?