draw的技巧,说说BitmapData
先看看这个例子:
http://www.ryan-liu.com/demo/bitmapdata/fancydraw.html
做上面这个效果,AS的技术点主要有三个,Matrix变形,ColorTransform和BitmapData的draw方法。这三个技术点串起了做BitmapData最基本的逻辑——也是最基本的思路。我先把draw的说明放这里:
- draw(source:IBitmapDrawable, matrix:Matrix = null, colorTransform:ColorTransform = null, blendMode:String = null, clipRect:Rectangle = null, smoothing:Boolean = false):void
怎么实现变暗/变淡呢,给BitmapData施加一个ColorTransform即可,如:
- var ctm:ColorTransform = new ColorTransform(.9,.9,.9); //逐渐变黑
- var ctm:ColorTransform = new ColorTransform(1,1,1,.9); //逐渐变淡
- var ctm:ColorTransform = new ColorTransform(.9,.8,.8); //你自己猜
以上就完成了做BitmapData效果的基本思路。图像描述物体的两个要素是颜色和形状,颜色已经搞定了,我们再试试变形。draw能通过设置一个matrix来完成变形。你可以看看Flash的帮助,如果你还不了解Matrix。就上例的效果,我给出一个简单的算法:
- var transformMatrix:Matrix = new Matrix();
- var incX:int = sw/40;
- var incY:int = sh/40;
- transformMatrix.a = (sw + incX)/sw;
- transformMatrix.d = (sh + incY)/sh;
- transformMatrix.tx = -incX/2;
- transformMatrix.ty = -incY/2;
配合matrix和colortransform,BitmapData的draw就可以实现上例的效果了。这就构成了BitmapData效果的最基本思路。你还可以加入滤镜使效果更丰富,上例中我加了一个blur滤镜。完整的代码请看附件。
补充两点:
- 设置blendMode也可以实现不同的效果,自己试试
- “我不要残影怎么办!”,那就在重绘前将画布清空,用fillRect或干脆new一个BitmapData
最后:或许有人问,为啥例子中画面上部和下部看起来不同。这个我也很纳闷,而且一直没找到解释。也许只能让Adobe来回答了……这个问题已解决,根据ycccc8202的建议,用另外一个BitmapData复制画布的画面,让画布draw替代的BitmapData就不会出现问题。
补充:
为了美观,我网站上的例子都是比较综合性的应用。而我近期所发都只针对BitmapData相关知识。主要的用意在于专贴专讲。如果你有心学,越往后越会发现完成从前的例子易如反掌。如果大家对我所用的例子中其他技术点感兴趣,可以回复告知或密我。如果合适我另开贴逐步讲解。我的出发点是授人以鱼不如授人以渔,从我提供的源码到我所举的例子,最多你只多思考一小时而已。另外,悄悄的说一句,现在破解工具这么发达,swf还有秘密可言吗。
我所发的内容大部分是从我们团队的基础培训资料而来,从我们内部一年多的培训来看,这种专题专讲的方式的效果很好,只需要一点耐心而已。