Просмотр полной версии : нужна помощь по ItemRenderer на ActionScrept
Firelion
19.04.2012, 14:04
Есть, например, код в MXML:
<s:states>
<s:State name="portrait"/>
<s:State name="landscape"/>
</s:states>
<s:Group width="100%" height="100%">
<s:TileGroup width="100%" height="100%"
orientation="rows" requestedColumnCount.portrait="1"
requestedColumnCount.landscape="2" horizontalAlign="center">
<s:Label text="some text" width="100%" maxWidth.landscape="200"/>
<s:Label text="some text" width="100%" maxWidth.landscape="200"/>
<s:Label text="some text" width="100%" maxWidth.landscape="200"/>
<s:Label text="some text" width="100%" maxWidth.landscape="200"/>
</s:TileGroup>
</s:Group>
Стоит задача перевести это в AC3. Проблема возникла в том, что не знаю как задавать в AC3 requestedColumnCount.portrait = "1" или maxWidth.landscape = "200". То есть как задавать значения для различных стейтов?
Например, так http://blogs.adobe.com/flexdoc/2010/08/creating-flex-view-states-in-actionscript.html (вместо SetStyle вам нужно SetProperty)
Firelion
19.04.2012, 16:16
Знаю, это глупые вопросы новичка, я начал работать с Flex недавно.
Пробую так:
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:List id="list" itemRenderer="views.listIR" labelField="name">
<s:ArrayCollection>
<fx:Object name = "Oleh"/>
<fx:Object name = "Roman"/>
</s:ArrayCollection>
</s:List>
</s:View>
package views
{
import spark.components.LabelItemRenderer;
import mx.events.FlexEvent;
import mx.states.*;
import spark.components.Label;
public class listIR extends LabelItemRenderer
{
protected var labelField:Label;
protected function creationCompleteHandler(event:FlexEvent):void
{
states = [
new State({name:"portrait"}),
new State({name:"landscape",
overrides:[
new SetProperty(labelDisplay,"width", 200),
new SetProperty(labelDisplay,"maxWidth", 300)]
})
];
}
override public function set data(value:Object):void
{
super.data = value;
if (labelField)
{
labelField = ConvData(data.name);
}
}
private function ConvData (value:*):Label
{
var label:Label = new Label();
label.text = String(value);
addChild(label);
return label;
}
override protected function createChildren():void
{
super.createChildren();
labelField = new Label();
addChild (labelField);
if (data)
labelField = ConvData(data.name);
states = [
new State({name:"portrait"}),
new State({name:"landscape",
overrides:[
new SetProperty(labelDisplay,"width", 200),
new SetProperty(labelDisplay,"maxWidth", 300)]
})
];
}
override protected function measure():void
{
super.measure();
measuredHeight = 70;
height = 70;
}
override protected function layoutContents(unscaledWidth:Number,
unscaledHeight:Number):void
{
super.layoutContents(unscaledWidth, unscaledHeight);
}
protected function addedToStage ():void
{
states = [
new State({name:"portrait"}),
new State({name:"landscape",
overrides:[
new SetProperty(labelDisplay,"width", 200),
new SetProperty(labelDisplay,"maxWidth", 300)]
})
];
}
}
}
Стейты добавляются в addedToStage, createChildren и creationCompleteHandler просто для пробы, чтобы увидеть работает ли.
В результате ничего ни в портретном режиме ни в ладскейпе не меняется.
Ну кто-то же должен ещё эти стейты менять (т.е. делать currentState = ...). Т.е. если задавать эти два стейта для мобильного View, то, я полагаю (судя по примерам), они автоматически фреймворком меняются. А для item renderer'а их никто автоматически не меняет. Так что я представляю себе это так:
1) в вашем View пробегаться по всем элементам списка и менять им state — та ещё морока
2) менять List#itemRenderer в зависимости от состояния, например (пвсевдокод, не уверен , что работает):
<s:List id="list" itemRenderer.portrait="views.renderers.PortraitListItemRenderer" itemRenderer.landscape="views.renderers.LandscapeListItemRenderer" labelField="name">
придётся, правда, делать два разных рендерера..
2) менять List#itemRenderer в зависимости от состояния, например (пвсевдокод, не уверен , что работает):
Для таких манипуляций есть itemRendererFunction
Firelion
19.04.2012, 17:49
не думаю, что это лучшее решение (хотя могу и ошибаться). Суть в том, что нужно сделать приложение для планшета, и когда на экране будет штук 30-40 срок и для каждой по два рендерера (для состояний), боюсь лагать будет((
Это относилось к написанному fljot. Вас я вообще не понимаю, сначала вы спрашиваете о TlieGroup, потом "решаете" задачу с помощью List. Вы бы лучше описали задачу, а не попытки ее "решения".
Firelion
19.04.2012, 18:43
попробую объяснить. в mxml можно указать, например width = "100%" maxWidth.landscape = "200" и при изменении ориентации девайса ширина элемента для которого это указано автоматом меняется. Я спрашиваю как это же реализовать через AC3.
djyamato
19.04.2012, 19:00
http://saravananrk.wordpress.com/2008/05/26/keep-generated-actionscript-in-flex/
Вы можете на mxml написать а потом посмотреть сгенерированный AS
попробую объяснить. в mxml можно указать, например width = "100%" maxWidth.landscape = "200" и при изменении ориентации девайса ширина элемента для которого это указано автоматом меняется. Я спрашиваю как это же реализовать через AC3.
Это не задача, это попытка решения задачи. Как это сделать вам уже сказали, через SetProperty. В вашем коде, как тоже было уже сказано, помимо того что вы растыкали присвоение states куда только можно, в том что вы никак это состояние не меняете.
Firelion
19.04.2012, 19:39
http://saravananrk.wordpress.com/2008/05/26/keep-generated-actionscript-in-flex/
Вы можете на mxml написать а потом посмотреть сгенерированный AS
Спасибо, попробую разобраться
Это не задача, это попытка решения задачи. Как это сделать вам уже сказали, через SetProperty. В вашем коде, как тоже было уже сказано, помимо того что вы растыкали присвоение states куда только можно, в том что вы никак это состояние не меняете.
так в том и суть чтобы фреймворк менял сам. это же дефлотные стейты. Если каждый раз менять руками или вешать ивент то пропадее весь смысл в стейтах, я так могу свойства элементов и сам менять.
так в том и суть чтобы фреймворк менял сам. это же дефлотные стейты.
У LabelItemRenderer всего два состояния down и hovered (для их смены не используется механизм заложенный в UIComponent). Поэтому, если вы хотите установить свое состояние, вы должны это сделать самостоятельно.
Firelion
19.04.2012, 20:39
но вот такой код работает же:
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:states>
<s:State name="portrait"/>
<s:State name="landscape"/>
</s:states>
<s:List id="list" labelField="name" width="100%" maxWidth.landscape="200" maxWidth.portrait="100">
<s:ArrayCollection>
<fx:Object name = "Oleh"/>
<fx:Object name = "Roman"/>
</s:ArrayCollection>
</s:List>
</s:View>
А чего ему не работать? У View как раз есть эти состояния. Он их и обрабатывает.
Firelion
19.04.2012, 20:53
хм ... интересно, а есть где-то мануал \ хелп где можно было почитать об этом? я уже запутался( сорри за тупые вопросы.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.