Flex Graphics 画时间轴测试例子

视频监控的web观看端有视频回放这一块,需要做一个时间轴,下面是根据Graphics画的时间轴的例子


下图是应用到项目中:


例子做的只是把时间轴网格,时间轴填充和会移动的时间画出来了,很多细节没有,例子中有用Flex画文字的两种实现方式,画时间刻度那种实现不知道怎么改样式

代码如下:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:smf="com.smithfox.components.*"
			   xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:components="components.*"
			   creationComplete="application1_creationCompleteHandler(event)" mouseUp="timeLineBg_mouseUpHandler(event)">
	
	<fx:Declarations>
	</fx:Declarations>
	<fx:Style>
		@namespace s "library://ns.adobe.com/flex/spark";
		@namespace mx "library://ns.adobe.com/flex/mx";

	</fx:Style>
	<fx:Script>
		<![CDATA[
			import flash.filters.BitmapFilter;
			import flash.filters.BitmapFilterQuality;
			import flash.filters.BitmapFilterType;
			import flash.filters.GlowFilter;
			import flash.filters.GradientGlowFilter;
			import flash.utils.setInterval;
			
			import mx.controls.Alert;
			import mx.core.INavigatorContent;
			import mx.core.UITextField;
			import mx.events.FlexEvent;
			import mx.graphics.ImageSnapshot;
			
			private var currentTime:String = "12:55:55";

			protected function application1_creationCompleteHandler(event:FlexEvent):void
			{
				this.drawTimeline(24, 3, 24);
				
			}
			
			/**
			 * 画时间轴网格
			 * @param col 列
			 * @param row 行
			 * @param h 当前显示的时段
			 **/
			private function drawTimeline(col:Number, row:Number, h:Number):void{
				timeLine.graphics.lineStyle(1, 0x6B6B6B);
				//画横线
				for(var i:int = 0; i < row; i++){
					timeLine.graphics.moveTo(0, 20+(20*i)+i);
					timeLine.graphics.lineTo(timeLineBg.width-2, 20+(20*i)+i);
				}
				//画竖线
				var colX:Number = timeLineBg.width/col;
				for(var j:int = 1; j < col; j++){
					timeLine.graphics.moveTo(colX*j, 0);
					timeLine.graphics.lineTo(colX*j, timeLineBg.height-2);
				}
				timeLine.graphics.endFill();
				//画刻度
				drawTimeTick(col, h, currentTime);
			}
			
			//切换小时显示
			private function changeHourShow(col:Number, row:Number, h:Number):void{
				timeLine.graphics.clear();
				var timeArr:Array = new Array({startTime:1422900000, endTime:1422910800},
					{startTime:1422911800, endTime:1422921000},{startTime:1422921600, endTime:1422940600});
				var timeArr1:Array = new Array({startTime:1422892800, endTime:1422979199});
				this.fillTimeLine(0, col, h, timeArr1);
				this.fillTimeLine(1, col, h, timeArr);
				this.fillTimeLine(2, col, h, timeArr1);
				this.fillTimeLine(3, col, h, timeArr);
				this.drawTimeline(col, row, h);
			}
			
			/**
			 * 画时间刻度值
			 * @param col 时间对应多少列
			 * @param h 当前显示的时段
			 * @param playTime 当前播放的时间
			 **/
			private function drawTimeTick(col:Number, h:Number, playTime:String):void{
				var arr:Array = getTickArr(h, playTime);
				var uit:UITextField = null;
				for(var i:int = 0; i < arr.length; i++){
					uit = new UITextField(); 
					var timeStr:String = arr[i];
					uit.text = timeStr;
					var textBitmapData:BitmapData = ImageSnapshot.captureBitmapData(uit); 
					var matrix:Matrix = new Matrix(); 
					var x:int = i*(timeLineBg.width/col); 
					var offSet:Number = 0; //偏移位置
					//中间刻度值的位置
					if(timeStr.length == 1){
						offSet = 5;
					} else if(timeStr.length == 2){
						offSet = 8;
					} else if(timeStr.length == 3){
						offSet = 11;
					} else if(timeStr.length == 4){
						offSet = 11;
					} else if(timeStr.length == 5){
						offSet = 15;
					}
					if(i > 0 && i < arr.length - 1){
						x = x - offSet; //设置中间的刻度值的位置
					}
					if(i == arr.length - 1){
						//最后一个刻度值的位置
						if(timeStr.length == 1){
							offSet = 12;
						} else if(timeStr.length == 2){
							offSet = 17;
						} else if(timeStr.length == 3){
							offSet = 11;
						} else if(timeStr.length == 4){
							offSet = 26;
						} else if(timeStr.length == 5){
							offSet = 31;
						}
						x = x - offSet;
					}
					var y:int = -20; //向上20个像素
					matrix.tx = x; 
					matrix.ty = y; 
					timeLine.graphics.lineStyle();
					timeLine.graphics.beginBitmapFill(textBitmapData,matrix,false); 
					timeLine.graphics.drawRect(x,y,uit.measuredWidth,uit.measuredHeight); 
					timeLine.graphics.endFill(); 
				}
			}
			
			private function getTickArr(h:Number, time:String):Array{
				var arr:Array = new Array();
				var timeArr:Array = time.split(":");
				var hour:Number = timeArr[0]; 
				var min:Number = timeArr[1];
				var sec:Number = timeArr[2];
				if(h == 24){ //24小时直接添加所有刻度
					arr.push(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24);
				} else if(h == 2){ //两小时的刻度开始结束时间都为偶数
					if(hour%2 == 0){
						arr.push(hour.toString());
						arr.push(hour+":10",hour+":20",hour+":30",hour+":40",hour+":50");
						hour += 1;
						arr.push(hour.toString());
						arr.push(hour+":10",hour+":20",hour+":30",hour+":40",hour+":50");
						arr.push((hour + 1).toString());
					} else{
						arr.push((hour-1).toString());
						arr.push(hour+":10",hour+":20",hour+":30",hour+":40",hour+":50");
						arr.push(hour.toString());
						arr.push(hour+":10",hour+":20",hour+":30",hour+":40",hour+":50");
						arr.push((hour + 1).toString());
					}
				} else if(h == 1){
					arr.push(hour.toString());
					arr.push(hour+":05",hour+":10",hour+":15",hour+":20",hour+":25",hour+":30");
					arr.push(hour+":35",hour+":40",hour+":45",hour+":50",hour+":55",(hour+1).toString());
					
				} else{
					if(min < 30){
						arr.push(hour.toString());
						arr.push(hour+":03",hour+":06",hour+":09",hour+":12",hour+":15");
						arr.push(hour+":18",hour+":21",hour+":24",hour+":27",hour+":30");
					} else{
						arr.push(hour+":30",hour+":33",hour+":36",hour+":39",hour+":42");
						arr.push(hour+":45",hour+":48",hour+":51",hour+":54",hour+":57");
						arr.push((hour + 1).toString());
					}
				}
				return arr;
			}
			
			/**
			 * 填充时间
			 * @param index 填充第几行
			 * @param col 小时对应的列
			 * @param h 当前所在的时段
			 * @param timeArr 要填充的时间段
			 **/
			private function fillTimeLine(index:Number, col:Number, h:Number, timeArr:Array):void{
				for(var i:int = 0; i < timeArr.length; i++){
					var startTime:String = timeArr[i].startTime; //开始时间
					var endTime:String = timeArr[i].endTime; //结束时间
					var tickArr:Array = this.getTickArr(h, currentTime); //时间刻度数组
					var tickStart:String = tickArr[0]; //时间刻度第一个值
					var tickEnd:String = tickArr[tickArr.length-1]; //时间刻度最后一个值
					//分别获取到时间刻度开始和最后一个值的时和分
					var tickStartH:int = 0;
					var tickStartM:int = 0;
					var tickEndH:int = 0;
					var tickEndM:int = 0;
					if(tickStart.indexOf(":") != -1){
						tickStartH = int(tickStart.substring(0, tickStart.indexOf(":"))); //取第一个用来比较
						tickStartM = int(tickStart.substring(tickStart.indexOf(":") + 1, tickStart.length));
					} else{
						tickStartH = int(tickStart);
					}
					if(tickEnd.indexOf(":") != -1){
						tickEndH = int(tickEnd.substring(0, tickEnd.indexOf(":"))); //取第一个用来比较
						tickEndM = int(tickEnd.substring(tickEnd.indexOf(":") + 1, tickEnd.length));
					} else{
						tickEndH = int(tickEnd);
					}
					
					//开始刻度值的秒
					var startTickSecond:Number = tickStartH*3600 + tickStartM*60;
					//结束刻度值的秒
					var endTickSecond:Number = tickEndH*3600 + tickEndM*60;
					//开始时间转成date
					var startDate:Date = new Date(Number(startTime)*1000); 
					//开始时间的秒
					var startSecond:Number = startDate.hours*3600 + startDate.minutes*60 + startDate.seconds;
					//结束时间转成date
					var endDate:Date = new Date(Number(endTime)*1000); 
					//结束时间的秒
					var endSecond:Number = endDate.hours*3600 + endDate.minutes*60 + endDate.seconds;
					
					//时间轴的宽减去两像素的边框
					var timeLineWidth:Number = timeLine.width;
					//开始时间的位置
					var startPositon:Number = (timeLineWidth*(startSecond-startTickSecond))/(h*3600);
					//结束时间的位置
					var endPosition:Number = (timeLineWidth*(endSecond-startTickSecond))/(h*3600);
					
					//填充的属性
					var myMatrix:Matrix = new Matrix();;
					var colors:Array = [0x427530, 0x4C9230, 0x91CC7A];
					var alphas:Array = [1, 1, 1];
					var ratios:Array = [0, 122,255];
					
					var fillW:Number = 0; //需要填充的宽
					var fillX:Number = 0; //填充的位置
					if(startSecond >= startTickSecond && endSecond <= endTickSecond){ //起始结束时间都在刻度值内
						fillX = startPositon;
						fillW = endPosition - startPositon;
					} else if(startSecond < startTickSecond && endSecond > endTickSecond){ //起始结束时间分别在两侧
						fillX = 0; 
						fillW = timeLineWidth;
					} else if((startSecond >= startTickSecond && startSecond < endTickSecond) &&
						endSecond > endTickSecond){ //起始时间在,结束时间不在
						fillX = startPositon; 
						fillW = timeLineWidth- startPositon;
					} else if((startSecond < startTickSecond && endSecond > startTickSecond) &&
						endSecond <= endTickSecond){ //起始时间不在,结束时间在
						fillX = 0; 
						fillW = endPosition;
						if(endSecond >= endTickSecond){
							fillW = endPosition;
						}
					}
					myMatrix.createGradientBox(fillW, 20, 80, fillX, (20*index)+index);
					timeLine.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, myMatrix);
					timeLine.graphics.drawRect(fillX, (20*index)+index, fillW, 20);
					timeLine.graphics.endFill();
				}
			}
			
			protected function timeLine_clickHandler(event:MouseEvent):void
			{
				
			}
			
			private function drawTimeFrame(index:Number, time:String):void{
				var timeArr:Array = time.split(":");
				var timeSecond:Number = int(timeArr[0])*3600 + int(timeArr[1])*60 + int(timeArr[2]);
				var xPositon:Number = (timeSecond*timeLine.width)/(24*3600);
				var rightPostion:Number = timeLine.width - xPositon;
				var vRuleXPostion:Number = xPositon + 1;
				var timeXPosition:Number = xPositon + 5;
				var bgXPosition:Number = xPositon + 2;
				if(rightPostion < 100){
					//vRuleXPostion += 60;
					timeXPosition -= 60;
					bgXPosition -= 60;
				}
				var drawGroup:Group = Group(timeLine.getElementAt(index));
				drawGroup.graphics.clear();
				var uit:TextField = new TextField();
				uit.text = time;
				var txtFormat:TextFormat = new TextFormat("",14,0xFFFFFF,false);
				uit.setTextFormat(txtFormat);
				var bitmapdata:BitmapData = new BitmapData(60, 20, true, 0);
				bitmapdata.draw(uit);
				var matrix:Matrix = new Matrix(); 
				matrix.tx = timeXPosition; 
				matrix.ty = (20*index)+index; 
				drawGroup.graphics.beginBitmapFill(bitmapdata,matrix,false); 
				drawGroup.graphics.drawRect(timeXPosition, (20*index)+index, 60, 20);
				drawGroup.graphics.endFill(); 
				drawGroup.graphics.beginFill(0xD5F0CA, 0.3);
				drawGroup.graphics.drawRect(bgXPosition,(20*index)+index, 60, 20);
				drawGroup.graphics.endFill(); 
				drawGroup.graphics.lineStyle(2, 0XFFDF2B);
				drawGroup.graphics.moveTo(vRuleXPostion,(20*index)+index + 1);
				drawGroup.graphics.lineTo(vRuleXPostion, (20*index)+index+20-1);
				drawGroup.graphics.endFill(); 
			}
			
			protected function testClickHandler(event:MouseEvent):void
			{
				drawTimeFrame(int(event.currentTarget.label), "05:30:0");
				setInterval(function():void{
					var date:Date = new Date();
					if(mouseDownIndex == -1){
						drawTimeFrame(0, date.hours + ":" + date.minutes + ":" + date.seconds);
					}
				}, 1000);
			}
			
			private var mouseDownIndex:int = -1;
			protected function timeLineBg_mouseDownHandler(event:MouseEvent):void
			{
				var xPosition:Number = event.localX;
				var yPosition:Number = event.localY;
				mouseDownIndex = yPosition/20;
				var timeDrawGroup:Group = timeLine.getElementAt(mouseDownIndex) as Group;
				var timeSecond:int = (xPosition*24*3600)/timeLine.width;
				var h:int = timeSecond/3600;
				var mm:int = timeSecond%3600;
				var m:int = mm/60;
				var ss:int = m%60;
				var date:Date = new Date();
				drawTimeFrame(mouseDownIndex, h + ":" + m + ":" + ss);
			}
			
			protected function timeLineBg_mouseUpHandler(event:MouseEvent):void
			{
				if(mouseDownIndex == -1){
					return;
				}
				drawTimeFrame(mouseDownIndex, "05:30:0");
				mouseDownIndex = -1;
			}
			
		]]>
	</fx:Script>
	<s:BorderContainer id="timeLineBg" width="854" height="85" verticalCenter="0" horizontalCenter="0" 
					   backgroundColor="0x383f46" borderColor="0x272a2e" click="timeLine_clickHandler(event)"
					   mouseDown="timeLineBg_mouseDownHandler(event)">
		<s:Group id="timeLine" top="0" left="0" right="0" bottom="0">
			<s:Group id="timeFrameOne"/>
			<s:Group id="timeFrameTwo"/>
			<s:Group id="timeFrameThree"/>
			<s:Group id="timeFrameFour"/>
		</s:Group>
	</s:BorderContainer>
	
	<s:HGroup verticalCenter="70" horizontalCenter="0">
		<s:Button label="24h" click="changeHourShow(24, 3, 24)"/>
		<s:Button label="2h" click="changeHourShow(12, 3, 2)"/>
		<s:Button label="1h" click="changeHourShow(12, 3, 1)"/>
		<s:Button label="30m" click="changeHourShow(10, 3, 0.5)"/>
	</s:HGroup>
	
	<s:HGroup verticalCenter="95" horizontalCenter="0">
		<s:Button label="0" click="testClickHandler(event)"/>
		<s:Button label="1" click="testClickHandler(event)"/>
		<s:Button label="2" click="testClickHandler(event)"/>
		<s:Button label="3" click="testClickHandler(event)"/>
	</s:HGroup>
	
	<s:Button label="clear" verticalCenter="125" horizontalCenter="0" click="timeFrameTwo.graphics.clear();"/>
	
</s:Application>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值