Flash Player 10.1 麦克录制测试

照着ADOBE的在线文档做了一个测试程序, 录制声音5秒再播放, 代码基本都是帮助文档中的.
许多人的愿望到今天终于实现了
预览(需要flash player 10.1):
FirstApp
下载代码:
点击下载此文件
另外, 在jinni的文章中列出了很多AIR2的应用, 其中就包括录制并保存,还可以调用关联程序播放的例子:
http://blog.everythingflex.com/2009/11/17/air-2-0-sample-applications/

Flash位图的处理限制

读了后, 做了一下测试.的确存在这样的问题.
文档(FlashPlayer10)中指出BitmapData的高或宽不能超过8191个像素, 总像素数不能超过16777215.
这里估计也是Flash的位图处理限制.即使是在Flash CS4这样的可视化的IDE中, 同样存在这个现象:
找来一张3200×1666的图片(尽量选择大尺寸图片便于测试极限情况).
将其宽度缩小至50, 在舞台中从最左拖至最右(舞台范围尽量调大),
X轴上总会有一个位置M,当图片经过M时, 图片内容会发生变化,
出现重复图像(导入的图片被打散[Ctrl+B操作])或出现纯色以及拉丝等现象.
而且在编辑状态,这个位置M和Flash舞台(0,0)位置无关,而是与编辑区的左上顶点有关.
可以这么理解, 编辑区其实是一个实时编译的”SWF”.
这点和Flex Builder有些相似, 有时我们会发现在进入CSS的预览面板时,
能够看到熟悉的FLEX程序加载进度条.
进一步测试可以发现这个M与图像高度无关(下图中第二组图片经过外面剪切后重新导入Flash中):

但是与图像原始宽度及缩放比例有密切关系:

放大2000倍的舞台:

在Y轴上,同样存在对应着图片的”极限”位置N:

这个点怎么确定呢? 不知道. 这里通过对点位置有影响的几个属性值做了简单推算, 以宽度计算为例, 图片原始宽度ow, 当前宽度w, 假设存在某个常量C,
那么公式可能是C=M*(ow/w), 这个C大概在35000~36000, 而对于高度测试中大概在18000左右浮动.
上面文章中指出2562宽度的图片,实际宽度为50,坐标不超过640, 按C=M*(ow/w)可以算出数值为(640+50)*(2562/50) = 35355.6
当然,真正的过程不得而知,也许和内存占用,位图渲染处理有关.这种计算结果不可能是一个”范围”, 上面的推算仅供参考,博君一笑.
希望有知道原理的兄弟指点一下
扩展阅读:
Flash Player Bitmap Limits
Flash Player Bitmap Limits Again
BitmapData

Grant Skinner的关于AS3代码优化演示稿

来源:http://theflashblog.com/?p=1416

地址:http://gskinner.com/talks/quick
很不错的slides, 共100页, 简单明了, 还配有实例.
使用左右方向键查看前后页, 或者直接在页码处填写100内的数字,回车即可.当然, 直接在地址栏写入页码也是可行的
P.S. slides过渡效果也很帅的

切换页面中SWF的显示

要实现两个嵌入SWF的DIV显示切换.
可通过设置display, visibility, height/width及left等(因为两个层的position都是absolute)实现.
对于display, 当SWF依附层隐藏再显示后, 通过JavaScript调用SWF内部方法时会提示找不到方法.换作火狐3.5测试, 此现象消失, 换回IE8, 一切如故.
测试visibility, 结果一样. 反复测试, 最终放弃使用这两个属性, 换作height=0来隐藏SWF层.
P.S. 使用AC_FL_RunContent插入SWF文件
同时找到一篇切换SWF的文章:
http://pipwerks.com/lab/swfobject/hide-swf/2.0/index.html

使用BitmapData.applyFilter实现伪景深(Depth of field)

景深 (Depth of field (wiki))有时可以增强立体感
可惜Flash未内置这种滤镜,Pixel Bender也许能实现,不过不会写 -_-
借助BitmapData.applyFilter分段为位图添加BlurFilter,可以实现假的”景深”效果:
视点在左侧:

视点在中间:

