Flash製作Mosaic效果還滿常見的
但要給設計師們使用這樣的類別,好像不是那麼容易
就想到TweenMax有Plugin的概念, 讀了一下原理,就自己寫一個
這樣只要會使用TweenMax就可以使用這樣的效果。
線上Demo
需要再下載gs.TweenMax類別才能使用喔
完整程式碼
但要給設計師們使用這樣的類別,好像不是那麼容易
就想到TweenMax有Plugin的概念, 讀了一下原理,就自己寫一個
這樣只要會使用TweenMax就可以使用這樣的效果。
線上Demo
需要再下載gs.TweenMax類別才能使用喔
完整程式碼
/** /** * @author milkmidi * @see http://milkmidi.blogspot.com * @version 1.0.0 * @date created 2010/04/16/ */ package milkmidi.tweenmax.plugins { import flash.display.*; import flash.geom.*; import gs.plugins.TweenPlugin; import gs.TweenLite; public class MosaicPlugin extends TweenPlugin { public static const VERSION :Number = 1.0; public static const API :Number = 1.0; private var _target :Sprite; private var _bitmap :Bitmap; private var _targetWidth:int; private var _targetHeight:int; private var _startValue :int = 0; private var _endValue :int = 20; private var _autoDestroy:Boolean = true; public function MosaicPlugin() { super(); this.propName = "mosaic"; this.overwriteProps = ["mosaic"]; this.onComplete = onCompleteTween; } override public function onInitTween(pTarget:Object, pValue:*, $tween:TweenLite):Boolean { if (!(pTarget is Sprite)) { trace("motionBlur tweens only work for DisplayObjects"); return false; } _target = pTarget as Sprite; _bitmap = _target.getChildByName("_mosaic_bitmap") as Bitmap; if (_bitmap == null) { _bitmap = new Bitmap(); _bitmap.name = "_mosaic_bitmap"; } if (typeof(pValue) != "object") { trace("parameter must be object"); return false; } _startValue = pValue.start; _endValue = pValue.end; _autoDestroy = (pValue.autoDestroy == undefined) ? true: pValue.autoDestroy ; _target.addChild(_bitmap); _targetWidth = _target.width; _targetHeight = _target.height; return true; } public function onCompleteTween():void { if (_autoDestroy==false) return; if(_target.contains(_bitmap)) _target.removeChild(_bitmap); try { _bitmap.bitmapData.dispose(); }catch (err:Error){} _bitmap = null; } override public function killProps($lookup:Object):void { super.killProps($lookup); _autoDestroy = true; onCompleteTween(); } override public function get changeFactor():Number { return super.changeFactor; } override public function set changeFactor(value:Number):void { super.changeFactor = value; var _pixelSize:Number; if (_startValue < _endValue) _pixelSize = (value * _endValue) + 1 + _startValue; else _pixelSize = ((1 - value) * _startValue) + 1 + _endValue; _bitmap.bitmapData = new BitmapData(_targetWidth / _pixelSize, _targetHeight / _pixelSize, false); var _matrix:Matrix = new Matrix(); _matrix.scale(1 / _pixelSize, 1 / _pixelSize); _bitmap.visible = false; _bitmap.bitmapData.draw(_target, _matrix); _bitmap.visible = true; _bitmap.width = _targetWidth; _bitmap.height = _targetHeight; } } }測試用程式
/** * @author milkmidi * @see http://milkmidi.blogspot * @version 1.0.1 * @date created 2010/04/15/ */ package { import flash.display.*; import flash.events.MouseEvent; import gs.* import gs.plugins.*; import gs.easing.*; import milkmidi.tweenmax.plugins.MosaicPlugin; public class MotionBlurPluginDemo extends Sprite { [Embed(source='demo300x300.jpg')] public static const Texture:Class; public function MotionBlurPluginDemo() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; var mc:Sprite = addChild(new Sprite()) as Sprite; mc.addChild( new Texture() ); addChild(mc); TweenPlugin.activate([MosaicPlugin]); //啟動 MosaicPlugin //之後就可以使用 mosaic 屬性 //mosaic 屬性現別必需要是Object, //可以使用的參數有 /* * start: 開啟的mosaic效果, * end:結束的mosaic效果, * autoDestroy: 當TweenMax完成時, 是否自動摧毀該效果, 預設值是true */ mc.addEventListener(MouseEvent.ROLL_OVER , function ():void { TweenMax.to(mc, .8, { mosaic: { start:0, end:20 , autoDestroy:false } } ); }); mc.addEventListener(MouseEvent.ROLL_OUT , function ():void { TweenMax.to(mc, .8, { mosaic: { start:20, end:0 } } ); }); } } }
留言
而且大家都會用TweenMax,就掛進去就好了
super();
的作用嗎?
謝謝
分二部份來說明
在建構函式時
super是呼叫父系的建函含式
如:父.as
public function 父(參數一){}
子.as
public function 子{
//因為父類別有明確規定要帶一個參數
//所以子類別在建立時, 也要帶一個參數父類別
//此時就寫成
super(參數一)
}
另一個出現的時機點:
父.as
public function 喝奶茶():void{}
子.as
因為是繼承關系, 所以子類別也有 喝奶茶 方法
而子類別如果要呼叫該方法時
可以寫:
喝奶茶(); //呼叫自己的方法, 但因為自己的該方法並沒有被重新override掉, 所以就視同呼叫父的方法
或是
super.喝奶茶(); //呼叫父系的方法。
如果子.as
override public function 喝奶茶():void{}
那在子.as寫
喝奶茶();//呼叫自己override掉的喝奶茶
跟super.喝奶茶()//呼叫父系的喝奶茶
會有這樣的差別
可是我看老師的super()並沒有帶參數
super()如果沒帶參數
指的就是呼叫父系的建構函式
反正不寫也是會執行。
所以沒什麼差別,
如果要說有差的話,
在進階一點的類別寫法才會有差
我在作 TweenMax 時,遇上一個動作不知道如何使用
TweenMax 才能達到這樣子的效果。
我的情形是~
有一個 mc 元件,想要以 Quad.easeInOut 的方式
本來是要移動到 y = 300 位置才作結束的,但是中間
可能會發生某些條件而必需以 Quad.easeInOut 的方式
提前在 y = 100 就完成,目前我想到的是用 killXXXX
之類的,但是這樣就無法讓提前在 y = 100 位置時,
能以Quad.easeInOut 的移動方式提前結束這次的 TweenMax
移動。
拜託老師一下。
感恩
因為你要中斷他,就不可能完整的跑完你要的 easing 效果