绘制虚线方法有很多种,这几天看到一个另外一种方法,现在尝试一下来制作。过去绘制的方法都是采用间隔的方法来制作,现在利用一个小技巧可以通过位图来绘制。方法如下:
我们首先创建一个位图。然后进行填充。注意,填充的时候,并不是完全填充完的。其中的技巧就是在这里了。
var bmpData:BitmapData=new BitmapData(10,1,true,0x0);
bmpData.fillRect(new Rectangle(0,0,5,1),0xFF0000000);
位图的宽是10个像素,设置透明,而填充的时候,只是填充一半 。这样你看到的位图,其实有一半是填充了黑色,一半是没有被填充的。这样你看起来这个线就像被隔开一样,利用这种错觉来绘制一条虚线。效果也是非常好玩。
绘图Graphic 类里面有一个方法,是可以指定位图笔刷的:
lineBitmapStyle(bitmap:
BitmapData, matrix:
Matrix = null, repeat:
Boolean = true, smooth:
Boolean = false):
void
指定一个位图,用于绘制线条时的线条笔触。
有了这个方法之后,下面的事情就变得乐趣多了。
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.display.Sprite;
var bmpData:BitmapData=new BitmapData(10,1,true,0x0);
bmpData.fillRect(new Rectangle(0,0,5,1),0xFF0000000);
var pen:Sprite=new Sprite();
addChild(pen);
pen.x=200;
pen.y=100;
pen.graphics.lineStyle(1);
pen.graphics.lineBitmapStyle(bmpData);//指定位图做笔刷
pen.graphics.moveTo(0,0);
pen.graphics.lineTo(200,0);
绘制一条虚线,并不能让我们觉得满足,因为利用这个位图其实可以制作其他的事情。
(2)结合动画的形式,让线条动起来
使用一种比较有趣的技巧,通过复制像素和移动位图结合产生了虚线滚动视角效果。
这个过程,利用位图scroll 方法,让图片进行一个像素移动,一边移动,一边进行复制,循环起来,产生视角错觉。这样虚线就想滚动一样了
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.display.Sprite;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.display.Bitmap;
var bmpData:BitmapData=new BitmapData(10,1,true,0x0);
bmpData.fillRect(new Rectangle(0,0,5,1),0xFF0000000);
var pen:Sprite=new Sprite();
addChild(pen);
pen.x=200;
pen.y=100;
pen.graphics.lineStyle(1);
pen.graphics.lineBitmapStyle(bmpData);
pen.graphics.moveTo(0,0);
pen.graphics.lineTo(200,0);
var timer:Timer = new Timer(200);
timer.addEventListener(TimerEvent.TIMER,onTimer);
timer.start();
function onTimer(event:TimerEvent):void
{
var color:uint= bmpData.getPixel32(9,0);
bmpData.scroll(1, 0);
bmpData.setPixel32(0, 0, color);
}//利用位图移动的时候,一边复制像素一边移动
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.display.Sprite;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.display.Bitmap;
import flash.geom.Matrix;
var bmpData:BitmapData=new BitmapData(10,1,true,0x0);
bmpData.fillRect(new Rectangle(0,0,5,1),0xFF0000000);
var pen:Sprite=new Sprite();
addChild(pen);
pen.x=200;
pen.y=100;
pen.graphics.lineStyle(10);
pen.graphics.lineBitmapStyle(bmpData,new Matrix(0,-1,1));
pen.graphics.moveTo(0,0);
pen.graphics.lineTo(200,0);
var timer:Timer = new Timer(100);
timer.addEventListener(TimerEvent.TIMER,onTimer);
timer.start();
function onTimer(event:TimerEvent):void
{
var color:uint= bmpData.getPixel32(9,0);
bmpData.scroll(1, 0);
bmpData.setPixel32(0, 0, color);
}//利用位图移动的时候,一边复制像素一边移动