Flex 预加载特效实例

这个预加载特效没有经过严格测试及通用性测试,它仅在firefox及mac中测试通过。

这个组件显示了一个application(应用)最后一次shut down的画面快照,该组件通过编辑器自动生成的HTML文件来调用onBeforeUnload。当application shut down后,它保存了application的state及画面快照在本地共享变量中(SharedObject),当下一次应用启动的时候,它抓取该快照并正确显示,所以它显示的非常快,也就意味着当你的主文件还未下载完毕,它就已经可以看见界面了。

<?xml version="1.0" encoding="utf-8"?>
<!-- http://www.myflexhero.com/share/flex-hero-flex4/578 -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
preloader="SnapShotPreloader" initialize="setup()" >
<fx:Script>
<![CDATA[
import mx.events.SandboxMouseEvent;

private function setup():void
{
ExternalInterface.addCallback("onBeforeUnload", onBeforeUnload);
var so:SharedObject = SharedObject.getLocal("preloaderImage");
if (so.data.listSelectedIndex)
list1.selectedIndex = so.data.listSelectedIndex;
if (so.data.bbSelectedIndex)
bb.selectedIndex = so.data.bbSelectedIndex;
if (so.data.taText)
ta.text = so.data.taText;
if (so.data.padData)
{
display.graphics.lineStyle(1, 0);
var commands:String = so.data.padData;
var arr:Array = commands.split(",");
var n:int = arr.length;
for (var i:int = 0; i < n; i++)
{
var cmd:String = arr[i];
var args:Array = cmd.split(" ");
switch (args[0])
{
case "M":
display.graphics.moveTo(args[1], args[2]);
break;
case "L":
display.graphics.lineTo(args[1], args[2]);
break;
}
}
}
}
private function onBeforeUnload():void
{
var bmd:BitmapData = new BitmapData(width, height);
bmd.draw(this);
var ba:ByteArray = bmd.getPixels(new Rectangle(0, 0, width, height));
ba.compress();
var so:SharedObject = SharedObject.getLocal("preloaderImage");
so.data.preloaderImage = ba;
so.data.width = width;
so.data.height = height;
so.data.listSelectedIndex = list1.selectedIndex;
so.data.bbSelectedIndex = bb.selectedIndex;
so.data.taText = ta.text;
so.data.padData = drawCommands.join(",");
}

override protected function commitProperties():void
{
super.commitProperties();
var t:Number = getTimer();
while (getTimer() - t < 1000);
}

override protected function measure():void
{
super.measure();
var t:Number = getTimer();
while (getTimer() - t < 1000);
}

override protected function updateDisplayList(w:Number, h:Number):void
{
super.updateDisplayList(w, h);
var t:Number = getTimer();
while (getTimer() - t < 1000);
}

private var drawCommands:Array = [];
private var mouseIsDown:Boolean;
private function pad_mouseDownHandler(event:MouseEvent):void
{
mouseIsDown = true;
display.graphics.lineStyle(1, 0);
display.graphics.moveTo(event.localX, event.localY);
drawCommands.push("M " + event.localX + " " + event.localY);
systemManager.getSandboxRoot().addEventListener(MouseEvent.MOUSE_UP, pad_mouseUpHandler);
systemManager.getSandboxRoot().addEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, pad_mouseUpHandler);
pad.addEventListener(MouseEvent.MOUSE_MOVE, pad_mouseMoveHandler);
}
private function pad_mouseUpHandler(event:MouseEvent):void
{
systemManager.getSandboxRoot().removeEventListener(MouseEvent.MOUSE_UP, pad_mouseUpHandler);
systemManager.getSandboxRoot().removeEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, pad_mouseUpHandler);
pad.removeEventListener(MouseEvent.MOUSE_MOVE, pad_mouseMoveHandler);
mouseIsDown = false;
}
private function pad_mouseMoveHandler(event:MouseEvent):void
{
display.graphics.lineTo(event.localX, event.localY);
drawCommands.push("L " + event.localX + " " + event.localY);
}
]]>
</fx:Script>
<s:Panel width="100%" height="100%" title="Big App" >
<s:List id="list1">
<s:dataProvider>
<s:ArrayList>
<fx:String>One</fx:String>
<fx:String>Two</fx:String>
<fx:String>Three</fx:String>
<fx:String>Four</fx:String>
<fx:String>Five</fx:String>
<fx:String>Six</fx:String>
</s:ArrayList>
</s:dataProvider>
</s:List>
<s:ButtonBar id="bb" x="200">
<s:dataProvider>
<s:ArrayList>
<fx:String>One</fx:String>
<fx:String>Two</fx:String>
<fx:String>Three</fx:String>
<fx:String>Four</fx:String>
</s:ArrayList>
</s:dataProvider>
</s:ButtonBar>
<s:Panel title="Scratch Pad" y="150" width="150" height="150" >
<s:Button label="Clear" click="drawCommands.length = 0;display.graphics.clear()" />
<s:Group id="pad" left="0" top="24" right="0" bottom="0"
mouseDown="pad_mouseDownHandler(event)" >
<s:Rect left="0" right="0" top="0" bottom="0" >
<s:fill>
<s:SolidColor color="0xFDFDFD" />
</s:fill>
</s:Rect>
</s:Group>
<s:SpriteVisualElement id="display" left="0" top="24" right="0" bottom="0" />
</s:Panel>
<s:TextArea id="ta" x="200" y="150" width="200" height="150" />
</s:Panel>
</s:Application>


