Cкины в Flex3 - новые возможности. Преходы между цветами в кнопках возможны.

Оригинал статьи: Stateful skins in Flex 3, color transitions in buttons now possible
Автор оригинала: Nahuel
Вольный перевод: SHAGGYSMILE

В Flex 3 beta 2 появилось несколько новых возможностей, для скинования. Об этом уже писали Juan и NJ. Но тема нашей статьи - Stateful Skins без Flash :)

Это хорошая вещь в фремворке, так как теперь можно управлять переходами между состояниями (transitions) не покидая Flex Builder.

Итак, создадим кнопку:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="0x3d3d3d" layout="absolute" width="400" height="200">
  4. <mx:Style source="assets/styles/Main.css"/>
  5. <mx:Button label="Sexy Flex Button" x="50" y="50" />
  6. </mx:Application>



Как видите, вполне обычная и безобидная кнопка с самым обычным линком на стиль.

Стиль такой:

  1. /* CSS file */
  2. Button{
  3. skin: ClassReference("skins.ButtonSkin");
  4. fontSize:16;
  5. fontWeight:normal;
  6. paddingLeft:23;
  7. paddingRight:23;
  8. paddingTop:10;
  9. paddingBottom:10;
  10. color:#ffffff;
  11. textRollOverColor:#ffffff;
  12. cornerRadius:5;
  13. borderThickness:1;
  14. borderColor:#cccccc;
  15. borderStyle:solid;
  16. backgroundColor:#1e83b8;
  17. }



Думаю у многих взгляд остановился на skins.ButtonSkin :) Но обо все по порядку.

Разработчик может спокойно заниматься логикой приложения, не зацикливаясь над тем, как выглядит кнопка (как это кстати часто происходит). После этого, программист или "дизайнлопер" могут добавлять transitions (преходы), цвета и вообще менять внешний вид, не отвлекая разработчика от важных дел.

Ссылка ClassReference в CSS, указывает на класс (например skins.ButtonSkin) где определены различные эффекты, такие как переходы, тени и др. Т.е. процесс программного скинования упрощается в разы.

В Flex2 дела обстояли похуже. При создании программных скинов, мы должны были определять логику скинируемого компонента (например определяя состояния, типа up, over, down и т.д.) непосредственно в основном приложении, на что уходило драгоценное время. Упростить этот процесс естественно можно, используя внешние assets, если в качестве скина использовались картинки или внешние swf.

Но для изменения какого-нибудь эффекта (если в assets swf) приходилось перекомпилировать скин, а тут опять таки - время.

В Flex 3 мы можем создать один класс в котором прописаны основные или базовые состояния кнопки. В этом примере, мы создали MXML компонент, используя Canvas в качестве супер класса (из-за лени автора статьи). Но мы можем использовать любой UIComponent или любой другой класс, поддерживающий IStateClient.

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Canvas
  3. xmlns:mx="http://www.adobe.com/2006/mxml"
  4. creationComplete="init()">
  5. <mx:Script>
  6. <![CDATA[
  7. import mx.controls.Button;
  8. import mx.core.UITextField;
  9.  
  10. use namespace mx_internal;
  11.  
  12. [Bindable]
  13. private var textField:UITextField;
  14.  
  15. private function init():void
  16. {
  17. var button:Button = (parent as Button);
  18. textField = button.getTextField();
  19. filters = [bevel, dropshadow];
  20. }
  21.  
  22. ]]>
  23. </mx:Script>
  24. <mx:states>
  25. <mx:State name="up" enterState="fadeColor.play()">
  26. <mx:SetProperty target="{fadeColor}" name="toValue" value="0x1e83b8"/>
  27. <mx:SetProperty target="{textField}" name="filters" value="{[textShadow]}"/>
  28. </mx:State>
  29.  
  30. <mx:State name="down">
  31. <mx:SetProperty target="{this}" name="filters" value="{[bevelDown]}"/>
  32. <mx:SetProperty target="{glow}" name="color" value="{0xf1c990}"/>
  33. <mx:SetProperty target="{textField}" name="filters" value="{[glow]}"/>
  34. </mx:State>
  35.  
  36. <mx:State name="over" enterState="fadeColor.play()">
  37. <mx:SetProperty target="{fadeColor}" name="toValue" value="0xff9600"/>
  38. <mx:SetProperty target="{textField}" name="filters" value="{[glow]}"/>
  39. <mx:SetProperty target="{bevel}" name="highlightAlpha" value="0.8"/>
  40. </mx:State>
  41. </mx:states>
  42.  
  43. <mx:DropShadowFilter id="dropshadow" alpha="0.5" quality="3" blurX="6" blurY="6"/>
  44. <mx:BevelFilter id="bevel" angle="90" highlightColor="0xffffff"
  45. shadowAlpha="0" strength="3" quality="3" distance="24" highlightAlpha="0.4"/>
  46. <mx:BevelFilter id="bevelDown" type="inner" angle="245" shadowAlpha="0.4"
  47. highlightAlpha="0.4" distance="8" blurX="10" blurY="10" quality="4"/>
  48. <mx:DropShadowFilter id="textShadow" alpha="0.5" quality="2"
  49. distance="2" blurX="2" blurY="2" />
  50. <mx:GlowFilter id="glow" color="#b86113" alpha="0.8" />
  51.  
  52. <ds:AnimateColor xmlns:ds="com.darronschall.effects.*"
  53. id="fadeColor"
  54. target="{this}"
  55. property="backgroundColor" isStyle="true"
  56. toValue="559603"
  57. duration="300" />
  58.  
  59. <mx:Image source="@Embed(source='assets/images/dec_left.png')"
  60. left="5" verticalCenter="0"/>
  61. <mx:Image source="@Embed(source='assets/images/dec_right.png')"
  62. right="5" verticalCenter="0"/>
  63. </mx:Canvas>


Пример | Исходник

Прим. переводчика: Во время перевода, я возможно погорячился и возможно в порыве восторга допустил ошибки. Прошу отписатся в комментариях, если заметите, что не так. Так что прошу заметить это не оригинальный а вольный перевод, с моими добавлениями.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Popularity: 78% [?]



(6) Комментариев

  1. zlatko on November 5th, 2007

    Повторение мать учения ;)

    В первом листинге дублируется строка :

  2. Иллона on November 11th, 2007

    Спасиб за подробности

  3. Борис Григорьев on November 12th, 2007

    Да пригодилось мне уже во второй раз

  4. Дана on November 14th, 2007

    Интересно

  5. Visnik on November 23rd, 2007

    Привет с Украины, успехов, сенк за статьи

  6. ASUS on January 17th, 2008

    Полезные статьи всегда нужны. Автору благодарность.

Оставить комментарий