【问题标题】:text highlights only for a fraction of a seconds文本仅突出显示几分之一秒
【发布时间】:2011-12-16 21:32:01
【问题描述】:

好的 - 希望这是我关于 Flash 的最后一篇文章:

我正在尝试突出显示滚动窗格中的文本。 现在我尝试在不使用滚动窗格的情况下突出显示它,但问题是一样的,文本被突出显示了几分之一秒,然后又恢复正常。

我正在使用 greensock LoaderMax 库将外部 swf 加载到滚动窗格中。

我试图保持简短,但它是这样工作的:

编辑:完整和当前 SRC

package {

import flash.display.MovieClip;
import flash.display.Stage;


//import fl.controls.Button;
import flash.display.SimpleButton;
// javascript call
import flash.external.ExternalInterface;
import flash.text.TextField;
import fl.motion.MotionEvent;
import flash.display.DisplayObject;
import flash.events.MouseEvent;
import fl.containers.ScrollPane;
import fl.events.ScrollEvent;

//important for scrollpane events
import flash.events.Event;

import flash.text.TextSnapshot;

import flash.display.Loader;
import flash.net.URLRequest;
import flash.display.Sprite;
//cursors n' shit
import flash.ui.Mouse;

//debugging
import flash.utils.describeType;

import flash.system.LoaderContext;
import flash.system.ApplicationDomain; 
import flash.errors.IOError;
import flash.events.IOErrorEvent;

import flash.display.LoaderInfo;

//timer
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.utils.*;
/*
importing libraries:
Edit > Preferences > ActionScript > ActionScript 3.0 Settings > Source path
make sure to set path to parent of com folder or whatever

*/
import com.greensock.*;
import com.greensock.loading.*;
import com.greensock.events.LoaderEvent;
import com.greensock.loading.display.*;
import flash.geom.Rectangle;
import flash.display.IBitmapDrawable;





/*
In order to use the line this.addChild(border) your class has to be a display container. movieclip and sprite are the most common to use.
dont forget renaming the class here!
*/
public class expViewer10 extends MovieClip {

     var mc2:MovieClip;

     var nextPageButton:SimpleButton;
     var prevPageButton:SimpleButton;
     var jsButton:SimpleButton
     var searchButton:SimpleButton;


    var firstX:int = 0;
    var firstY:int = 0;
    var touchDown:Boolean = false;
    var startPos:int = 0;
    var textPos:int = 0; // aka endPos
    var oldStartPos:int = 0;
    var oldTextPos:int = 0; // aka endPos
    var currentlySelecting:Boolean = false;
    var currentText:String = "";
    var newSelection:Boolean = false;
    var snapshotTrigger:Boolean = false;

    // colors
    var preSelectionColor:Number = 0xDDAB00;
    var selectionColor:Number = 0xFFEF00;

     // array of arrays with [0] one selection
    //          [0][0] id [0][1] startPos ...[2] endPos [3] text
    var selectionsArray:Array = new Array();


    var theRectangle:DisplayObject;
    var markCounter:TextField;

    //mcScrollBar.setScrollProperties(1, 1, 4 );

    // need to be outside of function
    // initialize on enterframe
    //var snapTextArray:Array = new Array();
    var allSWFLoaded:Boolean = false;

    var avoidJumpingMarker:int = 0;

    var mc:MovieClip  = new MovieClip();;
        //addChild(mc);
        //addChild(container); // just gotta add containes to stage?
    var myLoader:Loader = new Loader();                     // create a new instance of the Loader class

    var url:URLRequest = new URLRequest("tmp1.swf"); // in this case both SWFs are in the same folder 

    var bob:Boolean = false;    


    var captureButton:SimpleButton;

    var markUpButton:SimpleButton;

     // hack, just initialize once
    var dummySprite:Sprite  = new Sprite();

         //var scrollPane:ScrollPane = scrollPaneOnStage;
    var scrollPane:ScrollPane;

    var libMC:MovieClip;     

    var loader:Loader;   

    var fLoader:forcibleLoader;
    var queue:LoaderMax;
    var markUpQueue:LoaderMax;



    var loaderArray:Array;
    var mcArray:Array;
    var mcArrayTest:Array = new Array();
    //
    var offSetArray:Array;
    var currentClip:int;

    var snapText:TextSnapshot;

    var snapTextArrayOffset:Array = new Array();


    var inter:int = 0;
    var noPages:int = 0;
    var pagesLoaded = 0;
    var justAMovieClip:MovieClip;

    // renanme this as well!
    public function expViewer10() {

        // wait till this class has been added to the stage!
        this.addEventListener(Event.ADDED_TO_STAGE, attachButtonsNStuff);


        // dont use this, button should be there already
        //addChild(nextPageButton); 
        //attachButtonsNStuff();




    }

    private function attachButtonsNStuff(evt:Event):void {

        //scrollPane = new ScrollPane();
        //addChild(scrollPane);
        // constructor code



        queue = new LoaderMax({name:"mainQueue", onProgress:progressHandler, onComplete:checkHandler, onError:onError});


        //this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
        //MovieClip(root).gotoAndStop(1);


        mc.gotoAndStop(1);
        loadPages();


    }

    private function progressHandler(event:LoaderEvent):void {
        //trace("progress: " + event.target.progress);
    }

    private function onError(event:LoaderEvent) {
        // trace("error occured with " + event.target + ": " + event.text);


    }

    private function checkHandler(event:LoaderEvent):void {



            displayPages();




            MovieClip(root).addChild(mc);

            //mcArray[0].textSnapshot.setSelected( 4, 300, true );
            //queue.getContent( ("tmp1") ).rawContent.textSnapshot.setSelected( 4, 300, true );
        setTimeout ( function ( libMC:MovieClip ) : void {
                    try {
                     libMC.textSnapshot.setSelectColor( 0xFF0000 );
                     libMC.textSnapshot.setSelected( 100, 200, true ); 
                    } catch (error:Error) {
                        trace(error.message);

                    } finally {
                        trace("tada");

                    }
                     }, 
                 5000, 
                 mcArray[0]
               );

    }




    private function loadPages():void {

        try{

            noPages = 12;

            for (var i:int = 0 ; i < noPages ; i++){

                queue.append( new SWFLoader("tmp"+(i+1)+".swf", {name:"tmp"+(i+1), container:mc, estimatedBytes:70000, autoPlay:false, autoDispose:false}) );

            }
            queue.load(); 

        } catch (error:Error) {
             // statements
             //ExternalInterface.call("window.alert(\"load err: "+error.message+"\")");
        } finally {
             // statements
        }

    }


    private function displayPages():void {

            //trace('1');

            mcArray = new Array();

            offSetArray = new Array();

            var fromTop:Number = 0;

            var totalChars:int = 0;

            //ExternalInterface.call("window.alert(\"length err: "+loaderArray.length.toString()+"\")");

            for (var i:int=0 ; i < 12 ; i++) {

                //var tempmc:MovieClip =
                //justAMovieClip  = MovieClip(queue.getContent( ("tmp"+(i+1)) ).rawContent);

                mcArray[i] = queue.getContent( ("tmp"+(i+1)) ).rawContent;

                var rect:Rectangle = mcArray[i].getRect(this);

                //trace(inter++);

                //mc.addChild(mcArray[i]);

                mcArray[i].gotoAndStop(1);

                mc.getChildAt(i).y = fromTop;

                offSetArray.push(fromTop);

                fromTop += rect.height + 10; // margin - put on top


                totalChars += mcArray[i].textSnapshot.charCount;
                //ExternalInterface.call("window.alert(\"tot chars: "+totalChars+"\")");
                snapTextArrayOffset.push(totalChars);



            }




    }




}

}

