↓(こういうやつ)
FirefoxProgressCircle.as
package { import flash.display.Sprite; import flash.events.Event; import flash.events.TimerEvent; import flash.utils.Timer; /** * FirefoxProgressCircle */ public class FirefoxProgressCircle extends Sprite { /** * 回転度数 */ protected var _rotate:int = 35; /** * 円の配置間隔 */ protected var _span:int = 45; /** * 円の半径 */ protected var _radius:Number = 1.9; /** * 円周サイズ */ protected var _size:int = 6; /** * カラー */ protected var _color:uint = 0x333333; /** * タイマー * * @default null */ protected var _timer:Timer; /** * サークル * * @default null */ protected var _circle:Sprite; /** * コンストラクタ */ public function FirefoxProgressCircle() { super(); // タイマー設定 this._timer = new Timer(50, 0); this._timer.addEventListener(TimerEvent.TIMER, this._onTimer); // サークル描画 this._circle = this._createCircle(); // 子オブジェクト追加 this.addChild(this._circle); // イベント登録 this.addEventListener(Event.ADDED_TO_STAGE, this._onStage); this.addEventListener(Event.REMOVED, this._onRemove); } /** * ステージ追加イベント * * @param event イベント (OPTIONAL) */ protected function _onStage(event:Event = null):void { // イベント登録 this.stage.addEventListener(Event.RESIZE, this._onResize); // 位置調整 this.x = this._size; this.y = this._size; this._onResize(); // 回転開始 this._timer.start(); } /** * 削除イベント * * @param event イベント (OPTIONAL) */ protected function _onRemove(event:Event = null):void { // リサイズイベント削除 if (this.stage.hasEventListener(Event.RESIZE)) { this.stage.removeEventListener(Event.RESIZE, this._onResize); } } /** * リサイズイベント * * @param event イベント (OPTIONAL) */ protected function _onResize(event:Event = null):void { // 位置調整 this._circle.x = this.stage.stageWidth / 2 - this._circle.width / 2; this._circle.y = this.stage.stageHeight / 2 - this._circle.height / 2; } /** * タイマーイベント * * @param event イベント (OPTIONAL) */ protected function _onTimer(event:TimerEvent = null):void { this._circle.rotation += this._rotate; } /** * サークル生成 * * @return Spriteオブジェクト */ protected function _createCircle():Sprite { var circle:Sprite = new Sprite(); var rotation:int = 0; var cnt:int = 0; // 0~360度を一周するループ処理 while (rotation < 360) { // 一定の間隔で増やし続ける rotation += this._span; // 角度からラジアンに変換 var radius:Number = rotation * Math.PI / 180; // サイン値を取得 var sin:Number = Math.sin(radius); // コサイン値を取得 var cos:Number = Math.cos(radius); // アルファ var alpha:Number = (100 - (cnt * 15)) / 100; // サークル描画 this._drawCircle(circle, sin * this._size, cos * this._size, this._radius, alpha); // カウンター cnt++; } return circle; } /** * サークル描画 * * @param obj 対象Sprite * @param x x座標 * @param y y座標 * @param r ラジアン * @param alpha アルファ */ protected function _drawCircle(obj:Sprite, x:Number, y:Number, r:Number, alpha:Number):void { var s:int = 8; var a:Number = Math.tan(Math.PI / s); var b:Number = Math.sin(Math.PI / (s / 2)); obj.graphics.beginFill(this._color, alpha); obj.graphics.moveTo(x + r, y); obj.graphics.curveTo(r + x, a * r + y, b * r + x, b * r + y); obj.graphics.curveTo(a * r + x, r + y, x, r + y); obj.graphics.curveTo(-a * r + x, r + y, -b * r + x, b * r + y); obj.graphics.curveTo(-r + x, a * r + y, -r + x, y); obj.graphics.curveTo(-r + x, -a * r + y, -b * r + x, -b * r + y); obj.graphics.curveTo(-a * r + x, -r + y, x, -r + y); obj.graphics.curveTo(a * r + x, -r + y, b * r + x, -b * r + y); obj.graphics.curveTo(r + x, -a * r + y, r + x, y); obj.graphics.endFill(); } } }
使い方(例:ドキュメントクラスで使用する場合)
// 生成 var circle:FirefoxProgressCircle = new FirefoxProgressCircle(); this.addChild(circle); // ローディングが終了して不要になったら、ステージから削除すればOK this.removeChild(circle);
0 件のコメント:
コメントを投稿