index.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
xmlns:local="*">
<mx:Script>
<![CDATA[
private function onClick(e:MouseEvent):void{
window.show();
}
]]>
</mx:Script>
<local:JellyWindow width="400" height="500" horizontalCenter="0" id="window"
backgroundColor="#ffff00" vibrationCount="30" delayNumber="0" visible="false"/>
<mx:Button x="157" y="244" label="show" width="91" height="33" click="onClick(event)" fontSize="14"/>
</mx:Application>
JellyWindow .as
package
{
import com.adobe.ac.mxeffects.Distortion;
import com.adobe.ac.mxeffects.DistortionConstants;
import flash.events.TimerEvent;
import flash.geom.Point;
import flash.utils.Timer;
import mx.containers.Canvas;
public class JellyWindow extends Canvas
{
private const InitPoint:Point = new Point(100,100);
public function JellyWindow()
{
super();
distortionTimeer = new Timer(delayNumber, vibrationCount);
distortionTimeer.addEventListener(TimerEvent.TIMER, timerHandler);
pointsSpecimen = [
50,55.251048395021485,67.86320984930961,83.2024901610665,97.44865698524941,
108.11123531529728,114.13278592010593,115.6794726556897,113.7514225333381,
109.74227285271256,105.04958100112648,100.79808814176877,97.69749345012417,
96.023554262826,95.69027018664536,96.37235141377161,97.63915519115437,
99.07033390929932,100.33572339218681,101.2341473366892,101.69546822829375,
101.75619974227371,101.52120076364723,101.12306421982154,100.68788141853504,
100.312273569012,100.05293362397794,99.9270920221492,99.92062845073377,100
];
for(var j : int=0;j<pointsSpecimen.length; j++)
{
pointsSpecimen[j] -= (pointsSpecimen[j] - 100)
* ( (pointsSpecimen[j] > 100) ? 0.85 : 0.7 );
}
}
private var distortion: Distortion;
private var currentPoint : Number = 0;
private var pointsSpecimen:Array;
private var pointsArray : Array;
private var distortionTimeer : Timer;
private var dyncDelayNumber : Number = delayNumber;
/**
* 窗口振动次数
*/
public var vibrationCount : Number = 15;
/**
* 振动间隔
*/
public var delayNumber : Number = 55;
private function timerHandler(evt : TimerEvent) : void
{
currentPoint++;
dyncDelayNumber = dyncDelayNumber + 0.5;
var leftTopPoint : Point = new Point(pointsArray[0][currentPoint], pointsArray[0][currentPoint]);
var rightTopPoint : Point = new Point(pointsArray[1][currentPoint], pointsArray[1][currentPoint]);
var rightBottomPoint : Point = new Point(pointsArray[2][currentPoint], pointsArray[2][currentPoint]);
var leftBottomPoint : Point = new Point(pointsArray[3][currentPoint], pointsArray[3][currentPoint]);
distortion.renderCorners(leftTopPoint, rightTopPoint, rightBottomPoint, leftBottomPoint);
if (currentPoint >= vibrationCount) {
reset();
}
}
private function reset():void {
if (distortion != null) {
distortion.destroy();
distortion = null;
}
dyncDelayNumber = delayNumber;
distortionTimeer.repeatCount = vibrationCount;
currentPoint = 0;
distortionTimeer.reset();
}
private function generatePointsArray(): void {
var tempPointsArr:Array = new Array(4);
var n1:Number;
var n2:Number;
var n3:Number;
var n4:Number;
pointsArray = new Array();
var pointNum : Number = pointNum = 0;
while (pointNum++ < 5) {
tempPointsArr = [];
n1 = Math.random() * 0.70 + 0.80;
n2 = 0;
while (n2++ <= vibrationCount) {
n4 = Math.round(n2 * n1);
if (n4 <= vibrationCount - 4) {
tempPointsArr.push(pointsSpecimen[n4]);
continue;
}
tempPointsArr.push(100);
}
pointsArray.push(tempPointsArr);
}
}
public function show():void
{
if (distortion != null) {
return;
}
visible = true;
distortion = new Distortion(this);
distortion.buildMode = DistortionConstants.POPUP;
distortion.smooth = true;
generatePointsArray();
distortionTimeer.repeatCount = vibrationCount;
distortionTimeer.start();
timerHandler(null);
}
public function hide():void
{
visible = false;
}
}
}