分类为 ActionScript 的存档

最近总用一些朋友问起一些数学公式,说这些内容不会,所以在这里开一个基础教程,希望能够对大家的学习提供帮助.在flash中,Math类是一个非常常用的类,通过数学计算,可以实现很多非常美妙的效果,我们在这里从最基础的学起,补一补数学知识.我们先来看看flash中提供的Math类吧:Math.abs()          计算绝对值。Math.acos()        计算反余弦值。Math.asin()        计算反正弦值。Math.atan() 计算反正切值。Math.atan2()         计算从 x 坐标轴到点的角度。Math.ceil()        将数字向上舍入为最接近的整数。Math.cos()        计算余弦值。Math.exp() 计算指数值。Math.floor()        将数字向下舍入为最接近的整数。Math.log()        计算自然对数。Math.max() 返回两个整数中较大的一个。Math.min() 返回两个整数中较小的一个。Math.pow() 计算 x 的 y 次方。Math.random() 返回一个 0.0 与 1.0 之间的伪随机数。Math.round() 四舍五入为最接近的整数。Math.sin() 计算正弦值。Math.sqrt() 计算平方根。Math.tan() 计算正切值。下面我们就这18个基本的函数,进行具体的说明~!先说几个简单的,把简单的处理掉~!1、Math.abs()        计算绝对值公式,那么什么是绝对值呢?这个应该问题不大,我们都知道数字有正数和负数,那么我们计算的结果也就有正有负,通过这个函数,把负数值转换为正数值,而正数值不变.我们可以通过下面语句来验证一下:x=5y=-5x=Math.abs(x)trace(x)//输出 5y=Math.abs(y)trace(y)//输出 52、Math.ceil() 取得指定的数字或表达式的上限的整数值,也就是比指定的数字大的那个整数值。通过下面一段代码可以验证:x=5.45x=Math.ceil(x)trace(x)         //输出6注意,对于负数,是绝对值越大,数值越小,所以用Math.ceil()取得的整数值是那一个比数字绝对值小的那个负整数。下面代码可以说明:x=-5.45x=Math.ceil(x)trace(x)//输出-53、Math.floor()这个函数和Math.ceil()恰好相反,获得一个数字或表达式的一个下限的整数值,也就获取的整数值是比指定的数字小的那一个整数。注意:负数的取法和Math.ceil()的取法一样,只是取得一个绝对值大的一个整数。下面可以验证:x=5.45x=Math.floor(x)trace(x)//输出5x=-5.45x=Math.floor(x)trace(x)//输出-64、Math.round()这个函数所用的方法应该是我们最熟悉的了,四舍五入,取得和一个表达式或者数字最接近的一个整数。我们用一下代码验证一下~!x=5.45x=Math.round(x)trace(x)//输出5x=-5.45x=Math.round(x)trace(x)//输出-5x=-5.55x=Math.round(x)trace(x)//输出-6但是在这里发现一个要大家注意的问题,如果x=5.50x=Math.round(x)trace(x)//输出6但是如果x=-5.50x=-5.50x=Math.round(x)trace(x)//输出-5          需要注意一下~!5、Math.random()         随机函数,获取一个介于0和1之间的一个数字 …

  • No Comments , 25 次阅读 Hits
  • 标签:ActionScript, Math, 弧度, 数学
  • 美妙的Timer类——Timer与时钟

    Timer绝对是as3改进的亮点之一。它的使用技巧和美妙之处不是一下能说完的。这里先对它进行个完整的说明,再举几个具有启发的例子。为初学者处理计时器打下牢固的基础。Timer类:Timer类继承EventDispatcher。是FlashPlayer计时器接口。计时器可以用来间隔调用和延时调用。在其过程中可以访问其状态甚至进行干预。以此塑造出来的灵活性足以替代as2中的setInterval和getTimer。Timer类不是顶级类,它在flash.utils包中,要用import flash.utils.Timer声明。构造函数为new Timer(间隔,次数)。间隔时间为毫秒。次数为0表示无限循环。属性: 代码:currentCount:当前次数。只读。代码:repeatCount:总次数。可以设置。代码:delay:运行间隔,单位为毫秒。可以设置。代码:running:是否在运行中。这个属性很重要,它为是否开始进行第二次计时提供了保障。上面总次数和间隔可以设置。也就是说可以动态的改变循环次数和间隔时间。并且不会影响当前次数。方法: 代码:start():如果没有开始则开始运行。如果停止则继续运行。注意:第一趟计时完毕后也并不重置计数器。需要使用reset方法重置。代码:stop():暂停计时。代码:reset():停止并且重新开始计时。事件: 代码:time:类型为:flash.events.TimerEvent.TIMER。每次间隔到达调用timer事件。[code]complete:类型为:flash.events.TimerEvent.TIMER_COMPLETE。完成调用complete事件。[/code]看到了Timer类的整体后,as2的程序员一定兴奋不已,想摩拳擦掌开始实验。新手可能会思索半天,觉得不好记忆又想到底应该如何使用呢?关于记忆我的总结是:4个属性,3个方法,2个事件。下面举几个典型的例子。范例1:没有哪个例子比一个时钟更加适合描述Timer类的基本应用。步骤一:在flash舞台上放置一个钟面,再新建层画出时针、分针、秒针和轴心。3个指针分别命名为hourPoint,minutePoint,secondPoint。这些指针的注册点在底部中央。如图: 下面我们来让它运转起来:在属性面板中输入Clock。新建一个文档类Clock.as。代码如下: 代码:[code] package {import flash.display.Sprite;import flash.display.MovieClip;import flash.utils.Timer;import flash.events.TimerEvent;public class Clock extends Sprite{  var clockTimer:Timer=new Timer(1000,0);  var bellSound:Bell=new Bell();  public function Clock()  {   refreshPoint(); //初始化指针   clockTimer.start(); //开始运行计时器   clockTimer.addEventListener(TimerEvent.TIMER,timerFunction); //添加事件  }    private function timerFunction(evtObj:TimerEvent):void  {   refreshPoint();  }    private function refreshPoint():void  {   var currentDate:Date=new Date();   //秒针每走一格旋转6度。   secondPoint.rotation=currentDate.seconds*6;   //分针每走一个旋转6度加上秒针对它的增量   minutePoint.rotation=currentDate.minutes*6+currentDate.seconds*6/60;   //使用取余数的方法把24小时制转化为12小时制,时针每走一格旋转30度加上分针对它的增量   var hour12:int=currentDate.hours%12;   hourPoint.rotation=hour12*30+currentDate.minutes*30/60;      //整点报时功能   if(currentDate.minutes==0 && currentDate.seconds==0)   {    if(hour12)    {  ...

  • No Comments , 64 次阅读 Hits
  • 标签:ActionScript, timer
  • AS3的冒泡机制

    再述冒泡思路1 在as2中发现问题,2 在as3中解决问题。3 结合问题,说明冒泡4 冒泡的问题所在以及解决方法冒泡很多人在谈,前段时间小弟也是一知半解。弄得云里雾里的。最近找到一个pdf,呵呵,才算弄明白了点。把一点学习笔记发出来。1 在as2中发现问题,我们用一个例子来发现as2中究竟有什么问题。As2中实现如下效果:舞台上一个mc,mc中一个btn点选mc实现拖动mc,鼠标松开停止拖动点选mc实现mc隐藏。最容易想到的方法,代码如下: 代码:mc.onPress = function() {        this.startDrag();};mc.onRelease = function() {        this.stopDrag();};mc.btn.onPress = function() {        mc._visible=false};表面来看,这个思路是正确的。(实际上没什么思路可言,很简单的方法。)实际怎么样?当然是不能实现。问题来了:点击btn,不能触发btn的动作!!!!解释如下:1 因为btn处于mc内部,mc被加上了事件以后,按照as2的事件机制,mc内部的btn甚至是其他的元件都不能接受事件。或者可以认为mc的事件覆盖了mc中其他元件的事件。2 从非冒泡机制来说(as2就是非冒泡),在btn上点击鼠标,首先接受到点击事件的自然是btn的上一层(也就是mc),然后才是btn元件。Mc先接受到点击事件,触发相关的函数。然后呢?我们要实现的点击btn的效果没了。我们可以认为mc把我们的鼠标点击事件据为私有了,不再往下传递。(如果是冒泡机制的话,这个动作就回继续往下传递到btn,然后btn会执行。)那么这种效果在as2中还能实现么?答案自然是肯定的,不过方法就复杂了。这里就不讨论了。As3已经成为主流。但是as3中的冒泡机制,让我们可以简单的解决这样的难题。2 在as3中解决问题:下面来看as3中怎么实现。代码如下: 代码:import flash.events.*;mc.addEventListener(MouseEvent.CLICK,mcfunction);mc.btn.addEventListener(MouseEvent.CLICK,btnfucntion);function mcfunction(event:MouseEvent) {        trace("mc click");}function btnfucntion(event:MouseEvent) {        trace("btn click");}能实现了吧?看看代码就觉得,好像没用什么特别的解决方法,就加两个侦听函数,就搞定了。这个代码自然的不能再自然了,就好像做flash 先的安装软件一样。但是如此自然的代码下面,使as3的冒泡机制在提供支持。 结合问题,说明冒泡机制:Chm中有一个冒泡机制的图,相信大家都已经看过了这里我联系实例,另外做一个图,帮助各位理解。 上图为as2中的执行原理下图为as3中的执行原理 上图也就是在as3中实现我们文章开始提出的例子的工作原理。下面详细描述一下捕获阶段:鼠标在btn上发出点击事件,首先捕捉到该事件的事stage.,然后事件往下传递到mc,再到btn..(如果鼠标事件发生在btn按钮中的一个label上,那么该事件还会继续向下传递,直到找到label元件。)     As2中,一旦找到了可以相应事件的函数,就停止了,不会往下传递。这个道理应该说明白了目标阶段:找到我们的鼠标最底层的目标,也就是btn以后,那么就开始执行btn的侦听函数了。    如果鼠标事件发生的所在位置,是mc中的btn中的一个label。那么将先执行label的侦听函数。(当然我们的例子中没有label)冒泡阶段:执行了目标阶段的侦听函数以后,开始冒泡。换一个说法是,返回btn的父级元件mc,如果能找到相关的侦听函数,那么就执行,如果没有,就继续往上冒泡到btn的父级元件mc的父级元件stage。看能不能找到相关的侦听函数。注意一个:首先执行的函数一定是目标对象的侦听函数。就像我们上面的例子一样,点击btn会先trace(“btn click”),然后冒泡到mc,执行trace(“mc click”)..然后继续往上,如果stage我们也加一个侦听函数,执行语句,那么还会继续执行 trace(“stage click”).到达stage顶层了,冒泡结束。说到这里,各位看官也应该明白了as3的冒泡究竟是干什么用的了4 冒泡的问题所在以及解决方法  冒泡也有问题,并不是说它有缺陷,因为出现问题无法避免。  问题在于,  假如在上面的例子中,我们不想在点击btn冒泡阶段中执行mc的侦听函数,我们只想执行btn的侦听函数。怎么解决?同样的问题延伸出去,可以得到很多扩展和应用。那么我们需要阻止他的冒泡的时候执行相关的侦听函数。Chm中的方法有 stopImmediatePropagation():void防止对事件流中当前节点中和所有后续节点中的事件侦听器进行处理。stopPropagation():void防止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。用来修改我们上面的例子代码如下: 代码:import flash.events.*;mc.addEventListener(MouseEvent.CLICK,mcfunction);mc.btn.addEventListener(MouseEvent.CLICK,btnfucntion);function mcfunction(event:MouseEvent) {        trace("mc click");}function …

  • No Comments , 11 次阅读 Hits
  • 标签:ActionScript, 冒泡
  • 《ActionScript 3.0 making things move》

    看了一下keith peters的ActionScript 3.0 making things move样张,实在令人佩服与惊叹果然这些东西还是老外写的好啊!怎么说呢?更加符合“人脑工程学”,呃~是,你很可能没听过这个词。我是说-很符合思维导图的模式,嗯……再简洁一点,就是:你在看某个例子,碰到疑惑,正想了解这个疑惑的时候,下一行这个疑惑的解答就出来了,而且还非常详细与容易理解只是还没出版,等,出了之后一定备一本在身边[给自己的P.S:多看一下样张,重复看几次。虽然翻译的不怎么样,不过自己结合一下自己所理解的语法多看几次,总会有新的发现与概念上的突破]

    关于AS3的初始化顺序(设置了Document Class之后)

    Document Class初始化 > 主时间轴代码执行 > 舞台元件绑定的类初始化 > 元件的时间轴代码初始化 >.. 下面的层次按这样的规律循环。

  • No Comments , 121 次阅读 Hits
  • 标签:ActionScript3, 初始化
  • Flex学习笔记五&关于FDT的和Eclipse的一点牢骚

    1、ComboBox,重点理解DropdownEvent事件。在列表被弹出或收回时,会分别派发DropdownEvent对象的OPEN事件和CLOSE事件。对这两个时间进行监听,便可捕捉用户的动作。2、注意,与之外的都是一个整体,而不是分开的3、发现还有很多人不明白这个void为什么要加。这里说明一下:是为了方便不带参的function除错(debug)。例如:   function testVoid():void{     trace("testVoid")     }  然后我testVoid(1),运行这时候程序就会出错。  函数参数为void的意思是这个函数不接受任何参数。所以,养成好习惯,只要不传参的function等,都加上void声明吧4、Alert的show是一个静态方法,格式如下:   show(text,title,flags,parent,closeHandle,iconClass,defaultButtonFlag)5、关于evt:CloseEvent,CloseEvent之后的值是在evt.detail6、关于itemRender,实在不明白概念的,就理解为“界面/组件绑定”吧……是,这样对真正的意思有些偏移,不过若实在对itemRender的概念混淆,也只能暂时在全部顿悟之前,先这样理解吧。这里也说说真正的意思:  用来控制数据表现形式的机制我们称之为“itemRender”。用户可以定义自己的itemRenderer对象,来覆盖某些有itemRenderer对象的组件的默认属性。自定义的itemRenderer相当于一个简单的自定义组件。同样,里面可以放置其他控件来表现更加丰富的内容。  顺便一说,这个东西相当使用,可以用来实现很多有趣的功能。  [2008.1.14附加]  可以作为用来作为与itemRender的组件又一个共同的特点,那就是拥有一个名为“data”的属性。  当组件被用作itemRenderer时,就拥有了data属性。data代表的是当前元素的数据信息,一般是Object类型,包括若干属性,data的数据格式和数据源的数据格式是一一对应的。     itemRenderer的data是由控件主动传入的,直接使用就可以了。    比如datagrid的数据源是books,其中每一条数据类型是book,那么itemRenderer的data也是book类型。7、关于function的函数中带事件   如internal function selectHandler(evt:CloseEvbent):void{}。意思是说将事件evt:CloseEvbent的结果带入到函数中,从而供这个function进行使用。这个和我们一直理解的function一样,只是带入的东西不同罢了   然后,这里是作者Email的解释(以bookList.addEventListener(DropdownEvent.CLOSE,chooseHandler)为例):    bookList.addEventListener(DropdownEvent.CLOSE,chooseHandler);    这句代码的意思是添加一个事件监听器,chooseHandler是函数名。    在使用 addEventListener方式添加事件监听函数时,该函数在定义时必须定义参数类型,也就是监听的事件类型。这样,当目标发送该事件时,会把事件作为参数传递过来,如果函数没有定义参数,也就无法接受事件传递的信息。 作者EMAIL2:    在使用 addEventListener方式添加 事件监听函数时,该函数在定义时必须定义参数类型,也就是监听的事件类型。这样,当目标发送该事件时,会把事件作为参数传递过来,如果函数没有定义参数,也就无法接受事件传递的信息。     比如:     btn.addEventListener(MouseEvent.CLICK,doClick);     那么,doClick函数在定义时,就必须是:doClick(event:MouseEvent),这个参数的名字可以随便定义,但类型必须是 MouseEvent或者MouseEvent类的父类。     事件类型的工作机制是这样的:     1、注册事件监听器,把监听对象和监听函数记录下来,也就是把btn和doClick记录下来。    2、当事件发生时,程序开始检查是否有对象进行了监听,如果有,这些监听函数就会被调用,调用的形式就像:obj.doClick(event),其中obj表示添加了监听器的对象btn,也就是执行了 addEventListener的对象,参数event表示事件对象。因此,doClick函数必须定义准确的参数,参数类型必须是event的类型或其父类类型,否则,变量类型不对,将引发运行错误。    如果一下子还是无法理解过来,那么就记住这点:addEventListener的是什么事件,那么在这个事件触发的自定义函数中,就要定义这个addEventListener监听的事件的事件类型。    例子:    exp1:    bookList.addEventListener(DropdownEvent.CLOSE,chooseHandler);    internal function chooseHandler(evt:DropdownEvent):void{}        exp2:    btn.addEventListener(MouseEvent.CLICK,doClick);    internal function chooseHandler(evt:MouseEvent):void{}    然后就可以通过evt来调用监听事件的参数和值了。如    internal function closeHandler(evt:CloseEvent):void{    if(evt.detail==Alert.YES){     viewLabel.text="选择的是:yes"     }else{     viewLabel.text="选择的是:No"    }    可能有些朋友已经注意到了为什么后面带入的evt中没有具体的事件名?而仅仅是类的成员名?是这样,我们以MouseEvent来说    导入的MouseEvent对象包含了所有的鼠标事件,如单击、双击、鼠标按下、鼠标松开、鼠标移动等等,这些事件名被封装成MouseEvent类的成员属性。在使用时,我们直接引用类成员名,而不需知道真正的事件名。嗯,最后,记住今天所说的:数组,push吧!BWT:FDT你是个球,你是个大球,下了几百次都下不下来

  • No Comments , 211 次阅读 Hits
  • 标签:AS3, FLEX, 学习笔记
  • flahs as 无基础入门经典教程

    Smile

    为什么发这么古老的东西?理由同前两篇导读:本篇,最主要看最后一点的XML篇,让对XML没有任何了解的人对XM…

  • No Comments , 29 次阅读 Hits
  • 标签:ActionScript, AS入门, AS理念
  • as2深入理解函数

    看到这篇文章,我想很多人回问我为什么在AS3大潮的时代, 发一片过时已久的AS2教程,而且还是基础教程…

  • 1 Comment , 253 次阅读 Hits
  • 标签:AS2, AS入门, AS理念
  • as2 基础教程(1)

    看到这篇文章,我想很多人回问我为什么在AS3大潮的时代, 发一片过时已久的AS2教程,而且还是基础教程…

  • No Comments , 30 次阅读 Hits
  • 标签:AS2, AS入门, AS理念
  • 我们知道vbs中有个trim的函数,用来取掉一个字符串两头的空格,as中没有,我们可以自定义一个://取掉字符串…

  • No Comments , 43 次阅读 Hits
  • 标签:FLASH, TRIM, 自定义函数