zoukankan      html  css  js  c++  java
  • loading问题

    以前看到各式各样的Flash启动时的进度条和各式动态显示,就想自己定义一个可以完全自定义的Preloader。

    Google了一下,好像很简单的样子,可实际一操作,还是遇到一些问题。
    首先要完全自定义,只要实现mx.preloaders.IPreloaderDisplay, 然后自定义Listener监听下载
    进度就可以了。道理很简单,但实际做来和自己的想像就不一样了。主要的监听有一下几个:
          value.addEventListener(FlexEvent.INIT_PROGRESS, initProgressHandler);
          value.addEventListener(FlexEvent.INIT_COMPLETE, initCompleteHandler);
          value.addEventListener(ProgressEvent.PROGRESS, progressHandler);
    我以为把进度处理的代码放到progressHandler里面就可以了,因为ProgressEvent里面包含了bytesLoaded和
    bytesTotal,这样就可以计算进度了。但我发现progressHandler每次只进入两次,而且bytesLoaded都是等于bytesTotal的,就是说没有进度了,一次就装入了。我以为是我的swf文件太小,我手工使用embbed font的方法
    加大swf文件大小,加到了30M左右,仍然一次就装入了,哦,我的my god。
    另外一方面,INIT_PROGRESS我以为只会执行一次的,反而执行了多次。而且,执行顺序是:
    PROGRESS两次
    INIT_PROGRESS十次
    INIT_COMPLETE一次
    So, 说明只能使用INIT_PROGRESS来定义进度,反而PROGRESS来进行初始化操作。
    另外还有两个要点:
    1. 要在initComplete里面 dispatchEvent(new Event(Event.COMPLETE)); 
        否则Preloader完了以后进入不了应用。
    2. 我尝试在Sprite里面直接addChild ProgressBar,直接用Skin来定义ProgressBar,岂不是很简单。
        但没有成功。Preloader里面的进度条要自己用graphics直接画出来。
    3. 用initProgress来定义进度,我用12来定义进度的总数。Google上的回答是建议用20左右的总数来定义,
       因为虽然实际只有10个左右,但最后会很快的闪过,所以没有关系。
     
    下面是全部的代码,希望有人可以用到:
    package assets.preloader {
      import mx.preloaders.*; 
      import flash.events.*;
      import mx.events.*;
      import mx.core.BitmapAsset;
      import flash.display.*;
      import flash.utils.*;
      import flash.net.URLRequest;
      import spark.components.Label;
      import flash.text.TextField;
      import flash.text.TextFormat;
      import flash.geom.Matrix;
      import spark.effects.Fade;
      import spark.effects.Wipe;
     
      public class MyPreloader extends Sprite implements IPreloaderDisplay {
        private var progressCount:int;
     
        private static var progressTotal:int = 11;
     
        public function MyPreloader() {   
          super();
     
          progressCount = 0;
        }
     
        private var _backgroundAlpha:Number = 1;
     
        public function get backgroundAlpha():Number {
          if ( !isNaN(_backgroundAlpha) )
            return _backgroundAlpha;
          else
            return 1;
        }
        
        public function set backgroundAlpha(value:Number):void {
          _backgroundAlpha = value;
        }
     
        private var _backgroundColor:uint;
     
        public function get backgroundColor():uint {
          return _backgroundColor;
        }
     
        public function set backgroundColor(value:uint):void {
          _backgroundColor = value;
        }
     
        private var _backgroundImage:Object;
     
        public function get backgroundImage():Object {
          return _backgroundImage;
        }
        
        public function set backgroundImage(value:Object):void {
          _backgroundImage = value;
        }
     
        private var _backgroundSize:String = "";
     
        public function get backgroundSize():String {
          return _backgroundSize;
        }
        
        public function set backgroundSize(value:String):void {
          _backgroundSize = value;
        }
     
        private var _stageHeight:Number = 375;
     
        public function get stageHeight():Number {
          return _stageHeight;
        }
     
        public function set stageHeight(value:Number):void {
          _stageHeight = value;
        }
     
        private var _stageWidth:Number = 500;
     
        public function get stageWidth():Number {
          return _stageWidth;
        }
        
        public function set stageWidth(value:Number):void {
          _stageWidth = value;
        }
     
        public function initialize():void {
        }
        
        private function showDisplayForInit(elapsedTime:int, count:int):Boolean {
          return true;        
        }
     
        private function showDisplayForDownloading(elapsedTime:int, event:ProgressEvent):Boolean {
          return true;
        }
     
        private var _preloader:Sprite; 
     
        public function get preloader():Sprite {
          return _preloader;
        }
         
        public function set preloader(value:Sprite):void {
          _preloader = value;
            
          value.addEventListener(FlexEvent.INIT_PROGRESS, initProgressHandler);
          value.addEventListener(FlexEvent.INIT_COMPLETE, initCompleteHandler);
        
          value.addEventListener(ProgressEvent.PROGRESS, progressHandler);
         }
     
        private function initCompleteHandler(event:Event):void {
          progressText.text = "";
     
          var coverX:uint = 0;
          var coverY:uint = startY;
     
          graphics.lineStyle(0, 0, 0);
          graphics.beginFill(0x393b3e, backgroundAlpha);
          graphics.drawRect(coverX, coverY, event.target.loaderInfo.width, event.target.loaderInfo.height);
     
          var fadeToApp:Fade = new Fade();
     
          fadeToApp.target = image;
          fadeToApp.alphaFrom = 1.0;
          fadeToApp.alphaTo = 0.0;
          fadeToApp.duration = 1000;
          fadeToApp.play();
     
          setTimeout(endPreloader, 1000);
        }
     
        private function endPreloader():void {
          dispatchEvent(new Event(Event.COMPLETE)); 
        }
     
        private function initProgressHandler(event:Event):void {
          progressCount++;
     
          var percent:int = Math.min(Math.round(100*progressCount/progressTotal), 100);
     
          progressText.text = percent.toString() + "%";
     
          drawTrack(percent);
        }
     
        protected function get labelFormat():TextFormat {
          var tf:TextFormat = new TextFormat();
          tf.color = 0xffffff;
            
          tf.font = "Arial";
          tf.size = 20;
          tf.bold = true;
     
          return tf;
        }
     
        [Embed(source="/assets/images/logo.png")] 
        public var logoImage:Class;
        private var image:BitmapAsset = BitmapAsset(new logoImage());
     
        private var progressText:TextField = new TextField();
     
        private var startX:uint;
        private var startY:uint;
     
        private function progressHandler(event:ProgressEvent):void {
          if( progressCount == 0 ) {
            graphics.beginFill(0x393b3e, backgroundAlpha);
            graphics.drawRect(0, 0, event.target.loaderInfo.width, event.target.loaderInfo.height);
     
            startX = (event.target.loaderInfo.width/2) - (barWidth/2);
            startY = (event.target.loaderInfo.height/2) + 30;
     
            drawBar();
     
            addChild(image);
     
            image.x = (event.target.loaderInfo.width/2)-(image.width/2);
            image.y = (event.target.loaderInfo.height/2)-(image.height/2) - 80;
     
            progressText.defaultTextFormat = labelFormat;
     
            addChild(progressText);
     
            progressText.x = (event.target.loaderInfo.width/2) - (progressText.width/2) + 30;
            progressText.y = (event.target.loaderInfo.height/2)-(progressText.height/2) + 50;
     
            ++progressCount;
          }
        }
     
        private const barWidth:int = 300;
        private const barHeight:int = 15;
     
        private function drawBar():void {
          graphics.drawRect(startX, startY, barWidth, barHeight);
        }
     
        private function drawTrack(percent:int):void {
          const outerHighlightColors:Array = [0xFFFFFF, 0xFFFFFF];
          const outerHighlightAlphas:Array = [0.12, 0.80];
          const fillColors:Array = [0xA9A9A9, 0xBDBDBD];
          const fillAlphas:Array = [1, 1];
          const ratios:Array = [0, 255];
            
          var trackWidth:Number = Math.round(barWidth*percent/100);
     
          var m:Matrix = new Matrix();
          m.createGradientBox(trackWidth, barHeight, 90);
            
          graphics.lineStyle(1);
          graphics.lineGradientStyle("linear", outerHighlightColors, outerHighlightAlphas, ratios, m);
          graphics.drawRect(startX, startY, trackWidth, barHeight);
            
          graphics.lineStyle(1, 0x636363);
          graphics.beginGradientFill("linear", fillColors, fillAlphas, ratios, m);
          graphics.drawRect(startX+1, startY+1, trackWidth - 2, barHeight - 2);
          graphics.endFill();
        }
      }
    }
  • 相关阅读:
    time 模块学习
    day 14 自定义模块,常用模块 time .datetime ,time 模块
    day 13 课后作业
    day 12 课后作业
    day 11课后作业
    树状数组最值
    hdu 1059 Dividing bitset 多重背包
    XVII Open Cup named after E.V. Pankratiev. XXI Ural Championship
    最长公共子序列板/滚动 N^2
    Uva 10635
  • 原文地址:https://www.cnblogs.com/regalys168/p/4107607.html
Copyright © 2011-2022 走看看