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
配置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