سؤال

أقوم بتطوير موقع على شبكة الإنترنت مع عناصر NAV التي تغطي المرحلة بأكملها من أعلى إلى أسفل (انظر الصورة المتغيرة أدناه)، ومن السهل جدا على المستخدم الخروج من المرحلة مع الماوس، وليس تشغيل MouseEvent.MOUSE_OUT الأحداث المطلوبة "إيقاف" قال بنود NAV.

يجب أن أستخدم Event.MOUSE_LEAVE للكشف عندما غادر الماوس المرحلة، وإيقاف تشغيل أي عناصر تنقل ممكنا؟ هذا هو ما أحاول القيام به، لكنه تواجه مشكلة في الحصول على أي خرج من مستمعي. أيه أفكار؟

النص البديل http://marcessutton.com/blog/wp-content/uploads حتى الآن/01/redpropeller.png.

بالنسبة للفئة المرتبطة بنقل movieclip في فلاش IDE، هل هذا هو بناء الجملة الصحيح لتسجيل Event.MOUSE_LEAVE المستمع؟ لا يبدو أن تفعل أي شيء بغض النظر عن ما أقوم به. هل هي حالة حيث يتعين علي تضمين الفيلم في متصفح لحدث إطلاق النار؟

this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);

هنا هو فئة Mainnav.as:

package com.redpropeller {

import com.greensock.*;
import com.greensock.plugins.*;
import flash.display.*;
import flash.text.*;
import flash.events.*;

public class MainNav extends MovieClip { // MainNav is a movieclip in the IDE

    public var colors:Array;

    public function MainNav():void {
        colors = new Array(0xee3124, 0xc72a1f, 0xa62c24, 0x912923, 0x7e221c);
        TweenPlugin.activate([TintPlugin]);

        // trying to target stage through this object
        this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);

        for(var i:Number=0; i<this.numChildren; i++){
            var n = this.getChildAt(i);
            n.useHandCursor = true;
            n.buttonMode = true;

            n.addEventListener(MouseEvent.MOUSE_OVER, navBtnOn);
            n.addEventListener(MouseEvent.MOUSE_OUT, navBtnOff);
        }
    }
    public function mouseLeaveListener(e:Event):void {
        trace('mouseleave'); // nothing ever happens

    }
    private function navBtnOn(e:MouseEvent):void {
        TweenLite.to(e.currentTarget.bar_mc, 0.01, {tint:0x333333});
    }
    private function navBtnOff(e:MouseEvent):void {
        TweenLite.to(e.currentTarget.bar_mc, 0.01,
            {tint:uint(colors[this.getChildIndex(MovieClip(e.currentTarget))])});
            // changes color back to specific tint
    }
}

}
هل كانت مفيدة؟

المحلول

أنت تحاول إنشاء مستمع الأحداث ل Mouse_Leave في المنشئ. من الممكن أن يكون كائن المرحلة غير موجود حتى الآن إذا لم تتم إضافة Mainnav إلى المرحلة عبر طريقة AddChild (). إذا كانت Mainnav موجودة بالفعل في المرحلة في وقت التصميم، فلا يزال من الممكن أن تكون المرحلة لن تكون متاحة على الفور. بالنسبة للفصول الدراسية التي ترث من DisplayObject (Movieclip، Sprite، إلخ)، أفعل شيئا واحدا فقط في المنشئ: قم بإعداد مستمع LEATDED_TO_STAGE. يؤدي هذا المستمع إلى تشغيل طريقة INIT () عند إضافة الكائن إلى مكدس عرض المرحلة عبر AddChild () من حاوية الأصل، أو إذا كان الكائن موجود بالفعل في المرحلة في وقت التصميم. عند استدعاء طريقة INIT ()، أعرف أن خاصية المرحلة ستكون متاحة.

في منشئك، قد لا توجد مرحلة موجودة في المثال حتى الآن، ولكن يجب أن تحصل على خطأ وقت التشغيل. ومع ذلك، فأنت تستخدم كلمة الكلمة الأساسية "هذه" قبل المرحلة. عند استخدام "هذا" في الفصل الذي يرث من كائن (فصولك يقوم عبر Movieclip-> DisplayObject-> EventDISPatcher-> كائن)، لن يقوم برنامج التحويل البرمجي بإلقاء خطأ إذا كان العقار غير موجود لأنه يحاول إنشاء ذلك خاصية كعضو في "هذا". يحدث هذا لأن فئة الكائن ديناميكية، مما يعني أنه يمكن إنشاء خصائص جديدة في أي وقت دون الحاجة إلى إعلانها كغيرات فئة في الرأس - عليك فقط استخدام الكلمة الأساسية "هذه" عند استخدام هذه الخاصية الديناميكية. عند استخدام هذا. كما لو كانت المرحلة غير موجودة، يقوم الفصل بإنشاء مرحلة الخصائص لك. ومع ذلك، فهذه ليست المرحلة التي تريدها، وبالتالي فإن المستمع يعلق فقط على كائن فارغ لا يفعل أي شيء. حاول إزالة "هذا" عند الرجوع إلى المرحلة وأنا متأكد من أنك سترى الخطأ في مرحلة ما. بشكل عام، ليس من الممارسات الجيدة استخدام "هذا" للحصول على خصائص، لأن التحويل البرمجي سيتجاهل أخطاء الكتابة لهذا العقار.

ذكرت في تعليق واحد أعلاه أن Mouse_Leave لا يعمل في IDE، لكنني اختبرت هذا من CS4 ويعمل. قد تشاهد اختلافا بالأداء من مشغل فلاش IDE مقارنة بمسافة Flash Play Player في المستعرض. في بعض الحالات، سيعمل مستمع الحدث الخاص بالمرحلة من المنشئ إذا كانت الأحمال SWF بسرعة ووسائل متاحة على الفور، لكنها غير موثوقة. حرك ذلك المستمع إلى طريقة INIT () التي يتم استدعاؤها بعد الحدث المضافة_Stage ولا تستخدم الكلمة الأساسية "هذه".

نصائح أخرى

الإجابة: Event.mouse_leave لا ينطلق في IDE. إنه يعمل بشكل جيد عندما يتم تضمين الفيلم في صفحة HTML. شكرا لمساعدتك!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top