AS3:双击及手形鼠标指针

以前在AS2中,只要为MC指定onRelease或者onRollOver等等点击事件,当鼠标移到MC上时,鼠标就变成手形了,完全不用管。在AS3中改变了这一规则,你首先得用addEventListener添加事件,添加完事件之后,鼠标移到MC上依然是默认的箭头形状。要改变这个形状,还需要指定MC的buttonMode属性为true:

myMC.buttonMode = true;

AS3中支持双击事件,不过要启用这个双击事件就得指定另外一个属性——doubleClickEnabled为true:

myMC.doubleClickEnabled = true;

不过,需要注意的是,如果你这个MC同时有单击事件和双击事件那么在双击的第一下会触发单击事件,而第二下则不回触发单击事件~…

OOPlayer Beta,欢迎测试

把上次的OOPlayer Alpha稍微休整了一下,发个Beta版吧,适合在blog中使用,支持HTML插入方式和JavaScript代码插入方式,代码非常简单!具体方法请看这里:关于OOPlayer.

基本功能如下:

支持FLV播放、暂停、回放、静音及音量调整、全屏播放;
单击暂停或者播放;
双击全屏或者退出全屏;
支持右键菜单控制播放,包括全屏模式/普通模式切换、播放/暂停切换、静音/恢复音量切换、关于信息等;
可任意改变播放器大小,播放控制栏自动缩放;

欢迎提意见!…

FLV播放器——OOPlayer Alpha测试

用AS3写了一个FLV播放器,花了我一天半时间,功能几本上都全了,不过还有许多细节没有做,慢慢改,先拿一个试试~
梁静茹的《可惜不是你》,来自酷六网^_^

AS3:onLastSecond or onPlayStatus?

检测FLV是否播放完成,在Flash CS3的帮助文档中有onPlayStatus的说明,其返回的信息对象可能的值有两个,一个是 NetStream.Play.Switch,还一个是NetStream.Play.Complete。结果在client的事件中写上onPlayStatus,发现在编辑器中这个事件名称居然还是黑色,而不是和onMetaData一样的蓝色!如果此时加上trace(info.code),在FLV播放完成后还会报错,错误信息中冒出来一个onLastSecond。在帮助文档中查了一下这个事件,居然没有任何介绍。

既然onPlayStatus不管用,不妨试试onLastSecond,这个事件名称还是黑色,写上trace(info.code),结果FLV播放完成之后trace出来一个undefined,看来NetStream中还真有这个事件,但是为什么文档中没有任何介绍呢?

不管怎样,总算还能用onLastSecond检测FLV播放完成,不过这应该不是什么好方法………

AS3中有趣的event.localX属性


在上面的这个图片中,现在那个绿色的矩形(绿线)长度为250,这条绿色的线是一个MovieClip,若其原长度为250,那么用event.localX获得的值将在0到250之间;但是如果其原长度为400,那么用event.localX获得的值将会在0到400之间,而与该MC在影片中的实际长度无关。

不过这样也还好,获取事件触发的x坐标占这个MC长度的百分比依然很简单,直接用除以MC的原长度就行了。…

AS3控制FLV的音量方法(不用组件)

在AS3中,NetStream类有这样一个属性:soundTransform,可以用来控制FLV的声音,其实现为:

实现
public function get soundTransform():SoundTransform
public function set soundTransform(value:SoundTransform):void

SoundTransform类又有个volume属性,于是想是不是直接这样写就行了:

var volumeSize:Number = 0.2;
ns.soundTransform.volume = volumeSize;

结果丫的没任何反应……莫非必须重新为ns指定一个soundTransform对象?于是改成这样:

var volumeSize:Number = 0.2;
var st:SoundTransform = new SoundTransform(volumeSize,0);
ns.soundTransform

搞定FLV的拖动下载(HTTP)

发现56Youtube的视频都可以拖动,正好项目初步完成,本周工作任务很轻,于是偷了将近两天时间来玩这个FLV的拖动。

首先观察了一下这两个网站拖动功能:感觉56的拖动有问题,每次拖到那里以后就给一帧画面,然后就一直处于下载数据的状态,也不知道是下载的什么数据。最后好不容易下载完了,刚播几个画面就结束了……更正:56的新播放器没有问题,拖动很正常。Youtube的拖动做得不错,每次拖到新的地方,也会发出一个请求,但是在播放的进度条上可以清晰地看到当前下载的数据段属于哪一段,播放正常。

从观察结果可以推断:每次拖动都向服务器请求数据,并给上标识,然后服务器按照需求来给数据。数据怎么给?NetStream有一个seek()方法,搜索时是搜索到距seek的点最近的关键帧开始播放,因此相应地,服务器给数据时也应该是这样。剩下的就是分析FLV文件格式和服务器程序方面的事情了,FLV文件格式的分析网上很多,随便搜一下就找得到了。…

Silverlight的内存回收存在问题?

写了个程序,由于动态New出来的对象比较多,被发现有少量的内存泄露问题。仔细找了好几圈,确认所有引用都被释放了,但问题依然存在。后来仔细观察发现,即使是一个简单的按钮事件:鼠标移进去变色,移出来恢复原来的颜色,这样的情况下内存也会持续增长,尽管增长幅度不尽相同。

于是写了个简单的测试程序,有两个按钮:点击Add按钮,动态new出8000个Ellipse,大小为10*10,半透明;点击Delete按钮,从界面上移除这8000个Ellipse,使用Children.Clear()方法。经测试发现,每次Add以后,再Delete,内存只有极少量的回收(估计是从界面渲染上回收的),而每次Add之后内存增长都在10兆到20兆。测试代码如下:

public void Page_Loaded(object o, EventArgs e)
{
// Required to initialize variables
InitializeComponent();

其实BrowserHost.Resize好像有个BUG

其实这个问题也不是我先发现的。一个月以前,做了个东西,有人用着用着问我为什么出现这样的情况:横着改变窗口大小的时候,视频大小会跟着改变而且会保持居中,播放控制栏的位置也会跟着改变(保持底部水平居中),但是垂直改变窗口的大小时,视频大小和位置都不变,播放控制栏的位置也不变。后来发现这个可能是BrowserHost.Resize的一个bug:垂直方向改变窗口大小时不会触发这个事件,不过我只测试了IE6和IE7下的情况,Firefox尚未测试。

不知道有木有人报告这个bug………

Silverlight中Path的Data属性中命令大小写的区别

在Silverlight 1.0的SDK中说L和l是一样的,没有说有什么差别,今天偶然发现大写的L命令和小写的l命令是有区别的,后来依次测试V和v、H和h、A和a、C和c、Q和q等一系列命令都存在同样的区别。

一个简单的示例如下:


如果没有区别,这两条折线的形状应该是一模一样的,而实际上它们是这样的:

如果觉得不够明显,可以看这个:



后继续测试发现,如果使用大些命令时,不会改变坐标参照系,后面的坐标仍然是以父级Canvas的原点为原点,即所有的坐标都是相对于父级Canvas的,与上一个命令的坐标(笔触的当前位置)无关;而使用小写命令,则会改变坐标参照系,后面的坐标则是以上一个命令执行的坐标为原点,即以上一个命令的坐标(笔触的当前位置)为原点的。

在第一个示例中,使用H 50命令后,坐标系原点不变,此时终点的坐标是相对父级Canvas的(40,50)位置(与上一个命令无关),直线长度为50(终点的x坐标)-40(起点的x坐标)=10;在使用h…