顯示具有 DisplayObjectContainer 標籤的文章。 顯示所有文章
顯示具有 DisplayObjectContainer 標籤的文章。 顯示所有文章

2011年6月8日 星期三

深度交換_DisplayObjectContainer.swapChildrenAt()

swapChildrenAt(index1:int, index2:int)
在子清單的兩個指定索引位置,替換子物件的 z 順序 (深度階層,由前至後順序)。
UIScrollBar
UIScrollBar.scrollPosition = UIScrollBar.maxScrollPosition;
scrollPosition : 會取得或設定目前的捲動位置,並更新縮圖的位置。
maxScrollPosition : 會取得或設定代表最高捲動位置的數字。
UIScrollBar.update();
會強制捲軸立即更新其捲動屬性。

※此例, 點擊舞台,透過 swapChildrenAt()方法, 物件bbb與ccc交換深度,右邊TextField文字欄位info會呈現bbb與ccc深度上下順序. (文字欄位中, 先trace低索引, 再trace高索引)
※UIScrollBar捲軸被附加綁定到info文字欄位上,當字串資料超出欄位底部,捲軸將持續捲至捲動最大值位置並更新畫面,以便閱讀最新字串訊息.

1000608_displayObjectContainer.swapChildrenAt.swf


import fl.controls.UIScrollBar;
import fl.controls.ScrollBarDirection;

var vScrollBar:UIScrollBar = new UIScrollBar();
this.setInfoTF();
this.createUIScrollBar();

trace("this.numChildren : " + this.numChildren);
this.addInfo("this.numChildren : " + this.numChildren);
this.getSpriteIndex();

this.stage.addEventListener(MouseEvent.MOUSE_DOWN,swap);
function swap(event:MouseEvent):void {
 /*深度交換*/
 this.swapChildrenAt(this.getChildIndex(bbb),this.getChildIndex(ccc));
 trace("****************");
 this.getSpriteIndex();
}

/*取得為Sprite類別物件且不為UIScrollBar 的實體*/
/*UIScrollBar 繼承自Sprite → UIScrollBar →ScrollBar →UIComponent →Sprite*/
function getSpriteIndex():void {
 for (var i:uint=0; i < this.numChildren; i++) {
  if (this.getChildAt(i) is Sprite && !(this.getChildAt(i) is UIScrollBar)) {
   trace("索引 " + i + " : " + this.getChildAt(i).name);
   addInfo("索引 " + i + " : " + this.getChildAt(i).name);
  }
 }
 addInfo("**************");
 /*強制捲軸立即更新其捲動屬性。 - 重要,否則捲軸拖曳Bar會不見*/
 this.vScrollBar.scrollPosition = this.vScrollBar.maxScrollPosition;
 trace(this.vScrollBar.scrollPosition);
 this.vScrollBar.update();
 return;
}

/*設置info動態文字欄位屬性*/
function setInfoTF():void {
 var format:TextFormat = new TextFormat();
 format.color = 0x000000;
 this.info.selectable = true;
 this.info.wordWrap = true;
 /*autoSize屬性不能開, 否則捲軸會不正常*/
 /*this.info.autoSize = TextFieldAutoSize.LEFT;*/
 this.info.setTextFormat(format);
 this.info.defaultTextFormat = format;
 return;
}

/*附加字串至TextField 欄位目前字串之後*/
function addInfo(_obj:*):void {
 this.info.appendText(_obj.toString() + "\n");
 return;
}

/*初始定義UIScrollBar屬性*/
function createUIScrollBar():void{
 this.vScrollBar = new UIScrollBar();
 this.vScrollBar.direction = ScrollBarDirection.VERTICAL;
 this.vScrollBar.scrollTarget = info;
 this.vScrollBar.move(info.x + info.width + 10, info.y);
 this.vScrollBar.height = info.height;
 this.addChild(vScrollBar);
 return;
}

交換深度_DisplayObjectContainer.swapChildren()

swapChildren(child1:DisplayObject, child2:DisplayObject):void

替換兩個指定子物件的 z 順序 (深度階層,由前至後順序)。

※簡單實例:點擊舞台stage, 舞台上兩物件ccc與bbb交換深度

