FP10.2 の Mouse Cursor
2010-12-07 17:53 hbb 阅读(794) 评论(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
浙公网安备 33010602011771号