Esta clase surgió básicamente por la necesidad, así es que retome un tip de Zguillez en el cual mostraba una "Clase para dibujar líneas de puntos en ActionScript 3", y la adapte para hacer lineas separadas en segmentos (similar al atributo dashed-border en CSS).
Código :
package com.zguillez.display.graphics
{
import flash.display.Sprite;
import flash.display.Shape;
import flash.display.Graphics;
//------------------------------------------
public class Circulo extends Sprite
{
private var _clip:Shape;
private var _size:uint;
private var _bgColor:uint;
private var _borderSize:uint;
private var _borderColor:uint;
private var _bg:Boolean;
//------------------------------------------
public function Circulo(size=10,bgColor=0x000000,bg=true,borderSize=0,bordeColor=0x000000)
{
_size = size;
_bg = bg;
_bgColor = bgColor;
_borderSize = borderSize;
_borderColor = bordeColor;
dibuja();
}
//------------------------------------------
private function dibuja():void
{
_clip = new Shape();
if (_bg==true) {
_clip.graphics.beginFill(_bgColor);
}
if (_borderSize!=0) {
_clip.graphics.lineStyle(_borderSize, _borderColor);
}
var radio:uint = Math.round(_size/2);
_clip.graphics.drawCircle(radio, radio, radio);
if (_bg==true) {
_clip.graphics.endFill();
}
addChild(_clip);
}
//------------------------------------------
}
}Y bien, esta es la clase modificada llamada dashedLine.as, que se encargara de dibujar las lineas. El único rasgo interesante es que cada 10 pixeles la variable boolean "dashed" se encargara de borrar y dibujar alternadamente la linea, logrando así el efecto:Código :
package mau.utils
{
import com.zguillez.display.graphics.Circulo;
import flash.display.Sprite;
import flash.geom.Point;
//
public class dashedLine extends Sprite
{
private var size:uint;
private var bgColor:uint;
private var dashed:Boolean;
private var distance:uint;
private var line:Sprite;
private var p1:Point;
private var p2:Point;
//
public function dashedLine(_size:uint = 3, _bgColor:uint = 0x000000)
{
bgColor = _bgColor;
size = _size < 3 ? 3 : _size;
line = new Sprite();
addChild(line);
}
//
public function moveTo(x:int, y:int):void
{
p1 = new Point(x, y);
line.x = p1.x;
line.y = p1.y;
}
//
public function lineTo(x:int, y:int):void
{
p2 = new Point(x, y);
distance = Point.distance(p1, p2);
drawLine();
}
//
private function drawLine():void
{
var space:Number = 0;
//
for (var i:uint = 0; i <= distance; i++)
{
space++;
if(space > 10)
{
space = 0;
dashed = dashed ? false : true;
}
//
if(dashed)
{
var circulo:Circulo = new Circulo(size, bgColor);
circulo.x = (p2.x - p1.x) / distance * i;
circulo.y = (p2.y - p1.y) / distance * i;
line.addChild(circulo);
}
}
//
dashed = true;
}
}
}Finalmente, aquí un ejemplo de su uso en el cual podemos agregar como parámetros el grosor de la linea y el color de la misma respectivamente, ambos opcionales por lo que no te dará problemas al personalizar los parametros:Código :
import mau.utils.dashedLine; // var linea:dashedLine = new dashedLine(1); linea.moveTo(10,20); linea.lineTo(490,20); addChild(linea);
asphyk :
Código :
package view
{
import flash.display.MovieClip;
import flash.geom.Point;
/**
* ...
* @author asphyk
*/
public class Param04 extends MovieClip
{
public function Param04()
{
init();
}
private function init():void
{
drawLine(this, new Point(10, 20), new Point(490,20),10);
}
private function drawLine(cont:MovieClip, po:Point, pf:Point,espacio:Number):void
{
cont.graphics.lineStyle(0.5,0xFFFFFF,1);
cont.graphics.moveTo(po.x,po.y);
var pendiente:Number = ((pf.y - po.y)/(pf.x - po.x));
var distancia:Number = Point.distance(po, pf);
var nespacio:int = 0;
var n1espacio:int = 0;
var dibuja:Boolean = false;
var ndibuja:Boolean = false;
for (var i:uint = 0; i < distancia; i++)
{
if (nespacio <= espacio)
{
dibuja = true;
}else
{
dibuja = false;
n1espacio++;
}
if (n1espacio > espacio)
{
ndibuja = true;
}
if (dibuja)
{
cont.graphics.lineTo( i+po.x, pendiente*(i) + po.y);
//cont.graphics.lineTo( i+po.x, (i)*(i)*1/20 + po.y);
}
if(ndibuja)
{
ndibuja = false;
nespacio = 0;
n1espacio = 0;
cont.graphics.moveTo(i+po.x, pendiente*(i) + po.y);
//cont.graphics.moveTo(i+po.x,(i)*(i)*1/20 + po.y);
}
nespacio++;
}
}
}
}
Código :
dashed=!dashed
Código :
dashed = dashed ? false : true;