Казалось бы, простая проблема скининга в Flex4; стиль дает эффект диско - PullRequest
1 голос
/ 16 апреля 2010

Я делаю что-то не так, но не могу понять, что. Простой проект в flex4, с помощью которого я создаю скинбоксовый комбобокс (фрагменты в конце).

Если я включу 3 эталона скинов (верхний слой, верхний слой, нижний слой), кажется, что поле со списком просто перестает работать. Если я уберу верхнюю обложку, при наведении курсора на комбо произойдет эффект мерцания, в котором, как кажется, будет применен стиль, а затем немедленно удалим его.

Я получаю то же самое с кнопкой вместо комбо.

Я уверен, что это что-то действительно простое, но оно уклоняется от меня.

    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
                   xmlns:s="library://ns.adobe.com/flex/spark" 
                   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:containers="flexlib.containers.*">
        <fx:Declarations>
            <!-- Place non-visual elements (e.g., services, value objects) here -->
        </fx:Declarations>
        <fx:Style>
            @namespace s "library://ns.adobe.com/flex/spark";
            @namespace mx "library://ns.adobe.com/flex/mx";
            #myCombo
            {   
                over-skin: ClassReference("nmx.MyComboSkin");
                up-skin: ClassReference("nmx.MyComboSkin");  
                down-skin: ClassReference("nmx.MyComboSkin");
            }

        </fx:Style>
        <fx:Script>
            <![CDATA[
                [Bindable]
                public var items:Array = ["A","B","C"];
            ]]>
        </fx:Script>

        <mx:Canvas backgroundColor="#ff0000" width="726" height="165" x="20" y="41">

            <mx:ComboBox  id="myCombo" x="10" y="10" prompt="Hospital" dataProvider="{items}">

            </mx:ComboBox>

        </mx:Canvas>

    </s:Application>

Определение кожи:

    package nmx
    {
        import flash.display.GradientType;
        import flash.display.Graphics;

        import mx.skins.Border;
        import mx.skins.ProgrammaticSkin;
        import mx.skins.halo.ComboBoxArrowSkin;
        import mx.skins.halo.HaloColors;
        import mx.utils.ColorUtil;

        public class MyComboSkin extends ProgrammaticSkin
        {

                public function MyComboSkin()
                {
                    super();
                }

                override protected function updateDisplayList(w:Number, h:Number):void
                {
                    trace(name);

                    super.updateDisplayList(w, h);

                    var arrowColor:int = 0xffffff;

                    var g:Graphics = graphics;

                    g.clear();



                    // Draw the border and fill.
                    switch (name)
                    {
                        case "upSkin":
                        case "editableUpSkin":
                        {

                            g.moveTo(0,0);
                            g.lineStyle(1,arrowColor);
                            g.lineTo(w-1,0);
                            g.lineTo(w-1,h-1);
                            g.lineTo(0,h-1);
                            g.lineTo(0,0);

                        }
                        break;

                        case "overSkin":
                        case "editableOverSkin":
                        case "downSkin":
                        case "editableDownSkin":
                        {

                            // border
                            /*drawRoundRect(
                                0, 0, w, h, cr,
                                [ themeColor, themeColor ], 1);
                            */
                            g.moveTo(0,0);
                            g.lineStyle(1,arrowColor);
                            g.lineTo(w-1,0);
                            g.lineTo(w-1,h-1);
                            g.lineTo(0,h-1);
                            g.lineTo(0,0);


                            // Draw the triangle.
                            g.beginFill(arrowColor);
                            g.moveTo(w - 11.5, h / 2 + 3);
                            g.lineTo(w - 15, h / 2 - 2);
                            g.lineTo(w - 8, h / 2 - 2);
                            g.lineTo(w - 11.5, h / 2 + 3);
                            g.endFill();

                        }
                        break;  

                        case "disabledSkin":
                        case "editableDisabledSkin":
                        {


                            break;
                        }
                    }


                }
            }


    }

Ответы [ 2 ]

0 голосов
/ 17 апреля 2010

Aha! Нашел это ..

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

Добавление следующих исправлений:

g.beginFill(0x0000ff,0);
g.drawRect(0,0,w,h);
g.endFill();

, который рисует полностью прозрачный прямоугольник (!).

0 голосов
/ 16 апреля 2010

Я бы добавил значение по умолчанию для вашего оператора switch, которое на самом деле что-то рисует, но это кажется странной проблемой. Просто устанавливает:

skin: ClassReference("nmx.MyComboSkin");

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

...