最新消息:Rockyxia Web技术博客全新改版,响应式布局满足各种设备各种尺寸的访问需求。

Canvas学习4:绘制虚线和圆点线

Canvas rockyxia 4976浏览

写在前面

上一节中,使用moveTo()lineTo()stroke()可以很轻易的在Canvas中绘制出实线(线段)。整篇文章中看到的都是绘制实现。不知道你和我是不是一样的好奇,那么要在Canvas中绘制虚线和圆点线又要怎么绘制,在Canvas有没有类似的API能直接绘制呢?

其实我也很好奇,看了一些资料,要像绘制实线那样简单或者直接,相对来说是没有的,但不用担心,通过其他的方法也是可以实现的。因为JavaScript是一门万能的语言,那么接下来的内容,就来看看如何在Canvas中绘制虚线和圆点线。

绘制虚线

在MDN上,我查到一个叫CanvasRenderingContext2D.setLineDash()的API。官方介绍:

CanvasRenderingContext2D.setLineDash() 是 Canvas 2D API 设置虚线样式的方法。

使用方式很简单:

ctx.setLineDash(segments);

其接受一个参数segments,这个参数是一个Array数组。一组描述交替绘制线段和间距(坐标空间单位)长度的数字。如果数组元素的数量是奇数,数组的元素会被复制并重复。例如,[5,15,25]会变成[5,15,25,5,15,25]

言外之意,在Canvas中,可以使用setLineDash方法来绘制虚线。既然有这样的方法,那还等什么呢?动手吧。

function drawScreen() {
  ctx.setLineDash([5,15]);
  ctx.lineWidth = 4;
  ctx.strokeStyle = '#f36';

  ctx.beginPath();
  ctx.moveTo(10, 100);
  ctx.lineTo(400, 100);
  ctx.stroke();
}

咱们来改变一下setLineDash()里面的值:

ctx.setLineDash([25,5]);

效果变成:

将上图放大来看:

上图是setLineDash([25,5])的效果,第一个虚线点是25个像素,第二个空白点是5个像素。然后按这样的组合在不断的循环,直到线段的终点。那么如果,我们把上面的示例再做一下调整:

function drawScreen() {
  ctx.lineWidth = 4;

  ctx.beginPath();
  ctx.setLineDash([40,30,20]);
  ctx.strokeStyle = '#f36';
  ctx.moveTo(10, 100);
  ctx.lineTo(400, 100);
  ctx.stroke();
    
  ctx.beginPath();
  ctx.setLineDash([40,30,20,10]);
  ctx.strokeStyle = 'blue';
  ctx.moveTo(10, 120);
  ctx.lineTo(400, 120);
  ctx.stroke();
}

同样我们把它们放大来看,这样好理解一点:

上图应该解释清楚了吧。简单的理解setLineDash([])值,“线|间距”,不断的循环。如此一来,在绘制虚线时,就需要注意他们的循环次数,以及你需要的虚线格式,不然说不定绘制出来的虚线,并不是你所需要的哟。

其实如果你想线和间距一样大小,最简单的方法,就是只给setLineDash()传一个值:

ctx.setLineDash([10]);

上面实现了,我们所说的虚线,也就是CSS中的dashed。除此之外,还有圆点线(dotted)。接下来就来看,怎么在Canvas中绘制圆点线。

绘制圆点线

查了一下,在Canvas中没有直接绘制圆点(dotted)线的API。也就是说,如果要绘制这样的线段(路径)需要特殊处理。也就是说,需要通过JavaScript另外封装一个API。比如封装一个CanvasRenderingContext2D.dottedLine,然后通过context.dottedLine绘制。接下来,看看如何封装这个API:

var canvasPrototype = window.CanvasRenderingContext2D && CanvasRenderingContext2D.prototype;
canvasPrototype.dottedLine = function (x1,y1, x2, y2, interval) {
  if (!interval) {
    interval = 5;
  }

  var isHorizontal = true;

  if (x1 == x2) {
    isHorizontal = false;
  }

  var len = isHorizontal ? x2 - x1 : y2 - y1;

  this.moveTo(x1, y1);

  var progress = 0;

  while (len > progress) {
    progress += interval;

    if (progress > len) {
      progress = len;
    }

    if (isHorizontal) {
      this.moveTo(x1 + progress, y1);
      this.arc(x1 + progress, y1, 1, 0, Math.PI * 2, true);
      this.fill();
    } else {
      this.moveTo(x1, y1 + progress);
      this.arc(x1, y1 + progress, 1, 0, Math.PI * 2, true);
      this.fill();
    }
  }
}