1000608_displayObjectContainer_1.swf


this.stage.addEventListener(MouseEvent.MOUSE_DOWN,swap);
function swap(event:MouseEvent):void{
this.swapChildren(ccc,bbb);
}



DisplayObjectContainer.getObjectsUnderPoint()方法_取得指定point座標上的物件

getObjectsUnderPoint()方法
public function getObjectsUnderPoint(point:Point):Array
傳回位於指定點底下,且屬於此 DisplayObjectContainer 實體之子系 (或孫系,以下類推) 的物件陣列。

※此例, 以DisplayObjectContainer.getObjectsUnderPoint()方法, 取得與(200,200)座標重疊的物件陣列.
※aaa、bbb、ccc三個Shape物件配置於元件庫中, 並分別與外部extends Sprite的三個類別AAA、BBB、CCC綁定

1000607_getObjectsUnderPoint.swf


※ trace出來的結果 :
[object Shape],[object Shape],[object TextField]
0 : instance3 : [object Shape]
1 : instance9 : [object Shape]
2 : instance10 : [object TextField]

package  {
 
 import flash.display.MovieClip;
 import flash.geom.Point;
 import flash.display.DisplayObjectContainer;
 import flash.display.Sprite;
 
 public class getObjectsUnderPoint_1000607 extends MovieClip {
  
  public var container:Sprite;
  public var aaa:Sprite;
  public var bbb:Sprite;
  public var ccc:Sprite;
  private var point:Point;
  
  public function getObjectsUnderPoint_1000607() {
   this.container = new Sprite();
   this.addChild(this.container);
   this.createObjects();
   this.point = new Point(200,200);
   var objectsArr:Array = this.getInfo(this.point);
   this.showInfo(objectsArr);
   return;
  }
  
  private function showInfo(_objectsArr:Array):void{
   trace(_objectsArr);
   for (var i:String in _objectsArr){
    trace(i + " : " + _objectsArr[i].name + " : " + _objectsArr[i]);
   }
   /*trace結果
    [object Shape],[object Shape],[object TextField]
    0 : instance3 : [object Shape]
    1 : instance9 : [object Shape]
    2 : instance10 : [object TextField]*/
   return;
  }
  
  private function createObjects():void{
   this.aaa = this.setObjects(aaa,AAA,264,226);
   this.bbb = this.setObjects(bbb,BBB,350,158);
   this.ccc = this.setObjects(ccc,CCC,188,154);
   return;
  }
  
  private function setObjects(_instance:*,_class:Class,_xPos:Number,_yPos:Number):Sprite{
   _instance = new _class();
   _instance.x = _xPos;
   _instance.y = _yPos;
   _instance.name = _instance.toString();
   this.container.addChild(_instance);
   /*trace(_instance);*/
   return _instance;
  }
  
  private function getInfo(_point:Point):Array{
   var objectsArr:Array = this.getObjectsUnderPoint(_point);
   return objectsArr;
  }
 }
 
}

2010年12月8日 星期三

[AS3] DisplayObjectContainer.addChild()方法、removeChild()方法

addChild(child:DisplayObject):DisplayObject
將 DisplayObject 子實體加入至此 DisplayObjectContainer 實體。
removeChild(child:DisplayObject):DisplayObject
將指定的 child DisplayObject 實體從 DisplayObjectContainer 實體的子清單中移除。


Sprite類別實體aaa使用graphics屬性繪製了三角形,並加入顯示清單而為Sprite類別實體container的子物件。以 Switch_btn 切換呼叫 addChild() 和 removeChid(),將aaa 加入和移除。



991208_DisplayObjectContainer.addChild、removeChild_2.fla


