Проблема с рисованием текста на дуге в Canvas с использованием Javascript - PullRequest
0 голосов
/ 04 июня 2019

Я хотел бы нарисовать «предоставленный пользователем текст» на форме дуги в холсте HTML, используя Javascript.Это был самый близкий пример, который я видел для элемента: Создайте текст дуги, используя canvas

Однако в моем коде я получаю «Uncaught TypeError: Невозможно прочитать свойство 'getContext'нуля "Где я иду не так?

HTML

<!DOCTYPE HTML>
<html>
<head>
  <style>
    body {
      margin: 0px;
      padding: 0px;
    }
#canvas{
  display:block;
  margin:0 auto;
}
  </style>
<script src="textOnPath3.js"></script>
</head>
<body>
<canvas id="myCanvas" width="900" height="400" style="border:1px solid #ff0000;"></canvas>
</body>
</html>

JAVASCRIPT

 window.addEventListener("load", eventWindowLoaded, false);

      var canvas = document.getElementById('myCanvas'), 
        context = canvas.getContext('2d'),
        centerX = canvas.width / 2,
        centerY = canvas.height - 30,
        angle = Math.PI * 0.8,
        radius = 150;

      context.font = '30pt helvetica';
      context.textAlign = 'center';
      context.fillStyle = 'red';
      context.strokeStyle = 'blue';
      context.lineWidth = 4;
      drawTextAlongArc(context, 'Arc Canvas Text', centerX, centerY, radius, angle);

      // draw circle underneath text
      context.arc(centerX, centerY, radius - 10, 0, 2 * Math.PI, false);
      context.stroke();

function eventWindowLoaded () {
    drawTextAlongArc();
}
function drawTextAlongArc(context, str, centerX, centerY, radius, angle) {
        var len = str.length, s;
        context.save();
        context.translate(centerX, centerY);
        context.rotate(-1 * angle / 2);
        context.rotate(-1 * (angle / len) / 2);
        for(var n = 0; n < len; n++) {
          context.rotate(angle / len);
          context.save();
          context.translate(0, -1 * radius);
          s = str[n];
          context.fillText(s, 0, 0);
          context.restore();
        }
        context.restore();
}

1 Ответ

0 голосов
/ 04 июня 2019

Проблема в том, что, хотя вы добавили прослушиватель событий, чтобы проверить, закончилась ли загрузка страницы, он просто вызовет функцию eventWindowLoaded .

Это означает, что все остальные команды сразу после этогоЛиния

window.addEventListener("load", eventWindowLoaded, false);

будет вызываться независимо от того, загружена она или нет.

Поэтому, как только она достигнет

context = canvas.getContext('2d')

, произойдет сбой с полученной ошибкой,Элемент html canvas пока недоступен, поэтому значение canvas будет неопределенным.

Чтобы исправить эту оболочку, все внутри функции eventWindowLoaded выглядит следующим образом:

 window.addEventListener("load", eventWindowLoaded, false);

 function eventWindowLoaded() {
   var canvas = document.getElementById('myCanvas');
   context = canvas.getContext('2d');
   centerX = canvas.width / 2;
   centerY = canvas.height - 30;
   angle = Math.PI * 0.8;
   radius = 150;

   context.font = '30pt helvetica';
   context.textAlign = 'center';
   context.fillStyle = 'red';
   context.strokeStyle = 'blue';
   context.lineWidth = 4;
   drawTextAlongArc(context, 'Arc Canvas Text', centerX, centerY, radius, angle);

   // draw circle underneath text
   context.arc(centerX, centerY, radius - 10, 0, 2 * Math.PI, false);
   context.stroke();

   drawTextAlongArc();
 }
...