百叶窗效果

[b]effects\Blinds.as [/b]

package effects
{

import effects.effectClasses.BlindsInstance;

import mx.controls.scrollClasses.ScrollBarDirection;
import mx.effects.IEffectInstance;
import mx.effects.TweenEffect;

public class Blinds extends TweenEffect
{

private static var AFFECTED_PROPERTIES:Array = ["mask"];

public function Blinds(target:Object=null)
{
super(target);
instanceClass = BlindsInstance;
}

public var direction:String = ScrollBarDirection.VERTICAL;

public var blindsFrom:Number;

public var blindsTo:Number;

public var gapFrom:Number;

public var gapTo:Number;

override public function getAffectedProperties():Array
{
return AFFECTED_PROPERTIES;
}

override protected function initInstance(instance:IEffectInstance):void
{
super.initInstance(instance);
var blindsInstance:BlindsInstance = BlindsInstance(instance);
blindsInstance.direction = direction;
blindsInstance.blindsFrom = blindsFrom;
blindsInstance.blindsTo = blindsTo;
blindsInstance.gapFrom = gapFrom;
blindsInstance.gapTo = gapTo;
}

}

}



[b]effects\effectClasses\BlindsInstance.as[/b]

package effects.effectClasses
{

import flash.display.DisplayObject;
import flash.display.Sprite;

import mx.controls.scrollClasses.ScrollBarDirection;
import mx.effects.effectClasses.TweenEffectInstance;

public class BlindsInstance extends TweenEffectInstance
{

public function BlindsInstance(target:Object)
{
super(target);
}

public var direction:String = ScrollBarDirection.VERTICAL;

public var blindsFrom:Number;

public var blindsTo:Number;

public var gapFrom:Number;

public var gapTo:Number;

override public function play():void
{
super.play();
if (isNaN(blindsFrom))
blindsFrom = 30;
if (isNaN(blindsTo))
blindsTo = 30;
if (isNaN(gapFrom))
gapFrom = 100;
if (isNaN(gapTo))
gapTo = 0;
blindsFrom = Math.max(Math.min(blindsFrom, 100), 0);
blindsTo = Math.max(Math.min(blindsTo, 100), 0);
gapFrom = Math.max(Math.min(gapFrom, 100), 0);
gapTo = Math.max(Math.min(gapTo, 100), 0);
tween = createTween(this, [blindsFrom, gapFrom], [blindsTo, gapTo], duration);
}

override public function onTweenUpdate(value:Object):void
{
setBlindsMask(value[0], value[1]);
}

override public function onTweenEnd(value:Object):void
{
setBlindsMask(value[0], value[1]);
super.onTweenEnd(value);
}

private function setBlindsMask(blinds:Number, gap:Number):void
{
var currentTarget:DisplayObject = target as DisplayObject;
if (!currentTarget)
return;
var mask:Sprite = new Sprite();
var targetWidth:Number = currentTarget.width;
var targetHeight:Number = currentTarget.height;
var length:Number = 0;
var gapLength:Number = 0;
var currentOffset:Number = 0;
var i:int = 0;
mask.graphics.clear();
mask.graphics.beginFill(0x000000, 1);
if (direction == ScrollBarDirection.VERTICAL)
{
blinds = (targetHeight / 2) * (blinds / 100);
length = (blinds == 0 ? targetHeight : Math.floor(targetHeight / blinds));
gapLength = Math.round((length / 2) * (gap / 100));
for (i = 0; i < blinds; i++)
{
mask.graphics.drawRect(0, currentOffset,
targetWidth, Math.max(length - gapLength, 0));
currentOffset = currentOffset + length;
}
if (currentOffset < targetHeight)
mask.graphics.drawRect(0, currentOffset,
targetWidth, targetHeight - currentOffset);
}
else
{
blinds = (targetWidth / 2) * (blinds / 100);
length = (blinds == 0 ? targetWidth : Math.floor(targetWidth / blinds));
gapLength = Math.round((length / 2) * (gap / 100));
for (i = 0; i < blinds; i++)
{
mask.graphics.drawRect(currentOffset, 0,
Math.max(length - gapLength, 0), targetHeight);
currentOffset = currentOffset + length;
}
if (currentOffset < targetWidth)
mask.graphics.drawRect(currentOffset, 0,
targetWidth - currentOffset, targetHeight);
}
mask.graphics.endFill();
currentTarget.mask = mask;
}

}

}



[b]Test.mxml[/b]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:effect="effects.*"
layout="absolute">

<effect:Blinds id="hBlinds"
direction="horizontal" duration="1000"
blindsFrom="10" blindsTo="10" gapFrom="100" gapTo="0" />

<effect:Blinds id="vBlinds"
direction="vertical" duration="1000"
blindsFrom="10" blindsTo="10" gapFrom="100" gapTo="0" />

<mx:Panel id="panel" width="500" height="400" title="Panel" layout="vertical">
<mx:Label text="Label" />
<mx:Button label="Button" />
<mx:TextInput text="TextInput" />
<mx:HRule width="100%" />
<mx:Button label="Play(horizontal)" color="#FF0000" click="hBlinds.play([panel])" />
<mx:Button label="Play(vertical)" color="#FF0000" click="vBlinds.play([panel])" />
</mx:Panel>

</mx:Application>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值