`
it_liuyong
  • 浏览: 100489 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义DownloadProgressBar

    博客分类:
  • flex
 
阅读更多
最近在思考如何能够让自己的Flex(或者AS3)程序在初始化时更加漂亮,答案就是使用自定义preloader,即DownloadProgressBar,以下就是自定义DownloadProgressBar,这个自定义的DownloadProgressBar包括一个image和一个根据下载进度前进的进度条。先说说原理:)
1、首先你需要extends DownloadProgressBar。
2、使用Loader方法load进来一个image图片,例如png等格式,并addChild到DownloadProgressBar里面。
3、然后重写set proloader方法,这点很重要。
4、然后添加4个监听事件,并实现4个监听时间的具体方法和进一步操作
preloader.addEventListener(ProgressEvent.PROGRESS, myHandleProgress);
preloader.addEventListener(Event.COMPLETE, myHandleComplete);
preloader.addEventListener(FlexEvent.INIT_PROGRESS, myHandleInitProgress);
preloader.addEventListener(FlexEvent.INIT_COMPLETE, myHandleInitEnd);

5、preloader.addEventListener(ProgressEvent.PROGRESS, myHandleProgress); 这里可以得到bytesLoaded和bytesTotal的內容,
6,在使用graphics画一個長方形,并且这个长方形的长就是bytesLoaded/bytesTotal。这样就能实时显示下载进度。
package com.sheldon.pro.utils{
    import flash.display.*;
    import flash.events.*;
    import flash.filters.BitmapFilterQuality;
    import flash.filters.BlurFilter;
    import flash.geom.Matrix;
    import flash.net.*;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import mx.events.FlexEvent;
    import mx.preloaders.DownloadProgressBar;
    public class MyDownProBar extends DownloadProgressBar{
       private var logo: Loader;
       private var txt: TextField;
       private var _barSprite:Sprite;
       private var _preloader:Sprite;
       //private var ProgressBarSpritIsAdded:Boolean = false;
       public function MyDownProBar(){
           logo =  new Loader();
           logo.load(new URLRequest("assets/panelicon.png"));
           addChild(logo);
           var style : TextFormat = new TextFormat(null,null,0xFFFFFF,null,null,null,null,null,"center");
           txt = new TextField();
           txt.defaultTextFormat = style;
           txt.width = 200;
           txt.selectable = false;
           txt.height = 20;
           addChild(txt);
           super();
       }
       //重写preloader,让swf执行加载的时候~进行你希望的操作~
       override public function set preloader(value:Sprite):void{
           _preloader = value;
           //四个侦听~分别是 加载进度 / 加载完毕 / 初始化进度 / 初始化完毕
_preloader.addEventListener(ProgressEvent.PROGRESS,load_progress);
_preloader.addEventListener(Event.COMPLETE,load_complete);
_preloader.addEventListener(FlexEvent.INIT_PROGRESS,init_progress);
_preloader.addEventListener(FlexEvent.INIT_COMPLETE,init_complete);
           stage.addEventListener(Event.RESIZE,resize);
           resize(null);
       }
       private function remove():void{
_preloader.removeEventListener(ProgressEvent.PROGRESS,load_progress);
_preloader.removeEventListener(Event.COMPLETE,load_complete);

_preloader.removeEventListener(FlexEvent.INIT_PROGRESS,init_progress);_preloader.removeEventListener(FlexEvent.INIT_COMPLETE,init_complete);

           stage.removeEventListener(Event.RESIZE,resize);
       }
       private function resize(e:Event):void{
           logo.x = (stage.stageWidth -40)/2;
           logo.y = (stage.stageHeight - 80)/2-20;
           txt.x = (stage.stageWidth - 200)/2;
           txt.y = logo. y +65;
          
           graphics.clear();
           graphics.beginFill(0x333333);
           graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
           graphics.endFill();
       }
       private function load_progress(e : ProgressEvent):void{
           addProgressBarSprit();
           txt.text = "正在加载..."+int(e.bytesLoaded/e.bytesTotal*100)+"%";
           //txt.text = "已下载 " + e.bytesLoaded + " byte,总大小 " + e.bytesTotal + " byte.";
           drawProgressBar(e.bytesLoaded, e.bytesTotal);
           //if (txt != null){
              //txt.text = "下载进度:已下载 " + e.bytesLoaded + " byte,总大小 " + e.bytesTotal + " byte.";
           //}        
           //drawProgressBar(e.bytesLoaded, e.bytesTotal);
       }
       private function load_complete(e:Event):void{
           if(txt != null){
              txt.text = "加载完毕!";
           }
           drawProgressBar(1,1);
       }
       private function init_progress(e:FlexEvent):void{
           if(txt != null){
              txt.text ="正在初始化...";
           }
           drawProgressBar(1,1);
       }
       private function init_complete(e:FlexEvent):void{
           if(txt != null){
              txt.text = "初始化完毕!";
           }
           drawProgressBar(1,1);
           remove();
           //最后这个地方需要dpe一个Event.COMPLETE事件..表示加载完毕让swf继续操作~
           dispatchEvent(new Event(Event.COMPLETE));
       }
      
       private function addProgressBarSprit():void{
           //绘制背景渐变
           var matrix : Matrix = new Matrix();
           matrix.createGradientBox(this.stage.stageWidth,this.stage.stageHeight,Math.PI/2);
           var colors : Array=[0x05BBD,0xFFFFFF];
           var alphas : Array=[1,1];
           var ratios : Array=[0,255];
           this.graphics.lineStyle();
           this.graphics.beginGradientFill(GradientType.LINEAR,colors,alphas,ratios,matrix);
           this.graphics.drawRect(0,0,this.stage.stageWidth,this.stage.stageHeight);
           this.graphics.endFill();
          
           //绘制中心白色发光
           var _Sprite1 : Sprite = new Sprite();
           addChild(_Sprite1);
           _Sprite1.graphics.beginFill(0xffffff,0.45);
       _Sprite1.graphics.drawEllipse(this.stage.stageWidth/2-145,this.stage.stageHeight/2-105,280,100);
           _Sprite1.graphics.endFill();
           //滤镜实现发光边缘柔和
           var blur : BlurFilter = new BlurFilter();
           blur.blurX = 100;
           blur.blurY = 50;
           blur.quality = BitmapFilterQuality.HIGH;
           _Sprite1.filters = [blur];
          
           //绘制进度条背景
           var _Sprite2:Sprite = new Sprite();
           addChild(_Sprite2);
           _Sprite2.graphics.lineStyle(1,0xCCCCCC);
           _Sprite2.graphics.beginFill(0xFFFFFF);
           _Sprite2.graphics.drawRect(this.stage.stageWidth/2-165,this.stage.stageHeight/2 -23,304,20);
           _Sprite2.graphics.endFill();
          
           //--------------------------------
           //加载进度条Sprite
           _barSprite = new Sprite();
           addChild(_barSprite);
           _barSprite.x = this.stage.stageWidth/2 -163;
           _barSprite.y = this.stage.stageHeight/2 -21;
          
           //---------------------------------
           //加载进度条文字
//         txt = new TextField();
//         addChild(txt);
//         txt.textColor = 0x333333;
//         txt.width = 300;
//         txt.height = 18;
//         txt.x = this.stage.stageWidth/2-152;
//         txt.y = this.stage.stageHeight/2 + 20;
       }
      
       //刷新进度条
       private function drawProgressBar(bytesLoader:Number,bytesTotal:Number):void{
           if(_barSprite != null && txt !=null){
              var g:Graphics = _barSprite.graphics;
              g.clear();
             
              var matrix : Matrix = new Matrix();
              matrix.createGradientBox(300*(bytesLoader/bytesTotal),16,Math.PI/2);
              var colors : Array = [0x0099CC,0x99cc77];
              var alphas:Array=[1,1];
              var ratios : Array = [0,255];
              g.lineStyle();
              g.beginGradientFill(GradientType.LINEAR,colors,alphas,ratios,matrix);
              g.drawRect(0,0,300*(bytesLoader/bytesTotal),16);
              g.endFill();
           }  
       }
    }
}



Flex4中应用这个自定义的DownloadProgressBar.as

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
              xmlns:s="library://ns.adobe.com/flex/spark"
              xmlns:ho="library://ns.adobe.com/flex/halo"
              xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
           preloader="com.sheldon.pro.utils.MyDownProBar">

</s:Application>
分享到:
评论
1 楼 chensong215 2015-04-29  
无法获取到ProgressEvent中的bytesTotal

相关推荐

    flex3自定义DownloadProgressBar

    本文将围绕“flex3自定义DownloadProgressBar”这一主题展开,讲解如何在Flex3中创建一个定制化的下载进度条组件,并探讨相关的编程技术和实践。 一、自定义组件基础 在Flex中,自定义组件是通过继承已有的...

    安卓进度条loadingprogress相关-DownloadProgressBar特别的进度条.rar

    在给定的资源"安卓进度条loadingprogress相关-DownloadProgressBar特别的进度条.rar"中,我们可以找到一些关于自定义进度条的实践案例,尤其是针对下载进度显示的`DownloadProgressBar`。这个特殊的进度条可能包含了...

    仿华为应用市场下载进度条

    本文将深入探讨如何仿照华为应用市场的下载进度条来实现一个自定义的DownloadProgressBar。这个过程涉及到Android图形绘制、线程管理、事件监听以及动画效果的实现。 首先,我们需要了解华为应用市场下载进度条的...

    安卓个性进度条

    4. **自定义控件库**:一些开源项目提供了预设的个性进度条,例如,这个压缩包中的`DownloadProgressBar-master`可能就是一个自定义进度条库。开发者可以直接集成这些库,快速实现各种酷炫效果。 三、使用步骤 使用...

    Android代码-DownloadPorgressBar

    这个项目名为"Android代码-DownloadProgressbar",显然旨在教我们如何在Android应用中实现一个自定义的下载进度条。下面,我们将深入探讨这个主题,并结合可能的源代码文件来理解其工作原理。 首先,下载进度条通常...

    一个比较常见的进度下载效果

    源码名为`DownloadProgressBar`,表明这是一个自定义的进度条控件,旨在提供更吸引用户的界面体验。 `DownloadProgressBar`的设计灵感可能来源于Dribbble这样的设计社区,这些社区经常有设计师分享他们的创新设计,...

    Android实现百分比下载进度条效果

    Android实现百分比下载进度条效果的主要思想是通过自定义View实现,首先需要在attrs.xml文件中定义一个自定义属性,即百分比文字的大小,然后在DownLoadProgressbar.java文件中编写自定义View的代码。在自定义View...

    ProgressBar

    在HTML5中,`&lt;progress&gt;`元素提供了内置的进度指示功能,但为了自定义样式和交互,开发者往往会选择使用CSS和JavaScript进行更复杂的实现。 在"DownloadProgressBar"源码中,我们可以期待以下几个关键点: 1. **...

    Android高级应用源码-多线程网络下载.zip

    其中,"DownloadProgressBar"很可能是一个专门用于显示下载进度的自定义控件。 1. **多线程网络下载**: 在Android中,由于主线程(UI线程)负责处理用户交互,因此网络请求不能在主线程中进行,否则会导致应用无...

    安卓文件下载上传解压相关-多线程网络下载.rar

    `DownloadProgressBar`可能是一个自定义的UI组件,用于显示下载进度,它能够实时更新每个线程的下载进度并合并成整体的进度条。 JavaApk源码说明可能包含了一个简单的多线程下载示例,你可以通过阅读源码来学习如何...

Global site tag (gtag.js) - Google Analytics