一個划線的動畫。類似切水果。

但是沒別人做得那么好。就是一個實現思路。
1. 在觸摸move函數中,繪制Line線段。
2. 線段隨着時間推移,Line逐漸縮小直至消失。
演示效果:

代碼如下:
/**
* 划線
* @author chenkai 2020.1.16
*/
class DrawLine {
private lineList:Array<Line> = []; //線段數組
private touchArea:egret.DisplayObjectContainer; //划線觸摸響應區域
private startX:number; //划線觸摸起點
private startY:number;
private color:number = 0xffffff; //線段顏色
private thickNess:number = 10; //線段粗細
private alpha:number = 1; //線段alpha
private CapsStyle:string = egret.CapsStyle.SQUARE; //線段端點樣式
private JointStyle:string = egret.JointStyle.ROUND; //鏈接點樣式
public constructor() {
}
public setTouchArea(touchArea:egret.DisplayObjectContainer){
this.touchArea = touchArea;
}
public enable(){
this.touchArea.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onTouchBegin, this);
this.touchArea.addEventListener(egret.Event.ENTER_FRAME, this.onEnterFrame, this);
}
public disable(){
this.touchArea.removeEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onTouchBegin, this);
this.touchArea.removeEventListener(egret.TouchEvent.TOUCH_MOVE, this.onTouchMove, this);
this.touchArea.removeEventListener(egret.TouchEvent.TOUCH_END, this.onTouchEnd, this);
this.touchArea.removeEventListener(egret.Event.ENTER_FRAME, this.onEnterFrame, this);
}
private onTouchBegin(e:egret.TouchEvent){
this.startX = e.stageX;
this.startY = e.stageY;
this.touchArea.removeEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onTouchBegin, this);
this.touchArea.addEventListener(egret.TouchEvent.TOUCH_MOVE, this.onTouchMove, this);
this.touchArea.addEventListener(egret.TouchEvent.TOUCH_END, this.onTouchEnd, this);
}
private onTouchMove(e:egret.TouchEvent){
let line:Line = new Line();
line.init(this.startX, this.startY, e.stageX, e.stageY);
this.lineList.push(line);
this.touchArea.addChild(line);
this.startX = e.stageX;
this.startY = e.stageY;
}
private onTouchEnd(){
this.touchArea.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onTouchBegin, this);
this.touchArea.removeEventListener(egret.TouchEvent.TOUCH_MOVE, this.onTouchMove, this);
this.touchArea.removeEventListener(egret.TouchEvent.TOUCH_END, this.onTouchEnd, this);
}
//線段由起點到終點位置,樣式是兩頭細,中間粗,所以分成2段來繪制。
//第一段從起點到中間,由細變粗
//第二段從終點到中間,由細變粗
private onEnterFrame(){
let len = this.lineList.length;
let line:Line;
let midIndex:number = len*3/5; //線段中間最粗的位置
let rate = this.thickNess/midIndex; //線段的粗細變化值
//繪制第一段,起點到中間,由細變粗
for(let i=0;i<midIndex;i++){
let line:Line = this.lineList[i];
line.graphics.clear();
line.graphics.lineStyle(rate*i,this.color,this.alpha,true,null,this.CapsStyle,this.JointStyle);
line.graphics.moveTo(line.startX,line.startY);
line.graphics.lineTo(line.endX, line.endY);
}
//繪制第二段,終點到中間,由細變粗
rate = this.thickNess/(len-midIndex);
let j = 0;
for(let i=len-1;i>=midIndex;i--){
j++;
let line:Line = this.lineList[i];
line.graphics.clear();
line.graphics.lineStyle(rate*j,this.color,this.alpha,true,null,this.CapsStyle,this.JointStyle);
line.graphics.moveTo(line.startX,line.startY);
line.graphics.lineTo(line.endX, line.endY);
}
//刪除生命周期結束的線。當線段數量<10時,只刪除2個;當線段數量>=10時,刪除十分之一的線段
if(len < 10){
for(let i=0;i<2;i++){
let line:Line = this.lineList.shift();
line && line.removeSelf();
}
}else{
len = len/10;
for(let i=0;i<len;i++){
let line:Line = this.lineList.shift();
line.removeSelf();
}
}
}
public destroy(){
//刪除監聽
if(this.touchArea){
this.touchArea.removeEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onTouchBegin, this);
this.touchArea.removeEventListener(egret.TouchEvent.TOUCH_MOVE, this.onTouchMove, this);
this.touchArea.removeEventListener(egret.TouchEvent.TOUCH_END, this.onTouchEnd, this);
this.touchArea.removeEventListener(egret.Event.ENTER_FRAME, this.onEnterFrame, this);
}
//刪除線段
let len = this.lineList.length;
let line:Line;
for(let i=0;i<len;i++){
line = this.lineList[i];
line.removeSelf();
}
this.lineList.length = 0;
//刪除引用
this.touchArea = null;
}
}
class Line extends egret.Sprite{
public startX:number;
public startY:number;
public endX:number;
public endY:number;
public constructor(){
super();
}
public init(startX:number, startY:number,endX:number,endY:number){
this.startX = startX;
this.startY = startY;
this.endX = endX;
this.endY = endY;
}
public removeSelf(){
this.parent && this.parent.removeChild(this);
}
}
在Main.ts中使用:
/**
* 創建場景界面
* Create scene interface
*/
protected createGameScene(): void {
let drawLine:DrawLine = new DrawLine();
drawLine.setTouchArea(this.stage);
drawLine.enable();
//drawLine.destroy();
}