import flash.display.Sprite;
//
var container:Sprite = new Sprite();
addChild(container);
//
var flag:Boolean = true;
var aaa:Sprite = new Sprite();
aaa.graphics.lineStyle(10, 0xFF2255, 1, false, LineScaleMode.VERTICAL, CapsStyle.NONE, JointStyle.MITER, 10);
aaa.graphics.beginFill(0xffaa00);
aaa.graphics.moveTo(50, 50);
aaa.graphics.lineTo(520, 160);
aaa.graphics.lineTo(320, 300);
aaa.graphics.lineTo(50, 50);
aaa.graphics.endFill();
container.addChild(aaa);
//
switch_btn.buttonMode = true;
switch_btn.addEventListener(MouseEvent.CLICK, removeSprite);
function removeSprite(e:MouseEvent):void{
 if (flag){
  container.removeChild(aaa);
  flag = false;
 }else{
  container.addChild(aaa);
  flag = true;
 }
 //remove_btn.removeEventListener(MouseEvent.CLICK, removeSprite);
}




試著將切換用的按鈕switch_btn當作內嵌資源類別來使用,從舞台上刪除,並從元件庫來做設定,為SwitchBtn類別
switch_btn的label文字也配合切換,以TextField類別實體來做動態處理



991208_DisplayObjectContainer.addChild、removeChild_3.fla


import flash.display.Sprite;
import flash.text.TextField;
import flash.display.MovieClip;
import flash.text.TextFormat;

//建構TextFormat類別實體指定給myTextFormat,設定myTextFormat的屬性值
var myTextFormat:TextFormat = new TextFormat();
with(myTextFormat){
 color = 0x000066;
 size = 16;
 font = "Lucida Fax";
 bold = true;
}

//建構TextField類別實體指定給labelTf
var labelTf:TextField = new TextField();
//設定labelTf的各屬性值
with(labelTf){
 x = -50;
 y = -10;
 width = 100;
 autoSize = TextFieldAutoSize.CENTER;
 //multiline = true;
 //wordWrap = true;
 defaultTextFormat = myTextFormat;
 text = "removeChild";
}

//建構Sprite類別實體指定給container,做為aaa的容器物件,附加到主時間軸上
var container:Sprite = new Sprite();
addChild(container);

//建構内建資源類別SwitchBtn類別的實體,並指定給MovieClip資料型別的Switch_btn
//内建資源類別SwitchBtn類別的基底類別為MovieClip類別
var switch_btn:MovieClip = new SwitchBtn();
addChild(switch_btn);
switch_btn.x = 129;
switch_btn.y = 296;
//開啟switch_btn的buttonMode屬性,使有按鈕滑入滑出按壓互動與出現掌形指標
switch_btn.buttonMode = true;
//mouseChildren - 判斷物件的子系是否支援啟用滑鼠或使用者輸入裝置。
//如果啟用某個物件,則使用者可以使用滑鼠或使用者輸入裝置,與其進行互動。
//預設值為 true。
switch_btn.mouseChildren = false;
//將labelTf加入switch_btn為子實體
switch_btn.addChild(labelTf);

//建構Sprite類別實體指定給aaa;指定aaa各屬性值
var aaa:Sprite = new Sprite();
with(aaa.graphics){
 //graphics類別繪圖
 lineStyle(10, 0xFF22ff, 1, false, LineScaleMode.VERTICAL, CapsStyle.NONE, JointStyle.MITER, 10);
 beginFill(0xffff55);
 moveTo(50, 50);
 lineTo(520, 160);
 lineTo(320, 300);
 lineTo(50, 50);
 endFill();
}
//將aaa加入container為子實體
container.addChild(aaa);

//宣告flag布林變數,初始值為true,做為switch_btn切換作用之判斷
var flag:Boolean = true;
//switch_btn廣播MouseEvent.CLICK事件給removeSprite偵聽
switch_btn.addEventListener(MouseEvent.CLICK, removeSprite);
//
function removeSprite(e:MouseEvent):void{
 if (flag){
  container.removeChild(aaa);
  flag = false;
  labelTf.text = "addChild";
 }else{
  container.addChild(aaa);
  flag = true;
  labelTf.text = "removeChild";
 }
 //remove_btn.removeEventListener(MouseEvent.CLICK, removeSprite);
}


適用於 Adobe Flash Professional CS5 的 ActionScript 3.0 參考__●flash.display.DisplayObjectContainer
適用於 Adobe  Flash  Professional CS5 的 ActionScript  3.0 參考__●flash.display.Graphics
適用於 Adobe Flash Professional CS5 的 ActionScript 3.0 參考__●flash.display.Graphics__lineStyle()方法