【问题讨论】:

    标签: flash actionscript-3 actionscript highlight movieclip


    【解决方案1】:

    也许您应该在设置颜色之前gotoAndStop 电影剪辑,否则第一个关键帧可能会重置文本。另外,请尝试使用gotoAndStop(1);。影片剪辑上不存在 0 帧。

    编辑

    我记得某些组件的启动例程可能有些延迟。试试这个:

    function checkHandler(event:LoaderEvent):void {
        try {
            libMC = LoaderMax.getContent("childClip").rawContent as MovieClip;
            scrollPane.source = libMC;
            libMC.gotoAndStop(1); 
            setTimeout ( function ( libMC:MovieClip ) : void {
                             libMC.textSnapshot.setSelectColor( 0xFF0000 );
                             libMC.textSnapshot.setSelected( 100, 200, true ); 
                             }, 
                         100, 
                         libMC
                       );
            } catch (error:Error) {
                // statements
                ExternalInterface.call("window.alert(\"error: "+error.message+"\")");
            } finally {
                // statements
            }
        }
    }   
    

    【讨论】:

    • 不幸的是,更改为 gotoAndStop(1) 并没有解决问题 - 在我当前的版本中,它在设置颜色之前已经设置好了。当
    • 根剪辑怎么样?那里还有另一个gotoAndStop(0)。另外,onEnterFrame 发生了什么?
    • 我也改变了那个,但仍然没有区别。 onEnterFrame 目前没有做任何事情
    • 感谢您坚持我的 weltraumpirat。我尝试了您的解决方案,效果为零,也就是几毫秒后无法选择文本(但是这样做时不会引发错误)。我的猜测是 loadermax 的内容在某个地方丢失了,即使它不应该。请检查上面的完整源代码
    • 好的,我自己尝试了一些东西,并搜索了几个互联网资源......我无法让选择显示出来,即使在没有所有加载程序的情况下也是如此东西。 AS3 中的 TextSnapShot 类似乎坏了,或者有问题,或者至少文档很糟糕。你可以改用动态文本字段吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2019-02-27
    • 1970-01-01
    • 2011-03-20
    • 2015-11-20
    相关资源
    最近更新 更多