在AS3中的数据网格中添加动画片段(并控制它们)

时间:2009-09-08 16:44:36

标签: actionscript-3

我在数据网格中创建了一个列,该列显示了一个动画片段(每一行都显示相同的动画片段)。 如何控制每行显示哪个帧?

在movieclip中使用this.parent不起作用。 影片剪辑所在的特定行的路径是什么?

由于

1 个答案:

答案 0 :(得分:0)

我使用this devnet article进行了测试: 请注意,在数据中我传递了另一个具有 source 的对象,refence用于显示剪辑 和框架,用于控制剪辑的框架。

//imports
import fl.controls.DataGrid;
import fl.controls.dataGridClasses.DataGridColumn;
import fl.data.DataProvider;
//data
var dp:DataProvider = new DataProvider();
//populate the provider, specifying the source (linkageID and frame of the clip to display)
for(var i:int = 0 ; i < 7; i++)
    dp.addItem({data:{source:'Star',frame:i+1}, title:"clip Star at frame"+(i+1)+""});
var dataCol:DataGridColumn = new DataGridColumn("data");
dataCol.cellRenderer = ClipCell;

var titleCol:DataGridColumn = new DataGridColumn("title");

var myDataGrid:DataGrid = new DataGrid();
myDataGrid.addColumn(dataCol);
myDataGrid.addColumn(titleCol);
myDataGrid.dataProvider = dp;
myDataGrid.rowHeight = 64;
myDataGrid.width = 500;
myDataGrid.rowCount = dp.length - 1;
addChild(myDataGrid);

这里的 ClipCell 在数据列中使用了一个单元格渲染器:

package {
    // Import the required component classes.
    import fl.controls.listClasses.ICellRenderer;
    import fl.controls.listClasses.ListData;
    import fl.controls.Label;
    import fl.controls.TextInput;
    import fl.core.InvalidationType;
    import fl.core.UIComponent;
    import fl.data.DataProvider;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.utils.*;

    public class ClipCell extends UIComponent implements ICellRenderer {
        protected var _data:Object;
        protected var _listData:ListData;
        protected var _selected:Boolean;
        private var _clip:MovieClip;
        /**
         * Constructor.
         */
        public function ClipCell():void {
            super();
        }
        /**
         * Gets or sets the cell's internal _data property.
         */
        public function get data():Object {
            return _data;
        }
        /** 
         * @private (setter)
         */
        public function set data(value:Object):void {
            _data = value;
            if(value.data.source) {
                var Clip:Class = getDefinitionByName(value.data.source) as Class;
                _clip = new Clip();
                if(_clip.numFrames > 1) _clip.stop();
                addChildAt(_clip,0);
            }
            if(value.data.frame && _clip) _clip.gotoAndStop(value.data.frame);
        }
        public function get caca():String{return 'caca';}
        /**
         * Gets or sets the cell's internal _listData property.
         */
        public function get listData():ListData {
            return _listData;
        }
        /**
         * @private (setter)
         */
        public function set listData(value:ListData):void {
            _listData = value;
            invalidate(InvalidationType.DATA);
            invalidate(InvalidationType.STATE);
        }

        /**
         * Gets or sets the cell's internal _selected property.
         */
        public function get selected():Boolean {
            return _selected;
        }
        /**
         * @private (setter)
         */
        public function set selected(value:Boolean):void {
            _selected = value;
            invalidate(InvalidationType.STATE);
        }

        /**
         * Sets the internal mouse state.
         */
        public function setMouseState(state:String):void {
        }

    }
}

我在库中有一个名为 Star 的剪辑为actionscript导出。 在里面我放了一些代码,看看我是否可以进入ClipCell:

var cell:ClipCell = this.parent as ClipCell;
trace(cell.data.title);
for(var i in cell.data.data)
    trace(i+':'+cell.data.data[i]);

我得到了这个输出:

clip Star at frame1
frame:1
source:Star
clip:[object Star]

HTH