做整站的時候經常要用到屏幕適應,直接用stage的話,每次都要addEventListener!
有了這個類,只要使用
addFitObject(targetSprite,"center");//topleft,topcenter,topright,left,center,right,bottomleft,bottomcenter,bottomright
就可以居中了。
但是這樣有時候還不夠,我們需要在中心點的位置始終向左上偏移50像素該怎麼辦
就可以這樣用
addFitObject(targetSprite,"center",new Point(-50,-50));
有時候我們仍然需要獲取stage的事件
addEventListener("onStageFited",yourFunction);
有時候我們需要不斷對層級進行轉換,例如父sprite使用center,對其子sprite使用topleft,但是在通常情況下,子sprite的坐標需要轉換到globe才行。
這裡只要使用
addFitObject(targetSprite,"center",new Point(-50,-50),targetSpriteParent);//targetSpriteParent為displayObject,設置為null或者this都指向當前層
但是請注意,如果父,子sprite都使用addFitObject的話,父的執行順序必須高於子的執行順序
還有時候我們需要針對變化過位置的某一個sprite使用事件,在這個Sprite變化完成之後觸發一個方法
就可以這樣用
addFitObject(targetSprite,"center",null,null,targetFunction);//targetFunction:Function
該類使用的是單例模式,請使用getInstance()

程序代碼
package org
{
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.display.Stage;
import flash.display.StageScaleMode;
import flash.display.StageAlign;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.geom.Point;
import flash.errors.IllegalOperationError;
/**
* ...
* @author ezshine
*/
public class FitStage extends Sprite
{
private static var _singleton:Boolean=true;
private static var _instance:FitStage;
private var theStage:Stage;
private var FitObjectArray:Array;
public function FitStage() {
if (_singleton) {
throw new Error("請使用getInstance()來獲取實例");
}
}
public function setStage(_st:Stage)
{
if (theStage==null)
{
theStage = _st;
FitObjectArray = new Array();
theStage.align = StageAlign.TOP_LEFT;
theStage.scaleMode = StageScaleMode.NO_SCALE
theStage.showDefaultContextMenu = false;
theStage.addEventListener(Event.RESIZE, onStageResize);
}
}
public function addFitObject(...args):void//
{
if (args.length<2)
{
return;
}
var _t:DisplayObject =args[0];//displayObject
var _a:String = args[1];//_a:topleft,topcenter,topright,left,center,right,bottomleft,bottomcenter.bottomright
var offsetPoint:Point = args[2];//offset point
var parentObject:DisplayObject = args[3];//function name string
var refunc:Function = args[4];//function name string
var tobject:Object={t:_t,a:_a};
if (offsetPoint)
{
tobject.o=offsetPoint;
}
if (parentObject)
{
tobject.p = parentObject;
}
if (args[4]!=null)
{
tobject.r={runfunc:refunc};
}
if (parseFloat(checkTheSame(_t).toString())>=0)
{
FitObjectArray[checkTheSame(_t)] = tobject;
}else{
FitObjectArray.push(tobject);
}
onStageResize(new Event("active"));
}
private function checkTheSame(_t:DisplayObject)
{
for (var i:Number = 0; i <FitObjectArray.length; i++)
{
if (FitObjectArray[i].t==_t)
{
return i;
break;
}
}
return false;
}
public function removeFitObject(_t:DisplayObject)//_a:topleft,topcenter,topright,left,center,right,bottomleft,bottomcenter.bottomright
{
for (var i:Number = 0; i <FitObjectArray.length; i++)
{
if (FitObjectArray[i].t==_t)
{
FitObjectArray.splice(i,1);
break;
}
}
}
public static function getInstance():FitStage
{
if (!_instance) {
_singleton=false;
_instance=new FitStage();
_singleton=true;
}
return _instance;
}
private function onStageResize(e:Event)
{
for (var i:Number = 0; i <FitObjectArray.length; i++)
{
var offsetx:Number = 0;
var offsety:Number = 0;
if(FitObjectArray[i].o){
offsetx=FitObjectArray[i].o.x;
offsety=FitObjectArray[i].o.y;
}
var nextx:Number;
var nexty:Number;
switch(FitObjectArray[i].a)
{
case "topleft":
nextx = 0;
nexty = 0;
break;
case "topcenter":
nextx = Math.round(theStage.stageWidth / 2);
nexty = 0;
break;
case "topright":
nextx = theStage.stageWidth;
nexty = 0;
break;
case "left":
nextx = 0;
nexty = Math.round(theStage.stageHeight / 2);
break;
case "center":
nextx = Math.round(theStage.stageWidth / 2);
nexty = Math.round(theStage.stageHeight / 2);
break;
case "right":
nextx = theStage.stageWidth;
nexty = Math.round(theStage.stageHeight / 2);
break;
case "bottomleft":
nextx = 0;
nexty = theStage.stageHeight;
break;
case "bottomcenter":
nextx = Math.round(theStage.stageWidth / 2);
nexty = theStage.stageHeight;
break;
case "bottomright":
nextx = theStage.stageWidth;
nexty = theStage.stageHeight;
break;
}
if (FitObjectArray[i].p)
{
var parentPoint:Point = new Point(Math.round(FitObjectArray[i].p.x), Math.round(FitObjectArray[i].p.y));
localToGlobal(parentPoint)
nextx -= parentPoint.x;
nexty -= parentPoint.y;
}
FitObjectArray[i].t.x = nextx+ offsetx;
FitObjectArray[i].t.y = nexty+ offsety;
if (FitObjectArray[i].r)
{
FitObjectArray[i].r.runfunc();
}
}
getInstance().dispatchEvent(new Event("onStageFited"));
}
public function getFitObjectList():Array
{
return FitObjectArray;
}
}
}
使用方法····
import org.FitStage;//導入類
var myStage:FitStage = FitStage.getInstance();//獲取實例
myStage.setStage(this.stage);//寫入Stage,因為Stage只能存在於已經在場景中的個體,所以請設置一次之後(將場景賦予)再使用後面的方法。