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>
时间: 2024-11-12 17:19:21

Flex Graphics 画时间轴测试例子的相关文章

iOS时间轴的实现

最近项目需求,恰好要做一个时间轴,而iOS这方面时间轴的例子也比较少,我就把自己所做的例子和思路共享出来给大家,共同学习. 时间轴的具体实现效果如图1所示:  图1 第一步:看到这个图,我们想到的第一反应就是使用tableView或者CollectionView来完成,那么我这里使用的是tableView.首先,创建一个Single View Application项目,在Main.Storyboard里面拖入一个TableView(如图2所示),这里别忘记了把TableView的delegat

【真枪实干系列】Xibo-CMS-Layout关于时间轴优先级的测试

时间轴优先级 所有关于Xibo文章,均由柠檬加冰CSDN首发,欢迎大家支持原创 使用布局(Layout)的过程中,发现两个问题 背景区域如果不设置任何东西的话,那么布局的状态永远是个叉号,显示this layout is invalid and can not be scheduled,随便在背景区域(也就是创建布局后的默认区域)增加一个背景图,布局的状态就显示为正常,可预览 不同区域分别可以设定时间轴,时间轴的优先级顺序待定. 因此我们决定创建一个简单的布局,测试不同区域的时间轴对展示时间控制

20华丽的时间轴例子,寻找网页设计灵感

我敢肯定,你们中的大多数都知道在设计中使用时间轴的,尤其是 Facebook 个人主页改版成这样之后,这种风格更加流行.此外,像 Path 和 Tweetbot 也在一些智能手机应用程序使用基于时间轴的设计,以展示他们的故事.时间轴是显示一个整洁,准确风格事件的最佳途径. 您可能感兴趣的相关文章 25个以全屏照片为背景的精美网页作品 大背景图片在网页设计的20个精彩应用 20佳应用大照片做背景的优秀网站案例 大背景图片在网页设计的20个精彩应用 大背景在网页设计中应用的30优秀案例 iPhone

Android自定义View实现垂直时间轴布局

时间轴 时间轴,顾名思义就是将发生的事件按照时间顺序罗列起来,给用户带来一种更加直观的体验.京东和淘宝的物流顺序就是一个时间轴,想必大家都不陌生,如下图: 分析 实现这个最常用的一个方法就是用ListView,我这里用继承LinearLayout的方式来实现.首先定义了一些自定义属性: attrs.xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-stylea

可缩放时间轴和录像片段选择器的实现

最近的工作是做了两个自定义控件:①可以缩放的时间轴②吸附在在时间轴上有两个滑动按钮的录像片段选择器 真机测试效果如下面的gif动画所示: -------–最近更新 华丽丽的分割线---------由于很多小伙伴私信我要源码,所以最近整理了一下,放在github上了,地址:https://github.com/ljfxyj2008/ScalableTimebar-------–End of 最近更新--------- 在此记录一下设计原理和踩过的坑. 时间轴 时间轴分为两部分轴,刻度轴和录像片段轴

Android 类似时间轴的实现

想要实现图片中的的时间轴的效果,设定了三种颜色,但是出来的只有一个黑色,还不是设定好的,而且长度很长的话不能滚动,下面上代码: 布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android

Jquery实现的几款漂亮的时间轴

引言 最近项目中使用了很多前端的东西,对于我一个做后台开发的人员,这是一个很好的锻炼的机会.经过这段时间的学习,感觉前端的东西太多了,太强大了,做出来的东西太炫酷了.现在有很多开源的前端框架,做的都非常的漂亮,h5发展了这么多年了,改变了互联网行业啊!下面给大家介绍几款漂亮的时间轴,也许大家以后工作中会用到. 一.纵向折叠时间轴 1.js文件(jQuery.js或者jQuery.min.js) 2.CSS文件   3.HTML代码   4.运行效果: 二.纵向鼠标滑动时间轴 1.js文件(jqu

DevExpress之ChartControl实现时间轴实例 z

using System; using System.Data; using System.Windows.Forms; using DevExpress.XtraCharts; namespace DevExpressChart { public partial class winDateTime : Form { public winDateTime() { InitializeComponent(); } private void winDateTime_Load(object sende

timeline时间轴进度“群英荟萃”

timeline时间轴进度“群英荟萃” 是日,无论PC项目还是APP,都涉及到了通常称谓的“时间轴”UI展现布局.产品和设计师都喜欢横向.纵向的时间轴来传达产品的寓意.如此,如斯!总结一套 timeline时间轴 大家族的“群英荟萃”. 1.时间轴进度条-PC版 结构简单的如下: <div class="pub-wrap"> <ul class="pub-process"> <li class="active">