代码改变世界

FP10.2 の Mouse Cursor

2010-12-07 17:53  hbb  阅读(774)  评论(2编辑  收藏  举报

玩了一下最新的FP10.2支持的自定义鼠标指针,结果发现我又想的太美好了...orz

 

相关类

flash.ui.Mouse;
flash.ui.MouseCursor;
flash.ui.MouseCursorData;

 

MouseCursor是一个枚举类,包含几个常量的 ARROW, AUTO, BUTTON, HAND, IBEAM。这些从字面就知道什么意思了。

自定义的部分,封装在MouseCursorData里,它包含一个data,数据类型是Vector.<BitmapData>....所以看到了吧,是一个位图序列,不是随便拿个MovieClip过来就行的...

这个类还包含frameRate和hotPoint,从字面不难理解。其实整个就像一个GIF。

 

然而,这个GIF当然也不是无限制的。大小不得超过32x32,透明不透明倒是没限制(不透明就无语了)。

 

知道了这些限制以后,就很简单了。
Mouse.registerCursor/unregisterCursor,就是用来注册和注销自定义指针的,通过一个 String 来映射一个 MouseCursorData。重复定义不会报错,但会覆盖。

使用的时候,直接 Mouse.curosr = REGISTER_CURSOR_NAME 即可,如果该name还没被注册会报错,cursor不变。

 

package  
{
	import flash.display.BitmapData;
	import flash.geom.Matrix;
	import flash.ui.Mouse;
	import flash.ui.MouseCursor;
	import flash.ui.MouseCursorData;
	/**
	 * ...
	 * @author hbb
	 */
	public class CursorManager 
	{
		public static const DICE	:String = 'dice';
		public static const ARROW	:String = MouseCursor.ARROW;
		public static const AUTO	:String = MouseCursor.AUTO;
		public static const BUTTON	:String = MouseCursor.BUTTON;
		public static const HAND	:String = MouseCursor.HAND;
		public static const IBEAM	:String = MouseCursor.IBEAM;
		
		[Embed(source = '../lib/0000.jpg')] private const Dice0:Class;
		[Embed(source = '../lib/0001.jpg')] private const Dice1:Class;
		[Embed(source = '../lib/0002.jpg')] private const Dice2:Class;
		[Embed(source = '../lib/0003.jpg')] private const Dice3:Class;
		[Embed(source = '../lib/0004.jpg')] private const Dice4:Class;
		[Embed(source = '../lib/0005.jpg')] private const Dice5:Class;
		[Embed(source = '../lib/0006.jpg')] private const Dice6:Class;
		[Embed(source = '../lib/0007.jpg')] private const Dice7:Class;
		[Embed(source = '../lib/0008.jpg')] private const Dice8:Class;
		[Embed(source = '../lib/0009.jpg')] private const Dice9:Class;
		
		public static const instance:CursorManager = new CursorManager(CursorManagerLock);
		
		public function CursorManager(lock:Class) 
		{
			if (lock === CursorManagerLock)
			{
				init();
			}
			else
			{
				throw new ArgumentError('CursorManager is a Singleton');
			}
		}
		
		private function init():void 
		{
			var vb:Vector.<BitmapData> = new Vector.<BitmapData>();
			vb[0] = fixBitmapData(new Dice0().bitmapData);
			vb[1] = fixBitmapData(new Dice1().bitmapData);
			vb[2] = fixBitmapData(new Dice2().bitmapData);
			vb[3] = fixBitmapData(new Dice3().bitmapData);
			vb[4] = fixBitmapData(new Dice4().bitmapData);
			vb[5] = fixBitmapData(new Dice5().bitmapData);
			vb[6] = fixBitmapData(new Dice6().bitmapData);
			vb[7] = fixBitmapData(new Dice7().bitmapData);
			vb[8] = fixBitmapData(new Dice8().bitmapData);
			vb[9] = fixBitmapData(new Dice9().bitmapData);
			vb.fixed = true;
			
			var md:MouseCursorData = new MouseCursorData();
			md.data = vb;
			md.frameRate = 12;
			
			Mouse.registerCursor( DICE, md );
		}
		
		private function fixBitmapData(bd:BitmapData):BitmapData
		{
			var out:BitmapData
			
			const limit:int = 32;
			if (bd.width > limit || bd.height > limit)
			{
				var mat:Matrix = new Matrix();
				if (bd.width > bd.height) mat.scale(limit / bd.width, limit / bd.width);
				else mat.scale(limit / bd.height, limit / bd.height);
				out = new BitmapData(32, 32, bd.transparent, 0);
				out.draw(bd, mat);
			}
			else out = bd;
			
			return out;
		}
		
	}

}

class CursorManagerLock{}

 

 

package  
{
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.filters.DropShadowFilter;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.ui.Mouse;
	
	/**
	 * ...
	 * @author hbb
	 */
	[SWF(width = "1280", height = "720", backgroundColor = "#999999", frameRate = "24")]
	public class CustomCursorDemo extends AbstractDemo 
	{
		
		override protected function init():void 
		{
			var x:Number = 50;
			var y:Number = 50;
			var hgap:Number = 350;
			var vgap:Number = 300;
			createArea(CursorManager.ARROW,  x,            y       );
			createArea(CursorManager.AUTO,   x + hgap,     y       );
			createArea(CursorManager.BUTTON, x + hgap * 2, y       );
			createText(500, y + vgap - 80);
			createArea(CursorManager.DICE,   x,            y + vgap);
			createArea(CursorManager.HAND,   x + hgap,     y + vgap);
			createArea(CursorManager.IBEAM,  x + hgap * 2, y + vgap);
			
			addEventListener(MouseEvent.MOUSE_OVER, onOver);
		}
		
		private function onOver(e:MouseEvent):void 
		{
			log('target:'+e.target.name, true);
			try{
				Mouse.cursor = e.target.name;
				log('cursor:' + Mouse.cursor);
			}catch (er:Error) {
				log('error:' +  er.message);
			}
		}
		
		private function log(msg:String, clear:Boolean = false):void
		{
			if (clear) TextField(getChildByName('logTxt')).text = '';
			TextField(getChildByName('logTxt')).appendText(msg + '\n');
		}
		
		private function createText(x:Number, y:Number):TextField
		{
			var tf:TextField = new TextField();
			tf.name = 'logTxt';
			tf.text = '';
			tf.autoSize = TextFieldAutoSize.LEFT;
			tf.width = 200;
			tf.height = 50;
			tf.x = x;
			tf.y = y;
			addChild(tf);
			return tf;
		}
		
		private function createArea(name:String, x:Number, y:Number):Sprite
		{
			var cont:Sprite = new Sprite();
			
			var border:Shape = new Shape();
			border.graphics.clear();
			border.graphics.beginFill(0xefefef);
			border.graphics.drawRoundRect(0, 0, 320, 180, 8, 8);
			border.graphics.endFill();
			
			var tf:TextField = new TextField();
			tf.name = name + '_txt';
			tf.text = name.toUpperCase();
			tf.multiline = false;
			tf.autoSize = TextFieldAutoSize.LEFT;
			tf.x = (border.width - tf.width) * .5;
			tf.y = (border.height - tf.height ) * .5;
			
			cont.addChild(border);
			cont.addChild(tf);
			cont.name = name;
			cont.filters = [ new DropShadowFilter(4, 60, 0x0, 1, 8, 8) ];
			cont.x = x;
			cont.y = y;
			//cont.mouseChildren = false;
			addChild(cont);
			
			return cont;
		}
		
	}

}

 

 

DEMO下载:http://www.uudisc.com/filedownload?user=faseer&id=3744027

配置FD:http://blog.onebyonedesign.com/actionscript/flash-player-10-2-with-flashdevelop-and-a-quick-cursor-manager/

配置FB:http://www.swfgeek.net/2010/12/04/using-flash-player-10-2-in-fdt4/

Beta SDK(4.5.0.18623):http://opensource.adobe.com/wiki/display/flexsdk/download?build=4.5.0.18623&pkgtype=1

FP10.2:http://labs.adobe.com/downloads/flashplayer10.html