文本仅突出显示几分之一秒

发布于 2024-12-12 07:31:18 字数 7629 浏览 5 评论 0原文

好的 - 这希望是我关于 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);



            }




    }




}

}

Ok - this is hopefully my last post about flash:

I'm trying to highlight text in a scrollpane.
now I've tried highlighting it without a scrollpane, but the problem is the same, the text gets highlighted for a fraction of a second and then just goes back to normal.

I'm using the greensock LoaderMax library to load an external swf into the scrollpane.

I'm trying to keep things short, but here's how it works:

EDIT: FULL & CURRENT 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);



            }




    }




}

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ˇ宁静的妩媚 2024-12-19 07:31:18

也许您应该在设置颜色之前gotoAndStopMovieClip,否则第一个关键帧可能会重置文本。另外,尝试使用gotoAndStop(1);。 MovieClip 上不存在 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
        }
    }
}   

Perhaps you should gotoAndStop the MovieClip before you set the color, otherwise the first keyframe might reset the text. Also, try using gotoAndStop(1);. The 0 frame does not exist on MovieClips.

EDIT

I remembered that some components might have a somewhat delayed initiation routine. Try this:

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
        }
    }
}   
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文