Flex简单画线组件

一眨眼一定到月底了,这个月的两篇作业还没做,为了证明我是个言而有信的人,临时抱佛脚补上两篇,晚点比没有强!

之前做项目的时候需要在UI上画一些虚线和直线,于是封装了这个Flex简单画线组件,实现在任意两点间画线,可以指定线型,颜色,粗细,虚线还可以指定线段长度和间隔。

具体实现不解释了,代码会说话。

package me.xuanfei.common.component
{
	import flash.display.CapsStyle;
	import flash.display.Shape;

	import mx.core.UIComponent;

	public class SimpleLine extends UIComponent
	{
		public static const SOLID:String = "solid";
		public static const DASH:String = "dash";

		private var _shape:Shape = new Shape();
		private var _type:String = SOLID;
		private var _x1:Number = 0;
		private var _y1:Number = 0;
		private var _x2:Number = 200;
		private var _y2:Number = 0;
		private var _thickness:Number = 0;
		private var _color:uint = 0x000000;

		private var _dashPattern:Array = [3, 2]

		public function SimpleLine()
		{
			super();
		}

		override protected function updateDisplayList(w:Number,h:Number):void{
			super.updateDisplayList(w,h);			

			_shape.graphics.lineStyle(thickness, color, 1, true, "normal", CapsStyle.NONE);
			_shape.graphics.moveTo(x1, y1);
			switch(type)
			{
				case SOLID:
					_shape.graphics.lineTo(x2, y2);
					break;
				case DASH:
					drawDash();
					break;
			}
			addChild(_shape);
		}  

		private function drawDash():void
		{
			var w:Number = x2 - x1;
			var h:Number = y2 - y1;
			var length:Number = Math.sqrt((w)*(w) + (h)*(h));

			var units:Number = length/(dashPattern[0]+dashPattern[1]);
			var dashSpaceRatio:Number = dashPattern[0]/(dashPattern[0]+dashPattern[1]);

			var dashW:Number = (w/units)*dashSpaceRatio;
			var spaceW:Number = (w/units)-dashW;
			var dashH:Number = (h/units)*dashSpaceRatio;
			var spaceH:Number = (h/units)-dashH;

			while (length > 0)
			{
				x1 += dashW;
				y1 += dashH;
				length -= dashPattern[0];
				if (length < 0)
				{
					x1 = x2;
					y1 = y2;
				}

				_shape.graphics.lineTo(x1, y1);
				x1 += spaceW;
				y1 += spaceH;
				_shape.graphics.moveTo(x1, y1);
				length -= dashPattern[1];
			}

			_shape.graphics.moveTo(x2, y2);
		}

		[Bindable]
		public function get type():String
		{
			return _type;
		}

		public function set type(value:String):void
		{
			_type = value;
		}

		[Bindable]
		public function get x1():Number
		{
			return _x1;
		}

		public function set x1(value:Number):void
		{
			_x1 = value;
		}

		[Bindable]
		public function get y1():Number
		{
			return _y1;
		}

		public function set y1(value:Number):void
		{
			_y1 = value;
		}

		[Bindable]
		public function get x2():Number
		{
			return _x2;
		}

		public function set x2(value:Number):void
		{
			_x2 = value;
		}

		[Bindable]
		public function get y2():Number
		{
			return _y2;
		}

		public function set y2(value:Number):void
		{
			_y2 = value;
		}

		[Bindable]
		public function get thickness():Number
		{
			return _thickness;
		}

		public function set thickness(value:Number):void
		{
			_thickness = value;
		}

		[Bindable]
		public function get color():uint
		{
			return _color;
		}

		public function set color(value:uint):void
		{
			_color = value;
		}		

		[Bindable]
		public function get dashPattern():Array
		{
			return _dashPattern;
		}

		public function set dashPattern(value:Array):void
		{
			_dashPattern = value;
		}
	}
}

在MXML中调用也很简单:

<comp:SimpleLine type=”dash” color=”#999999″ x2=”200″/>

这样就可以画一条200px宽的水平灰色虚线(comp是声明的Namespace)。

UIMovieClip动画在Flex中的位移问题

在界面效果复杂或者组件需要复杂的开场动画时,常常会在Flash中用时间轴或者Tween类制作动画,并发布为UIMovieClip组件,在Flex中引用。

由于Flex会自动计算UIMovieClip的大小,所以如果动画过程中Symbol有位移或者大小的变化,就会造成在Flex中显示的时候组件本身会发生连续位移。

第一反应是设置组件的explicitWidth和explicitHeight来固定大小,结果位移是没有了,但是动画过程中,原件会不断的缩放。

解决这个问题,我采用的方法是在Flash中加入一层透明的图形填充来标示实际的组件大小,这样Flex中组件的大小就固定了。

这个方法比较Dirty,如果你有更好的方法,欢迎留言!

大件事——Flash能被搜索的日子不远了

Adobe今天宣布将与Google和Yahoo合作推进Flash内容的搜索。Adobe将提供优化的Flash Player技术给Google和Yahoo来加强搜索引擎索引SWF文件的能力。Google和Yahoo的搜索爬虫将能够捕捉动态Flash内容。

对于Flex应用开发者来说,SEO一直是一块心病,这个消息的宣布无疑是一针强心剂,对RIA业界会是很大的震动。而且Adobe承诺现有的Flash内容不需要做任何修改就可以被搜索到。

相信M$面对这个消息一定会做出反应,Live Search什么时候能搜索SilverLight内容呢?

Adobe Thermo 将为RIA设计和开发建立桥梁

Thermo
Thermo是Adobe即将推出的新产品,目标是让设计师能够更加容易的为RIA创建UI。Thermo让设计师可以在熟悉的工作流上可视化的建立应用,开发者可以直接基于设计师的工作在Flex builder中进行进一步的开发和产品化。

主要功能包括:

  • 使用绘图工具创建图形、应用线框图或处理从Adobe CS套件中导入的artwork
  • 将从Adobe Photoshop/Illustrator/Fireworks导入的artwork直接专成可工作的组件,artwork成为skin(听起来真不错!)
  • 不用写code就可以定义和包装交互行为
  • 不需要访问真实数据库就可以方便的设计动态数据的UI, 例如联系人列表和产品信息,当放在应用里时,样本数据能被用作为placeholder便于交互测试和行为设计

具体细节未知,看起来这套工具可以大大提高RIA开发的Productivity,不过我有个疑问,将来在RIA设计和开发中Flash将扮演什么样的角色?也许在Flash 10和Thermo推出以后就可以真相大白了吧。

ActionScript Toolkit for Rich Applications From Yahoo

ASTRA(ActionScript Toolkit for Rich Applications)是Yahoo Flash Developer Center推出的一系列FlashFlex组件和代码库。包含了和各种常用的UI组件和AutoComplete等很有用的交互类。

Flash Developer们赶快下载吧,如果Microsoft收购Yahoo,第一件事估计就是把Flash Developer Center换成SilverLight Developer Center…

M$,阿弥陀…你的…佛!