这个类是做某个游戏皮肤用到的,功能大致等同于用元数据标签Embed,而且比它还要繁琐一些。
SkinUtil.as
package com.thornbird.utils
{
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Graphics;
import flash.filters.GlowFilter;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
public class SkinUtil
{
public static function drawScaleGrid(g:Graphics, x:Number, y:Number,
width:Number, height:Number, bitmapData:BitmapData,
scaleGrid:Rectangle = null, repeat:Boolean = false):void
{
var w:Number = bitmapData.width;
var h:Number = bitmapData.height;
var matrix:Matrix = null;
if (scaleGrid == null)
{
matrix = new Matrix();
if (!repeat)
matrix.createBox(width / w, height / h, 0, x, y);
g.beginBitmapFill(bitmapData, matrix, false, repeat);
g.drawRect(x, y, width, height);
g.endFill();
return;
}
var l:Number = scaleGrid.left;
var r:Number = scaleGrid.right;
var t:Number = scaleGrid.top;
var b:Number = scaleGrid.bottom;
var origin:Point = new Point(0, 0);
var topLeft:BitmapData = null;
if (l > 0 && t > 0)
topLeft = new BitmapData(l, t, true, 0);
var topRight:BitmapData = null;
if (w - r > 0 && t > 0)
topRight = new BitmapData(w - r, t, true, 0);
var bottomLeft:BitmapData = null;
if (l > 0 && h - b > 0)
bottomLeft = new BitmapData(l, h - b, true, 0);
var bottomRight:BitmapData = null;
if (w - r > 0 && h - b > 0)
bottomRight = new BitmapData(w - r, h - b, true, 0);
var left:BitmapData = null;
if (l > 0 && b - t > 0)
left = new BitmapData(l, b - t, true, 0);
var right:BitmapData = null;
if (w - r > 0 && b - t > 0)
right = new BitmapData(w - r, b - t, true, 0);
var top:BitmapData = null;
if (r - l > 0 && t > 0)
top = new BitmapData(r - l, t, true, 0);
var bottom:BitmapData = null;
if (r - l > 0 && h - b > 0)
bottom = new BitmapData(r - l, h - b, true, 0);
var center:BitmapData = null;
if (r - l > 0 && b - t > 0)
center = new BitmapData(r - l, b - t, true, 0);
var scaleX:Number = 1;
var scaleY:Number = 1;
if (topLeft != null)
topLeft.copyPixels(bitmapData, new Rectangle(0, 0, l, t), origin);
if (topRight != null)
topRight.copyPixels(bitmapData, new Rectangle(r, 0, w - r, t), origin);
if (bottomLeft != null)
bottomLeft.copyPixels(bitmapData, new Rectangle(0, b, l, h - t), origin);
if (bottomRight != null)
bottomRight.copyPixels(bitmapData, new Rectangle(r, b, w - r, h - b), origin);
if (left != null)
left.copyPixels(bitmapData, new Rectangle(0, t, l, b - t), origin);
if (right != null)
right.copyPixels(bitmapData, new Rectangle(r, t, w - r, b - t), origin);
if (top != null)
top.copyPixels(bitmapData, new Rectangle(l, 0, r - l, t), origin);
if (bottom != null)
bottom.copyPixels(bitmapData, new Rectangle(l, b, r - l, h - b), origin);
if (center != null)
center.copyPixels(bitmapData, new Rectangle(l, t, r - l, b - t), origin);
matrix = new Matrix();
if (topLeft != null)
{
matrix.createBox(scaleX, scaleY, 0, x, y);
g.beginBitmapFill(topLeft, matrix, false, true);
g.drawRect(x, y, l, t);
g.endFill();
}
if (topRight != null)
{
matrix.createBox(scaleX, scaleY, 0, x + width - (w - r), y);
g.beginBitmapFill(topRight, matrix, false, true);
g.drawRect(x + width - (w - r), y, w - r, t);
g.endFill();
}
if (bottomLeft != null)
{
matrix.createBox(scaleX, scaleY, 0, x, y + height - (h - b));
g.beginBitmapFill(bottomLeft, matrix, false, true);
g.drawRect(x, y + height - (h - b), l, h - b);
g.endFill();
}
if (bottomRight != null)
{
matrix.createBox(scaleX, scaleY, 0, x + width - (w - r), y + height - (h - b));
g.beginBitmapFill(bottomRight, matrix, false, true);
g.drawRect(x + width - (w - r), y + height - (h - b), w - r, h - b);
g.endFill();
}
scaleX = 1;
scaleY = repeat ? 1 : (height - t - (h - b)) / (b - t);
if (left != null)
{
matrix.createBox(scaleX, scaleY, 0, x, y + t);
g.beginBitmapFill(left, matrix, repeat, true);
g.drawRect(x, y + t, l, height - t - (h - b));
g.endFill();
}
if (right != null)
{
matrix.createBox(scaleX, scaleY, 0, x + width - (w - r), y + t);
g.beginBitmapFill(right, matrix, repeat, true);
g.drawRect(x + width - (w - r), y + t, w - r, height - t - (h - b));
g.endFill();
}
scaleX = repeat ? 1 : (width - l - (w - r)) / (r - l);
scaleY = 1;
if (top != null)
{
matrix.createBox(scaleX, scaleY, 0, x + l, y);
g.beginBitmapFill(top, matrix, repeat, true);
g.drawRect(x + l, y, width - l - (w - r), t);
g.endFill();
}
if (bottom != null)
{
matrix.createBox(scaleX, scaleY, 0, x + l, y + height - (h - b));
g.beginBitmapFill(bottom, matrix, repeat, true);
g.drawRect(x + l, y + height - (h - b), width - l - (w - r), h - b);
g.endFill();
}
scaleX = repeat ? 1 : (width - l - (w - r)) / (r - l);
scaleY = repeat ? 1 : (height - t - (h - b)) / (b - t);
if (center != null)
{
matrix.createBox(scaleX, scaleY, 0, x + l, y + t);
g.beginBitmapFill(center, matrix, repeat, true);
g.drawRect(x + l, y + t, width - l - (w - r), height - t - (h - b));
g.endFill();
}
}
public static function drawOutline(object:Object, color:Number, alpha:Number):void
{
if (!(object is DisplayObject) || isNaN(color))
return;
if (color < 0x000000 || color > 0xFFFFFF)
return;
if (isNaN(alpha))
alpha = 0.8;
object.filters = [];
object.filters = [new GlowFilter(color, alpha, 2, 2, 80)];
}
}
}
这是一个调用示例:
ButtonSkin.as
package com.thornbird.skins.halo
{
import com.thornbird.utils.SkinUtil;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.filters.GlowFilter;
import flash.geom.Rectangle;
import mx.core.IUITextField;
import mx.core.mx_internal;
import mx.skins.halo.ButtonSkin;
use namespace mx_internal;
public class ButtonSkin extends mx.skins.halo.ButtonSkin
{
[Embed(source="../../../../../assets/images/button_up.png")]
private static var ButtonUp:Class;
private static var buttonUpBitmap:Bitmap = null;
[Embed(source="../../../../../assets/images/button_over.png")]
private static var ButtonOver:Class;
private static var buttonOverBitmap:Bitmap = null;
[Embed(source="../../../../../assets/images/button_down.png")]
private static var ButtonDown:Class;
private static var buttonDownBitmap:Bitmap = null;
[Embed(source="../../../../../assets/images/button_disabled.png")]
private static var ButtonDisabled:Class;
private static var buttonDisabledBitmap:Bitmap = null;
protected var drawFocusFlag:Boolean = true;
protected var focusIn:Boolean = false;
override protected function updateDisplayList(w:Number, h:Number):void
{
var bitmapData:BitmapData = null;
switch (name)
{
case "selectedUpSkin":
case "upSkin":
if (buttonUpBitmap == null)
buttonUpBitmap = new ButtonUp() as Bitmap;
bitmapData = buttonUpBitmap.bitmapData;
break;
case "selectedOverSkin":
case "overSkin":
if (buttonOverBitmap == null)
buttonOverBitmap = new ButtonOver() as Bitmap;
bitmapData = buttonOverBitmap.bitmapData;
break;
case "selectedDownSkin":
case "downSkin":
if (buttonDownBitmap == null)
buttonDownBitmap = new ButtonDown() as Bitmap;
bitmapData = buttonDownBitmap.bitmapData;
break;
case "selectedDisabledSkin":
case "disabledSkin":
if (buttonDisabledBitmap == null)
buttonDisabledBitmap = new ButtonDisabled() as Bitmap;
bitmapData = buttonDisabledBitmap.bitmapData;
break;
}
graphics.clear();
if (bitmapData != null)
SkinUtil.drawScaleGrid(graphics, 0, 0, w, h, bitmapData,
new Rectangle(9, 6, 68, 11));
if (name.toLowerCase().indexOf("disabled") < 0)
SkinUtil.drawOutline(getTextField(), getStyle("outlineColor"),
getStyle("outlineAlpha"));
}
protected function getTextField():IUITextField
{
var textField:IUITextField = null;
if (parent)
{
for (var i:int = 0; i < parent.numChildren; i++)
{
var child:DisplayObject = parent.getChildAt(i);
if (child is IUITextField)
{
textField = child as IUITextField;
break;
}
}
}
return textField;
}
}
}