个人觉得此实例的主要看点是使用了一些不常用的系统级类,有一定参考价值。当然若需要详细了解系统级类,直接参考API即可。

From http://www.myflexhero.com/share/flex-hero-flex4/flex-hero-components/flex-module/578
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我们来看一些Flex布局的实例。 ## 实例一:水平居中 让一个元素在父容器中水平居中,可以使用以下方法: ```html <div class="container"> <div class="box">Hello World</div> </div> ``` ```css .container { display: flex; justify-content: center; align-items: center; height: 100vh; } .box { background-color: #ccc; padding: 20px; } ``` 解释: - `display: flex;`设置容器为Flex布局。 - `justify-content: center;`将子元素水平居中。 - `align-items: center;`将子元素垂直居中。 - `height: 100vh;`设置容器高度为100vh,保证子元素在垂直方向上居中。 ## 实例二:等分布局 让多个元素等分布局可以使用以下方法: ```html <div class="container"> <div class="box">1</div> <div class="box">2</div> <div class="box">3</div> </div> ``` ```css .container { display: flex; justify-content: space-between; } .box { flex: 1; background-color: #ccc; padding: 20px; margin: 0 10px; } ``` 解释: - `display: flex;`设置容器为Flex布局。 - `justify-content: space-between;`将子元素等间距排列。 - `flex: 1;`将子元素等分布局。 ## 实例三:垂直居中 让一个元素在父容器中垂直居中,可以使用以下方法: ```html <div class="container"> <div class="box">Hello World</div> </div> ``` ```css .container { display: flex; justify-content: center; align-items: center; height: 100vh; } .box { background-color: #ccc; padding: 20px; margin: auto; } ``` 解释: - `display: flex;`设置容器为Flex布局。 - `justify-content: center;`将子元素水平居中。 - `align-items: center;`将子元素垂直居中。 - `height: 100vh;`设置容器高度为100vh,保证子元素在垂直方向上居中。 - `margin: auto;`使元素在水平方向上居中。 ## 实例四:项目排序 使用Flex布局可以很方便地对项目进行排序,例如: ```html <div class="container"> <div class="box">1</div> <div class="box">2</div> <div class="box">3</div> <div class="box">4</div> <div class="box">5</div> </div> ``` ```css .container { display: flex; flex-wrap: wrap; } .box { flex: 1 0 200px; height: 100px; background-color: #ccc; margin: 10px; display: flex; justify-content: center; align-items: center; font-size: 24px; color: #fff; text-shadow: 1px 1px #000; } .box:nth-child(1) { order: 3; } .box:nth-child(2) { order: 1; } .box:nth-child(3) { order: 4; } .box:nth-child(4) { order: 2; } .box:nth-child(5) { order: 5; } ``` 解释: - `display: flex;`设置容器为Flex布局。 - `flex-wrap: wrap;`设置弹性容器的子元素在一行排不下时,自动换行。 - `flex: 1 0 200px;`设置子元素的伸缩比例为1,基准大小为0,最大值为200px。 - `margin: 10px;`设置子元素的外边距为10px。 - `order:`设置子元素的显示顺序。 以上就是一些Flex布局的实例,希望对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值