javascript - 使用ExternalInterface访问Flash中的未定义属性错误

标签 javascript html actionscript-3

我是闪存新手,所以这个问题的解决方案可能很简单。不幸的是我一直无法找到有效的解决方案,所以我希望你们能提供帮助。我正在使用第 3 方 Flash - Coverflow 为专辑开发一个网站。它看起来很棒,您可以在这里下载:http://www.weberdesignlabs.com/blog/2009/12/flash-10-coverflow/ 。我的挑战是我想通过 HTML 中的 Javascript 调用来处理专辑。在我的搜索中,我发现了ExternalInterface,但我无法让它工作。当我尝试导出影片时,出现“访问未定义的属性 gotoCoverFlowItem”错误。

下面是我试图修改的 Coverflow.ai 文件中包含的代码,以及其中的修改。完整的代码可以在上面的链接中找到。我使用的是Flash 10版本。

////////////////////////////////////////////
// Project: Flash 10 Coverflow
// Date: 10/3/09
// Author: Stephen Weber
////////////////////////////////////////////
package {

    ////////////////////////////////////////////
    // IMPORTS
    ////////////////////////////////////////////

    import flash.display.Sprite;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.display.GradientType;
    import flash.display.Graphics;
    import flash.display.Shape;
    import flash.display.MovieClip;
    import flash.display.BlendMode;
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;
    import flash.events.IOErrorEvent;
    import flash.geom.Matrix;
    import flash.geom.Rectangle;
    import flash.geom.ColorTransform;
    import flash.net.URLRequest;
    import flash.net.URLLoader;
    import flash.net.navigateToURL;
    import flash.display.Stage;
    import flash.utils.setTimeout;
    import flash.external.ExternalInterface;

    //TweenLite - Tweening Engine - SOURCE: http://blog.greensock.com/tweenliteas3/
    import com.greensock.*;
    import com.greensock.easing.*;
    import com.greensock.plugins.*;

    public class Coverflow extends Sprite {

        ////////////////////////////////////////////
        // VARIABLES
        ////////////////////////////////////////////

        // size of the stage
        private var sw:Number;
        private var sh:Number;

        private var background:Background;

        // padding between each cover, can be customed via xml
        private var coverflowSpacing:Number=30;

        // transition time for movement
        private var transitionTime:Number=0.75;

        // the center of the stage
        private var centerX:Number;
        private var centerY:Number;

        // store each image cover's instance
        private var coverArray:Array=new Array();

        // title of each image
        private var coverLabel:CoverflowTitle = new CoverflowTitle();

        // the slider under the image cover
        private var coverSlider:Scrollbar;

        // how many image covers
        private var coverflowItemsTotal:Number;

        // how to open the link
        private var _target:String;

        // size of the image cover
        private var coverflowImageWidth:Number;

        private var coverflowImageHeight:Number;

        //Holds the objects in the data array
        private var _data:Array = new Array();

        // the y position of the item's title
        private var coverLabelPositionY:Number;

        //Z Position of Current CoverflowItem
        private var centerCoverflowZPosition:Number=-125;

        // display the middle of the cover or not
        private var startIndexInCenter:Boolean=true;

        // which cover to display in the beginning
        private var startIndex:Number=0;

        // the slide's Y position
        private var coverSlidePositionY:Number;

        //Holder for current CoverflowItem
        private var _currentCover:Number;

        //CoverflowItem Container
        private var coverflowItemContainer:Sprite = new Sprite();

        //XML Loading
        private var coverflowXMLLoader:URLLoader;

        //XML
        private var coverflowXML:XML;

        // the image cover's white border padding
        private var padding:Number=4;

        // stage reference
        private var _stage:Stage;

        //reflection
        private var reflection:Reflect;

        //Reflection Properties
        private var reflectionAlpha:Number;

        private var reflectionRatio:Number;

        private var reflectionDistance:Number;

        private var reflectionUpdateTime:Number;

        private var reflectionDropoff:Number;

        ////////////////////////////////////////////
        // CONSTRUCTOR - INITIAL ACTIONS
        ////////////////////////////////////////////
        public function Coverflow(_width:Number, _height:Number, __stage:Stage = null):void {
            _stage=__stage;
            sw=_width;
            sh=_height;
            centerX=_width>>1;
            centerY=(_height>>1) - 20;
            loadXML();

            //Grabs Background color passed in through FlashVars
            var backgColor:String = _stage.loaderInfo.parameters["backgroundColor"];

            if(backgColor == null) {
                //Black
                backgColor = "0x000000";

                //White
                //backgColor = "0xFFFFFF";
            }

            //Creates Background MovieClip
            background = new Background();

            //Set Background To Provided Width/Height
            background.width = _width;
            background.height = _height;

            //Adds background MovieClip to DisplayList
            addChild(background);

            //Tints Background MovieClip with provided tint
            TweenPlugin.activate([TintPlugin]);
            TweenLite.to(background, 0, {tint:backgColor});

            //Grabs Background color passed in through FlashVars
            var labelColor:String = _stage.loaderInfo.parameters["labelColor"];

            //Check for value and then default
            if(labelColor == null) {
                //Black
                //labelColor = "0x000000";

                //White
                labelColor = "0xFFFFFF";
            }

            //Tint Coverflow label to color provided
            TweenLite.to(coverLabel, 0, {tint:labelColor});

            if (_stage) {
                _stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
            }
        }
        ////////////////////////////////////////////
        // FUNCTIONS
        ////////////////////////////////////////////

        private function keyDownHandler(e:KeyboardEvent):void {
            if (e.keyCode==37||e.keyCode==74) {
                clickPre();
            }
            if (e.keyCode==39||e.keyCode==75) {
                clickNext();
            }
            // 72 stand for "H" key, 191 stand for "?" key
            if (e.keyCode==72||e.keyCode==191) {

            }
        }

        // display the previous image
        private function clickPre(e:Event=null):void {
            _currentCover--;
            if (_currentCover<0) {
                _currentCover=coverflowItemsTotal-1;
            }
            coverSlider.value=_currentCover;
            gotoCoverflowItem(_currentCover);
        }

        // display the next image

        private function clickNext(e:Event=null):void {
            _currentCover++;
            if (_currentCover>coverflowItemsTotal-1) {
                _currentCover=0;
            }
            coverSlider.value=_currentCover;
            gotoCoverflowItem(_currentCover);
        }

        // loading the XML
        private function loadXML():void {

            //Loads XML passed through FlashVars
            var xml_source:String = _stage.loaderInfo.parameters["xmlPath"];

            //If XML not found through FlashVars then defaults to xml path below
            if(xml_source == null) {
                xml_source = 'xml/data.xml';
            }

            // loading the cover xml here
            coverflowXMLLoader = new URLLoader();
            coverflowXMLLoader.load(new URLRequest("xml/data.xml"));
            coverflowXMLLoader.addEventListener(Event.COMPLETE, coverflowXMLLoader_Complete);
            coverflowXMLLoader.addEventListener(IOErrorEvent.IO_ERROR, coverflowXMLLoader_IOError);

        }

        // parse the XML
        private function coverflowXMLLoader_Complete(e:Event):void {
            coverflowXML=new XML(e.target.data);
            coverflowItemsTotal=coverflowXML.cover.length();
            coverflowSpacing=Number(coverflowXML.@coverflowSpacing);
            coverflowImageWidth=Number(coverflowXML.@imageWidth);
            coverflowImageHeight=Number(coverflowXML.@imageHeight);
            coverLabelPositionY=Number(coverflowXML.@coverLabelPositionY);
            coverSlidePositionY=Number(coverflowXML.@coverSlidePositionY);
            transitionTime=Number(coverflowXML.@transitionTime);
            centerCoverflowZPosition=Number(coverflowXML.@centerCoverflowZPosition);

            //Image Border
            padding = Number(coverflowXML.@imagePadding)

            //Reflection Attributes
            reflectionAlpha=Number(coverflowXML.@reflectionAlpha);
            reflectionRatio=Number(coverflowXML.@reflectionRatio);
            reflectionDistance=Number(coverflowXML.@reflectionDistance);
            reflectionUpdateTime=Number(coverflowXML.@reflectionUpdateTime);
            reflectionDropoff=Number(coverflowXML.@reflectionDropoff);

            startIndex=Number(coverflowXML.@startIndex);
            startIndexInCenter = (coverflowXML.@startIndexInCenter.toLowerCase().toString()=="yes");
            _target=coverflowXML.@target.toString();

            for (var i=0; i<coverflowItemsTotal; i++) {

                //Make An Object To Hold Values
                var _obj:Object = new Object();

                //Set Values To Object from XML for each CoverflowItem
                _obj.image = (coverflowXML.cover[i].@img.toString());
                _obj.title = (coverflowXML.cover[i].@title.toString());
                _obj.link = (coverflowXML.cover[i].@link.toString());
                _data[i] = _obj;

            }
            loadCover();
        }

        private function coverflowXMLLoader_IOError(event:IOErrorEvent):void {
            trace("Coverflow XML Load Error: "+ event);
        }

        // load the image cover when xml is loaded
        private function loadCover():void {

            for (var i:int = 0; i < coverflowItemsTotal; i++) {
                var cover:Sprite=createCover(i,_data[i].image);
                coverArray[i]=cover;
                cover.y=centerY;
                cover.z=0;
                coverflowItemContainer.addChild(cover);
            }

            if (startIndexInCenter) {
                startIndex=coverArray.length>>1;
                gotoCoverflowItem(startIndex);

            } else {

                gotoCoverflowItem(startIndex);

            }
            _currentCover=startIndex;
            coverSlider=new Scrollbar(coverflowItemsTotal,_stage);
            coverSlider.value=startIndex;
            coverSlider.x = (_stage.stageWidth/2) - (coverSlider.width/2);
            coverSlider.y=_stage.stageHeight-40;
            coverSlider.addEventListener("UPDATE", coverSlider_Update);
            coverSlider.addEventListener("PREVIOUS", coverSlider_Previous);
            coverSlider.addEventListener("NEXT", coverSlider_Next);
            addChild(coverSlider);

            //coverLabel.x = (sw - coverLabel.width)>>1;
            coverLabel.x = (_stage.stageWidth/2) - (coverLabel.width/2);
            coverLabel.y=coverLabelPositionY;
            addChild(coverLabel);

            addChild(coverSlider);
            addChild(coverLabel);

        }

        private function coverSlider_Update(e:Event):void {
            var value:Number=(coverSlider.value);
            gotoCoverflowItem(value);
            e.stopPropagation();
        }

        private function coverSlider_Previous(e:Event):void {
            clickPre();
        }

        private function coverSlider_Next(e:Event):void {
            clickNext();
        }

        // move to a certain cover via number
        private function gotoCoverflowItem(n:int):void {
            _currentCover=n;
            reOrderCover(n);
            if (coverSlider) {
                coverSlider.value=n;
            }
        }

        ExternalInterface.addCallback("gotoCover", gotoCoverflowItem);

        private function cover_Selected(event:CoverflowItemEvent):void {

            var currentCover:uint=event.data.id;

            if (coverArray[currentCover].rotationY==0) {
                try {
                    // open the link if user click the cover in the middle again
                    if (_data[currentCover].link!="") {
                        navigateToURL(new URLRequest(_data[currentCover].link), _target);
                    }

                } catch (e:Error) {
                    //
                }

            } else {
                gotoCoverflowItem(currentCover);

            }

        }

        // change each cover's position and rotation
        private function reOrderCover(currentCover:uint):void {
            for (var i:uint = 0, len:uint = coverArray.length; i < len; i++) {
                var cover:Sprite=coverArray[i];

                if (i<currentCover) {
                    //Left Side
                    TweenLite.to(cover, transitionTime, {x:(centerX - (currentCover - i) * coverflowSpacing - coverflowImageWidth/2), z:(coverflowImageWidth/2), rotationY:-65});
                } else if (i > currentCover) {
                    //Right Side
                    TweenLite.to(cover, transitionTime, {x:(centerX + (i - currentCover) * coverflowSpacing + coverflowImageWidth/2), z:(coverflowImageWidth/2), rotationY:65});
                } else {
                    //Center Coverflow
                    TweenLite.to(cover, transitionTime, {x:centerX, z:centerCoverflowZPosition, rotationY:0});

                    //Label Handling
                    coverLabel._text.text=_data[i].title;
                    coverLabel.alpha=0;
                    TweenLite.to(coverLabel, 0.75, {alpha:1,delay:0.2});

                }
            }
            for (i = 0; i < currentCover; i++) {
                addChild(coverArray[i]);
            }
            for (i = coverArray.length - 1; i > currentCover; i--) {
                addChild(coverArray[i]);
            }

            addChild(coverArray[currentCover]);
            if (coverSlider) {
                addChild(coverSlider);
                addChild(coverLabel);
            }
        }

        //Create CoverflowItem and Set Data To It
        private function createCover(num:uint, url:String):Sprite {

            //Setup Data
            var _data:Object = new Object();
            _data.id=num;

            //Create CoverflowItem
            var cover:CoverflowItem=new CoverflowItem(_data);

            //Listen for Click
            cover.addEventListener(CoverflowItemEvent.COVERFLOWITEM_SELECTED, cover_Selected);

            //Set Some Values
            cover.name=num.toString();
            cover.image=url;
            cover.padding=padding;
            cover.imageWidth=coverflowImageWidth;
            cover.imageHeight=coverflowImageHeight;
            cover.setReflection(reflectionAlpha, reflectionRatio, reflectionDistance, reflectionUpdateTime, reflectionDropoff);

            //Put CoverflowItem in Sprite Container
            var coverItem:Sprite = new Sprite();
            cover.x=- coverflowImageWidth/2-padding;
            cover.y=- coverflowImageHeight/2-padding;
            coverItem.addChild(cover);
            coverItem.name=num.toString();

            return coverItem;
        }

    }
}

