我有一些我正在使用 flex 编写的代码。我在网格容器中添加了 16 个 UIComponent。
网格并没有真正给我想要的东西,以至于我想尝试使用平铺列表,因为它有很多非常好的内置功能。
据我了解,要将项目添加到 tilelist,您需要定义数据提供者和项目渲染器。
我正在努力将我的 UIComponent 概念化并实现为 itemrenderer。有人可以帮我吗?
我看到了两个主要问题。
首先,在我的初始实现中,我在设计时向我的 UIComponents 添加了唯一的 ID。这些唯一的 id 在我的应用程序中非常重要,我不确定如何将它们分配给 tilelistitemrenderer。
其次,我的 UIcomponets 有 3 个我的网格监听的自定义事件。我不知道如何将这些侦听器分配给 tilelist itemrenderer。
这是我的原始网格代码
网格代码
<mx:GridRow id="row0">
<mx:GridItem width="100%"
height="100%">
<PadDisplay:Pad id="channel_0_pad_0"
channelNumber="0"
padNumber="0"
currentPadState="{PalletteCode.EMPTY}"
verify="verifyItemOnPad(event)"
requestplay="requestPlayHandler(event)"
requeststop="requestStopHandler(event)"/>
</mx:GridItem>
<mx:GridItem width="100%"
height="100%">
<PadDisplay:Pad id="channel_0_pad_1"
channelNumber="0"
padNumber="1"
currentPadState="{PalletteCode.EMPTY}"
verify="verifyItemOnPad(event)"
requestplay="requestPlayHandler(event)"
requeststop="requestStopHandler(event)"/>
</mx:GridItem>
<mx:GridItem width="100%"
height="100%">
<PadDisplay:Pad id="channel_0_pad_2"
channelNumber="0"
padNumber="2"
currentPadState="{PalletteCode.EMPTY}"
verify="verifyItemOnPad(event)"
requestplay="requestPlayHandler(event)"
requeststop="requestStopHandler(event)"/>
</mx:GridItem>
<mx:GridItem width="100%"
height="100%">
<PadDisplay:Pad id="channel_0_pad_3"
width="{padwidth}"
height="36"
currentPadState="{PalletteCode.EMPTY}"
verify="verifyItemOnPad(event)"
requestplay="requestPlayHandler(event)"
requeststop="requestStopHandler(event)"/>
</mx:GridItem>
</mx:GridRow>
这是我现在想成为 TileListItemRender 的 UIComponet 代码
<mx:UIComponent xmlns:mx="http://www.adobe.com/2006/mxml"
initialize="init(event)"
dragEnter="input_dragEnterHandler(event)"
dragDrop="input_dragDropHandler(event)">
<mx:Script>
<![CDATA[
import components.remix.events.PadEvent;
import mx.binding.utils.BindingUtils;
import components.remix.events.PadContentEvent;
import mx.core.DragSource;
import mx.core.IUIComponent;
import fl.data.DataProvider;
import mx.managers.DragManager;
import mx.events.DragEvent;
import mx.collections.IList;
import mx.events.FlexEvent;
public var _padCode:PadCode
public var pad:pad_v1_0_1
[Bindable]
public var padNumber:int;
[Bindable]
public var channelNumber:int
[Bindable]
public var currentPadState:String= PalletteCode.EMPTY;
private function init(e:FlexEvent):void
{
_padCode=new PadCode()
pad=new pad_v1_0_1()
pad.cacheAsBitmap=true;
pad.spinnymc.visible=false
pad.gotoAndStop("empty")
addChild(pad)
_padCode._targetComponent=this;
this.buttonMode=true
setInitialState()
addEventListener(MouseEvent.MOUSE_UP,padClicked)
}
private function input_dragEnterHandler(event:DragEvent):void
{
if (event.dragSource.hasFormat(PadContent.LOOP_FORMAT))
DragManager.acceptDragDrop(this)
}
private function input_dragDropHandler(event:DragEvent):void
{
var dropTarget:IUIComponent=event.currentTarget as IUIComponent;
var dragSource:DragSource=event.dragSource;
var padContent:PadContent=new PadContent()
padContent.channelNumber=channelNumber
padContent.padNumber=padNumber
if (dragSource.hasFormat(PadContent.LOOP_FORMAT))
{
var data:Object=event.dragSource.dataForFormat(PadContent.LOOP_FORMAT);
padContent.format=PadContent.LOOP_FORMAT
padContent.parseContent(data)
dispatchEvent(new PadContentEvent(PadContentEvent.VERIFY, padContent))
}
}
public function setInitialState():void
{
/**switch (currentPadState)
{
case (PalletteCode.EMPTY):
pad.gotoAndStop("empty");
pad.visible=false;
this.buttonMode=false;
break;
case (PalletteCode.IDLE):
pad.gotoAndStop("grey");
pad.addEventListener(MouseEvent.CLICK, padClicked)
//pad.addEventListener(MouseEvent.MOUSE_OVER, padover)
//pad.addEventListener(MouseEvent.MOUSE_OUT, padout)
pad.alpha=.5;
this.buttonMode=true;
break;
}**/
}
private function padClicked(e:MouseEvent=null):void
{
//var p:pad_v1_0_1=e.currentTarget as pad_v1_0_1;
//var pc:PadContainer=p.holder;
trace("pad clicked")
switch (currentPadState)
{
case (PalletteCode.IDLE):
// send play command
dispatchEvent(new PadEvent(PadEvent.REQUEST_PLAY, channelNumber, padNumber))
currentPadState=PalletteCode.QUEUEING;
pad.gotoAndStop("amber");
break;
case (PalletteCode.PLAYING):
// send stop command
dispatchEvent(new PadEvent(PadEvent.REQUEST_STOP, channelNumber, padNumber))
currentPadState=PalletteCode.STOPPING;
pad.gotoAndStop("red");
break;
}
}
]]>
</mx:Script>
<mx:Metadata>
[Event(name="verify", type="components.remix.events.PadContentEvent")]
[Event(name="requestplay", type="components.remix.events.PadEvent")]
[Event(name="requeststop", type="components.remix.events.PadEvent")]
</mx:Metadata>
</mx:UIComponent>