方法:
public function applyFilter(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, filter:BitmapFilter):void
参数:
sourceBitmapData:BitmapData — 要使用的输入位图图像。
sourceRect:Rectangle — 定义要用作输入的源图像区域的矩形。
destPoint:Point — 目标图像(当前 BitmapData 实例)中与源矩形的左上角对应的点。
filter:BitmapFilter — 用于执行过滤操作的滤镜对象。
Demo(点击apply应用滤镜)
Source
不过位图块之间的过渡有时不是很自然,会由于模糊得太过导致较大的间隙,当然,离远些就不明显了(笑).

模仿CDNetworks播放器带宽面板

仿上篇文章中提到过的带宽面板,用到了位图的applyFilter方法,Action直接写在了时间轴上,面板界面使用Flash CS工具绘制。

Demo
Source(Flash CS4 required)

Flash全屏右键菜单偏移BUG

已经有人提交了:
context menu position in full screen is shifted
FP9没有问题,只有FP10且在IE浏览器下发生。
如果你设置了stage的属性fullScreenSourceRect,像这样:
stage.fullScreenSourceRect = new Rectangle(0,0,800,600);
当切换到全屏的时候点击右键就会产生问题。

AS3嵌入SWF资源

Embedding Resources with AS3
http://www.bit-101.com/blog/?p=853
Flex Embed SWF 與 Embed Symbol 的差異
http://ticore.blogspot.com/2007/12/flex-embed-swf-embed-symbol.html

Flash全屏BUG?

新建一个项目,添加全屏操作,stage加入键盘监听,编译运行。
使用独立的flashplayer打开,正常
在IE7中打开含flash的页面,多次进行全屏操作,可以发现在全屏事件后,输出了空格的按键事件
在Firefox/3.0.7中测试,每次进入全屏后都会出现这种问题。
flashplayer版本均为最新:10.0.22.87
将版本降至10.0.12.36,问题依旧。
拿到示例到同事电脑上测试,Firefox和flash版本与上述版本相同,但未出现此现象。
被这个问题困扰半日,因为程序中要监听空格键,全屏后自动角触发空格键,扰乱程序执行了。
另外,进入全屏后(测试过目前常见的视频站的播放器),激活右键,会发现fps降到了1~2左右,电脑异常缓慢,右键菜单取消后,恢复正常。但同事电脑上也无此现象。
示例代码:
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
btn.addEventListener(MouseEvent.CLICK, clickHandler);
function clickHandler(event:MouseEvent):void
{
if (stage.displayState == StageDisplayState.NORMAL)
{
stage.displayState = StageDisplayState.FULL_SCREEN;
}
else
{
stage.displayState = StageDisplayState.NORMAL;
}
txt.appendText(“stage.displayState –> “+stage.displayState.toString()+”\n”);
txt.scrollV = txt.maxScrollV;
}
function keyUpHandler(event:KeyboardEvent):void
{
if(event.keyCode == Keyboard.SPACE)
{
txt.appendText(“你松开了空格\n”);
}
txt.scrollV = txt.maxScrollV;
}
function keyDownHandler(event:KeyboardEvent):void
{
if(event.keyCode == Keyboard.SPACE)
{
txt.appendText(“你按下了空格\n”);
}
txt.scrollV = txt.maxScrollV;
}
测试:Download
测试代码:Download
通过全屏后的100ms内禁用按键监听,也算是解决这个问题了

皮肤库元件加载及解析

最近又开始做播放器(同学一直说我是播霸),打算重新写一个超轻量级的样式管理。
coding的时候不禁怀念并感叹FLEX的样式管理真的很强大。
下面代码是很简单却也是库元件的核心:
package com.skin
{
import flash.display.Loader;
/**
* 解析皮肤元件
* @author kingnare
*
*/
public class SkinFactory
{
public static var loader:Loader;
public static function make(classname:String):*
{
if(!loader)
{
throw new Error(“Loader is null”);
}
try
{
if(loader.contentLoaderInfo.applicationDomain.hasDefinition(classname))
{
var classReference:Class = loader.contentLoaderInfo.applicationDomain.getDefinition(classname) as Class;
return new classReference();
}
else
{
return null;
}
}
catch(e:Error)
{
throw new Error(“Error when getting skin symbol:”+classname);
}
}
}
}
留此文以备用。

Page 1 of 41234