我添加的代码是:

ExternalInterface.addCallback("gotoCover", gotoCoverflowItem);

请帮忙!

最佳答案

将ExternalInterface 调用放在Coverflow 构造函数的末尾应该可以按需要工作。您当前的行不在函数内。

我不知道您的 JavaScript 是什么样的,但此代码需要 gotoCoverflowItem 的参数,因此我假设您正在传递适当的数据。

我还没有浏览完所有代码,但请记住,当前代码可能会执行某些操作 - 如果您仅向其提供下一个封面的索引,则可能无法完成这些操作。我确实在 gotoColorflowItem 函数中看到了根据选择更新 slider 和当前封面的变量的代码,因此可能没问题。

此外,如果您出于任何原因尝试在浏览器之外进行测试,则很可能会遇到运行时错误,因此您可能需要针对这种情况进行 try/catch。

作者在页面上包含了他的智慧:

“注意:我不建议尝试使用此文件学习 Flash。有很多人询问如何更改文本颜色,如果您有这些请求,我建议您浏览一些 Lynda.com Flash 教程来获取您熟悉 Flash 或聘请 Flash 开发人员来帮助您。”

关于javascript - 使用ExternalInterface访问Flash中的未定义属性错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6180009/

相关文章:

javascript - 如何在iOS浏览器中录制音频?

javascript - 下拉列表的第一个选项不是一个选项;强制使用其他选项

actionscript-3 - ActionScript 3 : Check an array for a match

actionscript-3 - 垃圾收集 - 手动删除所有内容!

actionscript-3 - 来自套接字的AS3/AIR readObject()-如何检查已接收到的所有数据?

javascript - Bootstrap Alert 的干净示例

javascript - 显示 JavaScript 变量数组

javascript - JavaScript 中的 DOM 和 BOM 是什么?

如果列有多个 DIV,JavaScript 函数会查找并更改列的 CSS

html - 为了让 Pelican 生成的 html 链接到图像,表达路径的正确方法是什么?