【问题标题】:canvas working only after several calling and refresh画布仅在多次调用和刷新后才能工作
【发布时间】:2015-08-30 23:10:44
【问题描述】:

我正在使用 html5 画布,但它无法正常工作

<section class="row" style="margin: 0px auto;">
  <canvas id="a" width=1000 height=350></canvas>
  <canvas id="b" width=1000 height=350></canvas>
  <canvas id="c" width=1000 height=350></canvas>
  <canvas id="d" width=1000 height=350></canvas>
  <canvas id="e" width=1000 height=350></canvas>
  <canvas id="f" width=1000 height=350></canvas>
  <canvas id="g" width=1000 height=350></canvas>
  <canvas id="h" width=1000 height=350></canvas>
  <canvas id="i" width=1000 height=350></canvas>
<img src="original.png" class="ogimg" id="ogimg"/> 
<img src="shadow.png" class="high" id="high"/> 
<img src="bulldozer-mocha.png" name="bulldozer-mocha.png" onclick="drw(this)">
<img src="bulldozer.png" name="bulldozer.png" onclick="drw_cushion(this)">
<img src="mocha.png" name="mocha.png" onclick="drw_cushions(this)">
</section>

完整代码在这里jsfiddle

代码可以正常工作,但需要 2 或 3 次页面刷新

请帮我找出错误

https://jsfiddle.net/jbedrzxo/

【问题讨论】:

  • 什么工作不正常?你试图做什么,发生了什么/没有发生什么?我们需要比“不工作”更多的信息,因为这是主观的并且可能意味着任何事情。
  • 它需要多次点击和页面刷新才能开始工作
  • 功能正常工作,检查警告信息,但认为需要双击在画布上绘制图像
  • 那么每个画布首先应该做什么?预期的行为是什么?您没有提供足够的信息让任何人提供答案。
  • 在尝试绘制图像之前,您没有给图像加载时间。您必须通过设置 image.onload 回调给您的图像加载时间。看看这篇文章:stackoverflow.com/questions/30578521/…。您可能希望在应用程序开始时预加载所有图像,以便在需要时可用。看看这篇文章:stackoverflow.com/questions/23220385/…

标签: javascript jquery html performance html5-canvas


【解决方案1】:

这里有一些代码可以帮助您入门:

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var c = document.createElement("canvas");
var cctx = c.getContext("2d");
var cw = canvas.width;
var ch = canvas.height;

// Image Loader: put the paths to your images in imageURLs[]
var imageURLs = [];
imageURLs.push("https://dl.dropboxusercontent.com/u/139992952/multple/sofa.png");
imageURLs.push("https://dl.dropboxusercontent.com/u/139992952/multple/texture1.png");
imageURLs.push("https://dl.dropboxusercontent.com/u/139992952/multple/texture2.png");
imageURLs.push("https://dl.dropboxusercontent.com/u/139992952/multple/texture3.png");
var imgs = [];
var imagesOK = 0;
preloadAllImages(start);

var sofaParts = [];
var sofa = {
  x: 0,
  y: 0,
  img: null,
  textureIndex: 0,
}
sofaParts.push(sofa);

var texturePatterns = [];

function preloadAllImages(callback) {
  for (var i = 0; i < imageURLs.length; i++) {
    var img = new Image();
    imgs.push(img);
    img.onload = function() {
      imagesOK++;
      if (imagesOK >= imageURLs.length) {
        callback();
      }
    };
    img.onerror = function() {
      alert("image load failed");
    }
    img.src = imageURLs[i];
  }
}

function start() {
  sofa.img = imgs[0];
  for (var i = 1; i < imgs.length; i++) {
    texturePatterns.push(cctx.createPattern(imgs[i], 'repeat'))
  }
  draw();
}

function draw() {
  ctx.clearRect(0, 0, cw, ch);
  for (var i = 0; i < sofaParts.length; i++) {
    var s = sofaParts[i];
    ctx.drawImage(s.img, s.x, s.y);
    applyTexture(s.img, s.textureIndex);
    ctx.globalAlpha = 0.20;
    ctx.drawImage(c, s.x, s.y);
    ctx.globalAlpha = .15;
    ctx.drawImage(s.img, s.x, s.y);
    ctx.globalAlpha = 1.00;
  }
}

function applyTexture(img, textureIndex) {
  c.width = img.width;
  c.height = img.height;
  cctx.drawImage(img, 0, 0);
  cctx.globalCompositeOperation = 'source-atop';
  cctx.fillStyle = texturePatterns[textureIndex];
  cctx.fillRect(0, 0, img.width, img.height);
  cctx.globalCompositeOperation = 'source-over';
}

$('.textures').click(function(e) {
  sofaParts[0].textureIndex = $(this).data('tindex');
  draw();
});
#canvas {
  border: 1px solid red;
  margin: 0 auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<canvas id="canvas" width=300 height=200></canvas>
<h4>Click on a texture for the sofa.</h4>
<img class='textures' data-tindex=0 src='https://dl.dropboxusercontent.com/u/139992952/multple/texture1.png'>
<img class='textures' data-tindex=1 src='https://dl.dropboxusercontent.com/u/139992952/multple/texture2.png'>
<img class='textures' data-tindex=2 src='https://dl.dropboxusercontent.com/u/139992952/multple/texture3.png'>

【讨论】:

  • 我实现了加载的方式,通过两次调用函数就成功了,谢谢大家。
猜你喜欢
  • 2014-11-16
  • 1970-01-01
  • 2016-10-31
  • 2017-05-13
  • 2023-03-18
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多