【问题标题】:html5 canvas text animation news tickerhtml5 画布文本动画新闻自动收报机
【发布时间】:2013-11-13 18:52:24
【问题描述】:

我在这里找到了这段代码: https://github.com/shinstudio/html5_myown_party/blob/master/news_ticker/index.html

我需要从右到左更改股票滚动条。

画布js代码:

<div id="border">
   <canvas id="bannershow" width="500" height="150" />
</div>

var globalx = 0;
var vector = 1;
var interval = 120;
var canvas = document.getElementById('bannershow');
var ctx = canvas.getContext('2d');
var fontsize = 80;
var canvasHeight = 150;
var canvasWidth = 500;

function banner(label) {

    ctx.clearRect(0, 0, canvasWidth, canvasHeight);    
    ctx.fillStyle = 'rgb(0, 0, 0)';
    ctx.fillRect (0, 0, canvasWidth, canvasHeight);

    ctx.fillStyle = 'rgba(255, 255, 255, 0.4)'
    ctx.font = fontsize + 'px Helvetica';
    ctx.textBaseline = 'top';

    if (globalx > canvasWidth) {
        globalx = ctx.measureText(label).width * -1;
    }
    ctx.fillText(label, globalx, (canvasHeight-fontsize)/2);

    globalx += vector;
}
setInterval(banner, 1000/interval, 'Helvetica is the new font');

【问题讨论】:

  • 我稍微改变了我的解决方案。现在它循环了。

标签: javascript animation html5-canvas


【解决方案1】:

http://jsfiddle.net/t74ww/1/

var globalx = 500;
var vector = -1;
var interval = 120;
var canvas = document.getElementById('bannershow');
var ctx = canvas.getContext('2d');
var fontsize = 80;
var canvasHeight = 150;
var canvasWidth = 500;

function banner(label) {

    ctx.clearRect(0, 0, canvasWidth, canvasHeight);    
    ctx.fillStyle = 'rgb(0, 0, 0)';
    ctx.fillRect (0, 0, canvasWidth, canvasHeight);

    ctx.fillStyle = 'rgba(255, 255, 255, 0.4)'
    ctx.font = fontsize + 'px Helvetica';
    ctx.textBaseline = 'top';
    if (globalx < 0 - ctx.measureText(label).width) {
        globalx = canvasWidth;
    }  
    ctx.fillText(label, globalx, (canvasHeight-fontsize)/2);

    globalx += vector;
}
setInterval(banner, 1000/interval, 'Helvetica is the new font');

只需更改 vector = -1 和 globalx = 500。vector 负责水平滚动的方向,而 globalx 是呈现文本的起点(在 x 轴上)。 更改这些变量比更改函数要好。事实上,动画是由这个设置/变量控制的。

干杯

【讨论】:

  • 试试下面的我的解决方案 - 它循环
【解决方案2】:

您需要将banner() 函数更改为:

       function banner(label) {
            ctx.clearRect(0, 0, canvasWidth, canvasHeight);    
            ctx.fillStyle = 'rgb(0, 0, 0)';
            ctx.fillRect (0, 0, canvasWidth, canvasHeight);

            ctx.fillStyle = 'rgba(255, 255, 255, 0.4)'
            ctx.font = fontsize + 'px Helvetica';
            ctx.textBaseline = 'top';
            if (globalx < ctx.measureText(label).width * -1) {
                 globalx =  canvasWidth;
            }
            ctx.fillText(label, globalx, (canvasHeight-fontsize)/2);

            globalx -= vector;
        }

负向量将反转移动,并且 globalx 的修改条件将保持连续循环。

【讨论】:

    【解决方案3】:

    globalx 是 vraibale,它正在增加并将其从 0 变为画布的宽度,只需对其进行逆操作,它很可能会为您工作

                        function banner(label) {
                        ctx.clearRect(0, 0, canvasWidth, canvasHeight);    
                        ctx.fillStyle = 'rgb(0, 0, 0)';
                        ctx.fillRect (0, 0, canvasWidth, canvasHeight);
    
                        ctx.fillStyle = 'rgba(255, 255, 255, 0.4)'
                        ctx.font = fontsize + 'px Helvetica';
                        ctx.textBaseline = 'top';
                        globalx = canvaswidth;
                        if (globalx > 0 ) {
                             globalx = ctx.measureText(label).width * 1;
                        }
                        ctx.fillText(label, globalx, (canvasHeight-fontsize)/2);
    
                        globalx -= vector;
                    }
    

    PS - 我还没有测试过,但似乎从画布的宽度开始对 globalx 进行逆操作应该可以解决问题。

    【讨论】:

      【解决方案4】:
                              var globalx = 0;
                              var vector = 2;
                              var interval = 120;
                              var canvas = document.getElementById('bannershow');
                              var ctx = canvas.getContext('2d');
                              var fontsize = 120;
                              var canvasHeight = 150;
                              var canvasWidth = 500;
      
                              function banner(label) {
      
                                  ctx.clearRect(0, 0, canvasWidth, canvasHeight);    
                                  ctx.fillStyle = 'rgb(0, 0, 0)';
                                  ctx.fillRect (0, 0, canvasWidth, canvasHeight);
      
                                  ctx.fillStyle = 'rgba(255, 255, 255, 0.4)'
                                  ctx.font = fontsize + 'px Helvetica';
                                  ctx.textBaseline = 'top';
                                  if (globalx > canvasWidth) {
                                       globalx = ctx.measureText(label).width * -1;
                                  }
                                  ctx.fillText(label, globalx, (canvasHeight-fontsize)/2);
                                  if(globalx==-500)
                                  {
                                      globalx=50;
                                  }
                                  globalx -= vector;
                              }
                              setInterval(banner, 1000/interval, 'Helvetica');
      

      在检查了一点之后,我发现这是一个循环和工作,如果你想改变那个间隔,你可以改变 globalx

      if(globalx==-500)
      {
        globalx=50;
      }
      

      改变这个来改变间隔,除了所有的工作都很好我认为这会帮助你……:)

      [更新]

      globax=interval 改变这个interval

      【讨论】:

      • 这个工作......但它在循环时打嗝......我怎样才能让它在循环结束时不失真
      • 我描述您必须更改间隔 globax=interval 以便您可以在我的回答中进行一次 chge 更新
      猜你喜欢
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 2012-03-13
      • 2016-04-29
      相关资源
      最近更新 更多