• Egret 划线手势动画 (切水果)


    一个划线的动画。类似切水果。

     但是没别人做得那么好。就是一个实现思路。

    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();
        }
    

      

  • 相关阅读:
    Difference between application/xml and text/xml
    [转]ASP.NET MVC URL 路由简介
    js Unicode编码转换
    svn更改用户名
    招商银行开发成功国内业界第一个实用的数据仓库系统
    Response.ContentType 详细列表备忘使用(转载)
    WebClient UploadData UploadFile 用法
    char tchar wchar_t WCHAR LPCTSTR LPCWSTR
    网站测试自动化系统—系统应该有的功能
    网站测试自动化系统—收集测试结果
  • 原文地址:https://www.cnblogs.com/gamedaybyday/p/12203035.html
Copyright © 2020-2023  润新知