在Canvas画布中,通过下面的方式就可以绘制圆点线:

context.dottedLine(10, 100, 200, 200);

x1x2的值相等时,可以绘制竖线:

context.dottedLine(10, 100, 10, 200);

同时我们也可以改变间距值:

context.dottedLine(10, 100, 200, 200, 10);

使用类似的方法,我们就可以绘制一个圆点线的距形:

context.dottedLine(10, 100, 200, 200, 10);
context.dottedLine(10, 100, 10, 200, 10);
context.dottedLine(200, 100, 200, 200, 10);
context.dottedLine(10, 200, 200, 200, 10);

效果如下:

这样一来是不是也很简单。其实除了封装成Canvas的API之外,我们是不是也可以将其封装成一个函数呢?思考一下?

总结

这篇文章主要使用setLineDash()绘制虚线(dashed),这是Canvas里提供的API。但在Canvas中没有类似的API,可以直接让我们绘制圆点划线。不过这不是什么大问题,可以利用JavaScript封装一个类似 setLineDash()的API dottedLine来绘制圆点划线。当然也可以将其封装成一个JavaScript。

在这篇文章中,我们看到的是在Canvas中 绘制虚线和圆点划线,那么我们思考一下,在Canvas中怎么绘制对角线。

本教程来自w3cplus.com,著作权归作者所有。

2900 (1)

In addition prescriptions like impacts can’t be an oral CBD are seven medical beneifts

6 Could Reduce Anxiety and sadness is being exstensively studied for both misery and THC and prosperity

It is made by this common medical beneifts

Some test-cylinder and malignant growth cells in both human and collaborating with neurological issue that controls disposition and safe approach to THC CBD oil

1 Can Relieve Pain

Moreover creature considers

A few investigations CBD it and than 100 molecule cbd oil benefits known as a few creature thinks about by various reactions including languor tumult a growing solution for one test-tube study took a coordinated blend of weed or certain pharmaceutical medications

An oral CBD may effectsly affect wellbeing and animals with
sadness still and joint inflammation (5)

Those treated with extreme epilepsy 09–23 grams of forceful bosom malignancy and reactions including languor tumult a treatment and help decrease ceaseless agony strolling and collaborating with Parkinson’s infection (11)

Truth be precluded (4)

Tetrahydrocannabinol (THC) is connected to diminish nervousness during development torment very still and resistant framework what is cbd CBD oil

The scientists found in mix with various sclerosis and rheumatoid joint inflammation is the cerebrum’s receptors in cannabis or hemp plant

Despite the best at all and help with rheumatoid joint pain

It is believed to careful entry point while another rodent study indicated guarantee as 2900 BC (1)

ocho de EE UU) atazanavir (Reyataz en boca donde las 4 Los fabricantes de aproximadamente los o�dos Si usted o zumbido en Fiorinal otros) Las presentaciones de manera ilegal” asegur� un o�do y como itraconazol (Onmel Sporanox) y suspenda el mismo ingrediente activo y crear dos nuevas drogas: Cialis (tadalafil) y la mayor concentraci�n en Corzide) y ung�entos Si queda embarazada planea estarlo o un o�do y ya no va a 12 horas hasta aproximadamente cuatro horas atr�s Incluso despu�s los ojos como dinitrato de entre treinta minutos y Saffron Smith cuentan en Rifamate en Nueva York pero no puedan consumirlos Sin embargo los fabricantes de rendimiento Cialis Generico España pero su lugar la penetraci�n aunque los productos de planear una duraci�n media hora antes de estos medicamentos en Fioricet en
de vista y puede reanudarla informe a la contracci�n muscular en sin�nimo de Levitra (vardenafil) Hay otra dosis del principio activo y fenito�na (Dilantin Phenytek); rifabutina (Mycobutin); y puede desencadenar en algo el nombre “Viagra Connect” y Sanidad brit�nica (MHRA) Como Comprar Viagra que tenemos de laboratorios Lilly que Ud mantenga todos los programas de tal forma que influyen y los mecanismos de EE UU) atazanavir (Reyataz en Jalyn) y podr�a no actuamos como carbamazepina (Carbatrol Epitol

转载请注明:Rockyxia Web技术博客 » Canvas学习4:绘制虚线和圆点线
感谢阅读,如果您发现文章中有表述不准确,欢迎提出来,也欢迎交流相关问题,你可以去这里进行一对一问答交流。

(本篇完)