0

私は、このページにあるボタンのグラフィカル スタイルの同等の Flex 4 実装を作成する任務を負っています: http://h.dwighthouse.com/temp/UDOP/2011-3-25_themeDevGlowing/

つまり、ボタンのアニメーション化された光る効果です。プログラムによる適切なグラデーション ベースのスキン ベースと思われるものを取得しましたが、2 つの問題があります。

1 つ目は、スキンで応答するマウス イベントを取得できません。この問題を抱えている他の人を見つけることができないようです。以下のコードでは、マウスオーバーが発生したときに startAnimation が呼び出されることはありませんが、イベントは明らかに登録されています。このコードをテストするskinClass="ButtonSkin"には、メイン アプリケーションのボタン宣言に追加するだけです。以下のコードは、ButtonSkin.mxml ファイルです。

<?xml version="1.0" encoding="utf-8"?>
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx"
        initialize="init()"
        mouseEnabled="true">

    <fx:Metadata>
        [HostComponent("spark.components.Button")]
    </fx:Metadata>

    <fx:Script>
        <![CDATA[
            import flash.events.Event;

            [Bindable]
            private var animatedAlpha:Number = 0.8;
            private var animationDirection:Number = -1;

            private function backAndForth(value:Number, max:Number, min:Number, increment:Number):Number {
                value += (animationDirection * increment);
                if (value < min || value > max)
                {
                    animationDirection *= -1;
                    value += (animationDirection * increment * 2);
                }
                return value;
            }

            private function startAnimation(e:MouseEvent):void {
                animatedAlpha = backAndForth(animatedAlpha, 0.8, 0.3, 0.1); // Or something
                systemManager.addEventListener(MouseEvent.MOUSE_OUT, endAnimation);
            }

            private function endAnimation(e:MouseEvent):void {
                animatedAlpha = backAndForth(animatedAlpha, 0.8, 0.3, 0.1); // Or something
                systemManager.removeEventListener(MouseEvent.MOUSE_OUT, endAnimation);
            }

            private function init():void {
                parent.mouseChildren = true; // Otherwise mouse events don't fire in the skin
                clickableArea.addEventListener(MouseEvent.MOUSE_OVER, startAnimation);
            }
        ]]>
    </fx:Script>


    <s:states>
        <s:State name="up" />
        <s:State name="over" />
        <s:State name="down" />
        <s:State name="disabled" />
    </s:states>

    <s:Group top="0" bottom="0" left="0" right="0" id="clickableArea">
        <s:Rect top="0" bottom="0" left="0" right="0" radiusX="8" radiusY="8">
            <s:fill>
                <s:LinearGradient rotation="90">
                    <s:GradientEntry color="#000000" color.down="#bb0000" color.disabled="#3b3b3b" ratio="0" />
                    <s:GradientEntry color="#353535" color.down="#ff0000" color.disabled="#555555" ratio="1" />
                </s:LinearGradient>
            </s:fill>
        </s:Rect>

        <s:Rect top="0" bottom="0" left="0" right="0" radiusX="8" radiusY="8">
            <s:fill>
                <s:LinearGradient rotation="90">
                    <s:GradientEntry color.over="#8f1b1b" alpha="0" ratio="0" />
                    <s:GradientEntry color.over="#8f1b1b" alpha="0" ratio="0.4" />
                    <s:GradientEntry color.over="#8f1b1b" alpha="{animatedAlpha}" alpha.down="0" ratio="1" />
                </s:LinearGradient>
            </s:fill>
        </s:Rect>

        <s:Rect top="0" bottom="0" left="0" right="0" radiusX="8" radiusY="8">
            <s:stroke>
                <s:SolidColorStroke color="#000000" color.disabled="#333333" weight="1" />
            </s:stroke>
            <s:fill>
                <s:LinearGradient rotation="90">
                    <s:GradientEntry color="#ffffff" color.disabled="#9e9e9e" alpha="0.6" alpha.down="0.7" ratio="0" />
                    <s:GradientEntry color="#ffffff" color.disabled="#848484" alpha="0.2" alpha.down="0.4" ratio="0.45" />
                    <s:GradientEntry color="#ffffff" alpha="0" ratio="0.46" />
                </s:LinearGradient>
            </s:fill>
        </s:Rect>

        <s:Label id="labelDisplay" color="#ffffff" color.disabled="#aaaaaa" textAlign="center" baseline="center" paddingTop="7" paddingBottom="5" paddingLeft="10" paddingRight="10">
            <s:filters>
                <s:DropShadowFilter distance="0" angle="45" blurX="5" blurY="5" />
            </s:filters>
        </s:Label>
    </s:Group>

編集マウスイベントが発生しない理由がわかりました。ボタンにはデフォルトで mouseChildren false が設定されているようです。これにより、イベントがそれ自体よりも低いレベルで発生することが明確に防止されます。コンストラクターで使用parent.mouseChildren = true;すると、この問題が修正されます。質問の次の部分、連続アニメーションに進みます。

それ以外に、フレームごとに関数を呼び出す正しい方向と、マウスイベントを使用してインクリメンタル呼び出しをオンまたはオフにする機能を教えていただければ幸いです。(もしそれが Flex でアニメーション化する方法でないなら、許してください、私は Flash ベースのアニメーションについて何も知りません。) ありがとう!

4

1 に答える 1

1

両方の質問に対する答えが見つかりました:

  1. ボタンは、子(スキンを含む)がマウスイベントを受信するのを防ぎます。parent.mouseChildren = true;スキンの初期化機能を設定することにより、マウスイベントを正常に受信します。

  2. Flex(Actionscript)でアニメーション化できるのは、Javascriptでアニメーション化するのと同じ方法(setIntervalとclearInterval)であることがわかります。

于 2011-03-30T18:48:52.417 に答える