使用air3.1测试ios多点触摸的TouchEvent

package {
	import flash.display.*;
	import flash.events.*;
	import flash.ui.Multitouch;
	import flash.ui.MultitouchInputMode;

	[SWF(width="1024", height="768", backgroundColor="#ffffff")]
	public class MultitouchExample extends Sprite {

		Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;

		private var imageArray:Array;

		public function MultitouchExample() {
			imageArray = new Array();
			stage.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
			stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove);
			stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd);

		}

		private function onTouchBegin(event:TouchEvent):void {
			var mySprite:Sprite = new Sprite();
			mySprite.graphics.beginFill(0xff0000);
			mySprite.graphics.drawCircle(0,0,40);
			mySprite.x = event.stageX;
			mySprite.y = event.stageY;
			addChild(mySprite);

			var touchObj:Object = new Object();
			touchObj.tid = event.touchPointID;
			touchObj.obj = mySprite;
			imageArray.push(touchObj);
		} 

		private function onTouchMove(event:TouchEvent):void {
			for(var i:int = 0;i<imageArray.length;i++){
				if(imageArray[i].tid == event.touchPointID){
					imageArray[i].obj.x = event.stageX;
					imageArray[i].obj.y = event.stageY;
				}
			}
		} 

		private function onTouchEnd(event:TouchEvent):void {
			for(var i:int = 0;i<imageArray.length;i++){
				if(imageArray[i].tid == event.touchPointID){
					removeChild(imageArray[i].obj);
					imageArray.splice(i,1);
				}
			}
		}

	}
}

使用flash air开发app中的重力感应

actionscript中的重力感应使用的在Accelerometer类。所有的重力参数在 AccelerometerEvent类中。

主要的参数为:

  • accelerationX : Number    沿 X 轴的加速,以 G 为度量单位。
  • accelerationY : Number    沿 Y 轴的加速,以 G 为度量单位。
  • accelerationZ : Number    沿 Z 轴的加速,以 G 为度量单位。
  • timestamp : Number    自初始化运行时后事件的毫秒数。

实际使用中,在静止状态下的前这三个参数,返回的是从-1到1的数字。以ipad为例

  • 开关键朝正上方的时候accelerationX为1,朝正下方的时候为-1。
  • 音量键朝正上方的时候accelerationY为1,朝正下方的时候为-1。
  • 屏幕朝正上方的时候accelerationZ为1,朝正下方的时候为-1。

通过三角函数,即可得到与平面的夹角。

移动状态下,这些数值会根据移动方向的加速度改变。

 

以下是示例:

package {
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.AccelerometerEvent;
	import flash.sensors.Accelerometer;
	import flash.text.TextField;
	import flash.text.TextFormat;

	public class AccelerometerTest extends Sprite {
		private var ball:Sprite;
		private var accelerometer:Accelerometer;
		private var xSpeed:Number = 0;
		private var ySpeed:Number = 0;
		private const RADIUS = 20;
		private var log:TextField;

		public final function AccelerometerTest() {
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;

			createBall();

			if (Accelerometer.isSupported) {
				accelerometer = new Accelerometer();
				accelerometer.addEventListener(AccelerometerEvent.UPDATE, accUpdateHandler);
				stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
			}

			setUpTextField();
		}

		private final function createBall():void {
			ball = new Sprite();
			ball.graphics.beginFill(0xFF0000);
			ball.graphics.drawCircle(0, 0, RADIUS);
			ball.cacheAsBitmap = true;
			ball.x = stage.stageWidth / 2;
			ball.y = stage.stageHeight / 2;
			addChild(ball);
		}

		private final function enterFrameHandler(event:Event):void {
			event.stopPropagation();
			moveBall();
		}
		private final function moveBall():void {
			var newX:Number = ball.x + xSpeed;
			var newY:Number = ball.y + ySpeed;
			if (newX < 20) {
				ball.x = RADIUS;
				xSpeed = 0;
			} else if (newX > stage.stageWidth - RADIUS) {
				ball.x = stage.stageWidth - RADIUS;
				xSpeed = 0;
			} else {
				ball.x +=  xSpeed;
			}

			if (newY < RADIUS) {
				ball.y = RADIUS;
				ySpeed = 0;
			} else if (newY > stage.stageHeight - RADIUS) {
				ball.y = stage.stageHeight - RADIUS;
				ySpeed = 0;
			} else {
				ball.y +=  ySpeed;
			}
		}

		private final function accUpdateHandler(event:AccelerometerEvent):void {
			xSpeed -=  event.accelerationX * 2;
			ySpeed +=  event.accelerationY * 2;

			log.text = "accelerationX:" + event.accelerationX.toString() + " \n";
			log.appendText("accelerationY:" + event.accelerationY.toString() + " \n");
			log.appendText("accelerationZ:" + event.accelerationZ.toString() + " \n");
		}

		private function setUpTextField():void {
			log = new TextField();
			var format:TextFormat = new TextFormat("_sans",12);
			log.defaultTextFormat = format;
			log.border = true;
			log.wordWrap = true;
			log.multiline = true;
			log.x = 10;
			log.y = 10;
			log.width = 1000;
			log.height = 700;
			addChild(log);
		}
	}
}

[ZZ]给AS程序员的一点建议

最近做了一个AS网站的重构,发现了很多问题。我想这也是互动广告AS开发从业人员普遍存在的问题,有些想法不吐不快。

就互动广告这个行业来说,太多所谓“经验丰富”的AS Web开发者都是从AS2时代成长起来的,所以直到今天还保留着脚本语言的习惯。把以前的思路带到AS3来做开发是极其危险的。我们来看几个典型:

1.滥用全局。

AS2的_global是多好的东西啊,怎么AS3就没了呢?初级程序员还在抱怨,中级程序员二话不说噼里啪啦写出一个Global类,老子照用。高级程序员无语。

关于代码之间的依赖关系是个很长的话题,我在这里不展开说,只想提醒大家现在的AS3业界已经发展到了DI(反转注入)。如果你还是守着静态类或者单例,就难免有点跟不上潮流。这并不是说DI就是最好的,在小网站项目里也许根本用不上。但是一定要对自己代码中用到全局的地方好好做一下反思。也许级别的进阶就是从思考代码依赖的解决方法并且重构而开始的。

2.没有释放资源。

在AS2时代,一个空白帧就可以把时间线上的资源释放掉;一个unload操作之后你所加载的swf资源也全部清空。这些是脚本语言的便捷,也是跨入AS3编程的陷阱。我看到的一些程序员是完全没有释放资源的概念的,在他们的程序里根本找不到destroy()或dispose()等类似方法。没有正确的释放资源在网站开发这种天生就是模块化的程序里是致命的错误。大部分网站仍然能够正常运行是因为网站本身规模太小,以及没有无聊的人来回切换页面几十上百次。但这并不表示这个问题就能忽视,客户是不会开着资源管理器核对内存占用的,但是身为开发者必须这么做,而且必须更专业的去做(Profiler)。通常在析构方法里面的代码可能比构造函数还要长。可笑的是我依然看到很多“制作精良”的网站背后内存占用的飙升曲线。当你想借助AIR进军移动开发的时候,问题将会更加明显。这一刻我仿佛明白了乔布斯数落 Flash的原因,可是技术本身并没有错,需要提升的,也许是开发者的质量。

AS3垃圾回收请参考gskinner在06(!)年写的系列1,2,3。

3.滥用资源。

这点是我最近学习iOS编程以后反思的。在移动设备这种内存有限的平台上开发,每1k内存开销都很重要、谁持有内存的引用也很重要。以前在Flash里做开发,像滚动列表这种东西,有多少项就生成多少个实例出来,排列一下,弄个遮罩,让它滚起来就行。完全没有延迟实例化(内存优化)和对象回收(CPU优化)的概念。这样的程序写出来在移动设备上根本连运行的机会都没有就要跳出了。想要成为高级的开发者就一定要对你的程序中每一个对象的生命周期都了如指掌,并且能够自如把控,让内存和CPU(以后还有GPU)都运行在最佳状态。

把这些基础却相当重要的障碍扫清以后,我们才真正有资格来看所谓的“框架”。

大多“经验丰富”或多或少都有积累自己的代码库。但是我发现的现象是除了上面提到过的代码质量不高以外,这些开发者还对其他人的开源框架或者类库抱有不屑的态度。也许是程序员相轻的心理因素在作怪,但是绝不应当就此蒙蔽了自己的眼睛。要相信他山之石可以攻玉,特别是那些能够在业界得到流行和推广的框架一定有自己独到的地方。

我在向一些人介绍和推荐Gaia框架的时候,发现受众很多都是从自身的角度或者编程习惯出发,很快的就提出各种方面的质疑。比如说加载怎么没有报错,site.xml结构为什么那么冗长不够精简等等。也许很快在暗地里上就给这个东西贴上不好用的标签,转头还是用回自己的一套。其实以我使用Gaia两年的经验可以证明,这套框架的确非常适合做Agency网站项目的开发。我用它做过大到AMG中国官方网站改版,小到Siemens Navi这种只有两三个页面的网站。如果你深入学习过它的API(真的不难),就会发现它能够涵盖绝大部分的开发需求。而且你还可以反过来复习一遍一个成熟的框架是怎么运用设计模式、怎么解决代码依赖的,检查它是否在资源使用方面做到了最好。

最后,想成为一个合格的AS开发者还需要非常熟悉你的编码环境(推荐FDT),了解自动化工具(Ant、JSFL等),掌握版本管理知识(Git)。甚至还需要了解软件工程方面的知识。一切都是为了提高你的工作效率。最重要的是要认清技术不断变革的事实,有的时候需要完全抛下自己的即成经验,时刻保持旺盛的求知欲。

延伸阅读:

* http://johnlindquist.com/2009/08/28/10-things-every-senior-flash-developer-should-know/
* http://www.funky-monkey.nl/blog/2011/02/14/16-things-that-should-have-been-added-to-john-lindquist-list/

原文地址:http://kevincao.com/2011/03/advice-to-as-developer/

[ZZ]AS3非常让人兴奋的类库

AS3非常让人兴奋的类库
ゞじ☆ve弦ㄣ 发表于2010年03月17日 15:18 阅读(5) 评论(0)
分类: じ☆ve弦
举报
1、as3ebaylib

http://code.google.com/p/as3ebaylib/

2、as3youtubelib

http://code.google.com/p/as3youtubelib/

3、as3flickrlib

http://code.google.com/p/as3flickrlib/

4、Yahoo ASTRA Flash Components

http://developer.yahoo.com/flash/astra-flash/

5、facebook-as3

http://code.google.com/p/facebook-as3/

6、as3awss3lib

http://code.google.com/p/as3awss3lib/

7、Adobe ActionScript 3:resources:apis:libraries (官方,包括corelib、FlexUnit、Flickr、Mappr、RSS and Atom libraries、Odeo、YouTube)

http://labs.adobe.com/wiki/index.php/ActionScript_3:resources:apis:libraries

8、Tweener 用于过渡与切换的一组动画库

http://code.google.com/p/tweener/

9、uicomponents-as3 一组轻量级的AS3 UI组件库

http://code.google.com/p/uicomponents-as3/

10、as3ds AS3的数据结构实现

http://code.google.com/p/as3ds/

11、mecheye-as3-libraries 一组主要用于Flash 游戏开发的AS3库

http://code.google.com/p/mecheye-as3-libraries/

12、XIFF 一套XMPP协议的AS3实现

http://svn.igniterealtime.org/svn/repos/xiff/branches/xiff_as3_flexlib_beta1/

13、FZip 一套AS3库,可用作对ZIP压缩文件的载入、修改与创建

http://codeazur.com.br/lab/fzip/

14、FlexLib 一套开源的Flex界面组件库

http://code.google.com/p/flexlib/

15、AnimatedGIfLoader Flex Component 可载入GIF的Flex组件

http://dougmccune.com/blog/animatedgifloader-flex-component/

16、goplayground 一套轻量级的,可用创建属于你自己的AS3 动画工具的库

http://code.google.com/p/goplayground/

17、AlivePDF 开源的用于PDF创建的AS3库

http://www.alivepdf.org/

18、jwopitz-lib 一组开源的Flex用户界面组件

http://code.google.com/p/jwopitz-lib/

19、as3crypto AS3实现的一套加密库,包括多种加密算法

http://code.google.com/p/as3crypto/

20、flare 一套强大的可视化交互的AS3类库

http://flare.prefuse.org/

21、SWFAddress 一小而强大的库,可以为Flash和Ajax提供深链接的功能

http://www.asual.com/swfaddress/

22、SWFObject 用于嵌入Flash,Adobe官方也认可了

http://code.google.com/p/swfobject/

23、ulse Particle System 一套开源的强大的AS3动态粒子系统

http://code.google.com/p/pulse-particle/

http://www.rogue-development.com/pulseParticles.html

24、SpringGraph Flex Component

http://mark-shepherd.com/blog/springgraph-flex-component/

25、GoASAP AS3动画库

http://code.google.com/p/goasap/

http://www.goasap.org/index.html

26、asaplibrary 一套开源的Flash Actionscript3.0 RIA库

http://code.google.com/p/asaplibrary/

http://asaplibrary.org/

http://asapframework.org

27、as3mathlib 开源Flex/Actionscript数学库

http://code.google.com/p/as3mathlib/

28、as3corelib 包含一些基础功能AS3库

http://code.google.com/p/as3corelib/

29、minimalcomps 一组AS3 UI组件

http://www.bit-101.com/minimalcomps/

30、as3gif

http://code.google.com/p/as3gif/

31、queueloader-as3 一组AS3库,用来进行资源序列载入及监测

http://code.google.com/p/queueloader-as3/

32、TweenMax (AS3)

http://blog.greensock.com/tweenmaxas3/

33、Atellis Reflection Component 一款Flex反射效果组件

http://labs.atellis.com/2007/07/11/atellis-reflection-component/

34、AS3Eval 简单来说,就是用AS3实现的AS3编译器

http://eval.hurlant.com/

35、 ByteArray的组件、库合集,包括liquid components、mousegesture、ASZip、GIF Player、GIF Animation Encoder、AlivePDF、Live JPEG Encoder、ScaleBitmap等

http://www.bytearray.org/?page_id=82

36、AS3C 针对AVM2虚拟机,用C#写的字节码编译器

http://code.google.com/p/as3c/

37、as3httpclientlib as3实现的http客户端

http://code.google.com/p/as3httpclientlib/

38、as3ui 一组常规的as3 ui界面库

http://code.google.com/p/as3ui/

39、as3xls 让你在flex中可以读写Excel文件

http://code.google.com/p/as3xls/

40、as3flexdb 让你的flex程序可以连接到MySQL服务器,主要是使用AMFPHP来访问PHP服务器

http://code.google.com/p/as3flexdb/

这一是一篇详细使用介绍的教程

http://itutorials.ro/viewtopic.php?f=9&t=7

41、vivisectingmedia-as3  一组AS3/Flex实用库,是作者在实践中总结出来的

http://code.google.com/p/vivisectingmedia-as3/

Actionscript 3.0 Class

1、fZip 此类可允许你载入标准的zip文件并提取里面包含的文件

http://wahlers.com.br/claus/blog/zip-it-up/

2、AS3: Layout class for Flash CS3 一组用作布局的类

http://www.senocular.com/?id=2.8

3、CSSLoader 该类允许Flex应用程序在运行时载入CSS

http://www.rubenswieringa.com/blog/cssloader

4、AS3: QueryString 一个单例类,用来获取URL地址后所带参数值对

http://evolve.reintroducing.com/2008/07/03/as3/as3-querystring/#more-141

5、ActionScript 3 Contextual Menu Manager Class AS3关联菜单管理类

http://www.blog.noponies.com/archives/103

2D & 3D Engine

1、APE (Actionscript Physics Engine) 物理引擎
APE 前身是as2版本的Flade,呼声很高,优点就是清晰简单,一共没有几个类:),目前版本alpha 0.45 ,有API文档和示例,教程有一篇quick start ,在Google Group上有一个论坛可以讨论。svn上一直在更新目前svn上的版本为0.5a

http://www.cove.org/ape/

2、Away3D

http://code.google.com/p/away3d/

3、Papervision3D

http://code.google.com/p/papervision3d/

4、Sandy 开源3D库

http://www.flashsandy.org/versions/3.0

5、FORM 一套AS3完成的用于2D刚性物体的物理引擎

http://code.google.com/p/foam-as3/

6、Five3D 基于矢量的Flash 3D 交互动画创建

http://five3d.mathieu-badimon.com/

7、Flade (Flash Dynamics Engine) 一套开源的2D物理引擎,AS2实现

http://www.cove.org/flade/

8、Box2DFlashAS3 2D物理引擎,AS3实现,基于强大的Box2D C++物理库

http://box2dflash.sourceforge.net/

9、Paradox 基于Flash的第一称3D引擎

http://animasinteractive.com/propaganda/

10、ND3D AS3 3D Engine  一款简单的AS3开源3D引擎,编译后的引擎大小仅约10K

http://code.google.com/p/nd3d/

http://www.nulldesign.de/nd3d-as3-3d-engine/

11、motor2 基于Box2d的AS3刚体引擎,也是2D的.
作者就是 AS3数据结构的作者,2007年最后一天发布
作者主页:http://lab.polygonal.de/motor_physics/
代码:http://code.google.com/p/motor2/

12、WOW-Engine 法国人写的,基于Sandy library的算法 3D物理引擎

http://seraf.mediabox.fr/wow-engine/as3-3d-physics-engine-wow-engine/

FrameWorks

1、Cairngorm Adobe官方出的Flex框架

http://labs.adobe.com/wiki/index.php/Cairngorm

2、PureMVC 纯AS3框架,也有其它语言的实现

http://www.puremvc.org/

3、ASWing AS3 一套开源的AS3 GUI框架

http://www.aswing.org/

4、EasyMVC 由事件驱动的MVC框架

http://projects.simb.net/easyMVC/

5、Mate 基于Tag及事件驱动的Flex框架

http://mate.asfusion.com/

6、ARP 基于模式(Pattern)的RIA框架,Flash平台,支持AS2和AS3

http://osflash.org/projects/arp

7、Gaia 开源的Flash前端框架,支持AS2和AS3,用于快速开发

http://www.gaiaflashframework.com/

8、flest Actionscript3.0/Flex应用程序框架,用来开发企业级的RIA

http://code.google.com/p/flest/

9、Gugga Flash Framework 更新至AS3

http://www.gugga.com/flashblog/

10、Prana 另一个提供了IOC反转控制的框架,类似著名的Spring框架

http://www.pranaframework.org/

11、OpenFlux 开源的Flex组件框架,让开发Flex组件更加快速容易

http://code.google.com/p/openflux/

12、Degrafa 声明式的Flex图形框架,允许以MXML标签的方式绘制图形、创建皮肤,还包括对CSS的支持

http://code.google.com/p/degrafa/

13、FlexMVCs 针对AS3和Flex的应用程序框架,基于PureMVC,作了些修正和精简

http://code.google.com/p/flexmvcs/

Flash & Flex Tools、Servers

1、FlexUnit Flex/Actionscript3.0单元测试框架

http://code.google.com/p/as3flexunitlib/

2、Visual FlexUnit 增强的FlexUnit,支持“可视化断言”

http://code.google.com/p/visualflexunit/

3、RED bug debug调试控制器,让Flash、Flex、AIR应用程序更加容易

http://www.realeyesmedia.com/redbug/

4、reflexutil 可在运行时对Flex组件进行调试

http://code.google.com/p/reflexutil/

5、FxSpy 当Flex应用程序运行时可以检测和动态的改变可视化组件属性值

http://code.google.com/p/fxspy/

6、ThunderBolt 基于Firefox的Firebug插件的日志扩展,支持AS2及AS3

http://code.google.com/p/flash-thunderbolt/

7、FlashTracer Firefox扩展,可以以侧栏的方式将Flash中trace()的结果显示

8、RIALogger 另一款Flex/AIR的Debug工具

http://renaun.com/blog/flex-components/rialogger/

9、Alcon 一款轻量级的AS2及AS3的Debug工具,AIR方式将Debug信息展示出来

http://blog.hexagonstar.com/alcon/

10、GDS (Granite Data Services) 开源,提供了Adobe LiveCycle Data Services类似功能的服务器

http://www.graniteds.org/

Flex Explorers (大部分为Flex2版本,但同样适用于Flex3)

1、Flex3 Component Explorer Flex各类组件示例

http://examples.adobe.com/flex3/componentexplorer/explorer.html

2、Resize ManagerFX Explorer (此为商业作品,要收费的)

http://www.teotigraphix.com/explorers/ResizeManagerFX/ResizeManagerFXExplorer.html

3、Flex3 Style Explorer

http://examples.adobe.com/flex3/consulting/styleexplorer/Flex3StyleExplorer.html

4、Flex2 Style Explorer(添加了Kuler功能)Flex UI组件风格定制并可输出为CSS

http://www.maclema.com/content/sek/

5、Flex2 Style Explorer(Adobe 原始的版本)

http://examples.adobe.com/flex2/consulting/styleexplorer/Flex2StyleExplorer.html

6、Flex2 Filter Explorer 查看各类滤镜效果并可进行设置

http://merhl.com/flex2_samples/filterExplorer/

http://merhl.com/?p=40 (AIR版本)

7、Flex2 Primitive Explorer 在Flex中创建各种简单形状

http://www.flexibleexperiments.com/Flex/PrimitiveExplorer/Flex2PrimitiveExplorer.html

Papervision3D——第一步

Flash不能做真的3d模型,只能将2d的图片通过矩阵计算变形做成3d的效果。Papervision3d就是这样一个开源的工具,可以帮助开发者方便地开发出具有3d效果的场景。并且支持交互及灯光等应用。

首先,需要去下载PV3d的包,然后在工程中导入即可。
下载地址为:http://code.google.com/p/papervision3d/downloads/list

利用BasicView类,PV3d的场景有这样简单的几部分构成。首先是BasicView这个类会将camera, viewPort, scene等基本元素初始化好,以便需要的时候可以随时使用。然后就是场景中的模型,一些基本的模型可以在org.papervision3d.objects下找到。模型的表面需要附有材质,这样模型的效果才能被表现出来,所以需要org.papervision3d.materials下的材质类进行贴图。最后将这些元素组合起来,再进行渲染,就可以得到想要的场景了。

以下是一个简单的实例:

[sourcecode language="as3"]package
{

import flash.display.*;

import org.papervision3d.materials.BitmapMaterial; //位图材质
import org.papervision3d.materials.utils.MaterialsList; //材质列表,用于给cube各个的面赋予材质,可以是相同的,也可以是不同的
import org.papervision3d.objects.primitives.Cube; //cube模型
import org.papervision3d.view.BasicView; //基本视图

public class pv1 extends BasicView
{
//定义一个贴图的图片
[Embed(source = "assets/pv3d.png")] private var MyTextureImage:Class;
private var bitmap:Bitmap = new MyTextureImage();

private var cube:Cube;

public function pv1()
{
super(0, 0, true, true);
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;

//设置camera
camera.z = -500;
camera.orbit(500, -500);

//设置贴图材质
var bitmapMaterial:BitmapMaterial = new BitmapMaterial(bitmap.bitmapData, false);

var materials:MaterialsList = new MaterialsList();
materials.addMaterial(bitmapMaterial, "all");

//初始化cube
cube = new Cube(materials, 100, 100, 100);
cube.x = 200;

scene.addChild(cube);

//渲染
startRendering();
}
}

}[/sourcecode]
效果如下:

BasicView类继承自Sprite。上例中camera, scene和startRendering都是在BasicView中定义好的,所以可以直接使用。

源码点此下载(不包含PV3D包)

as3通过”?”传递的参数

发现有很多人还在问这个问题,所以放到blog上来。

通过”?”或者给param属性将参数传给swf文件,比如swf?abc=123

在as3中
var param:Object = root.loaderInfo.parameters;
param.abc就是你需要的参数123了

使用FLASH开发AIR基础

AIR的应用,区别于传统网页应用的地方是和本地系统的一些交互。并且很多web引用中的设置,也是很需要的。

1.程序的初始化定位
AIR的程序如同其他的程序一样,都会有在屏幕上定位的设置。在AIR的api中,Screen.mainScreen包含了当前屏幕的参数信息,我们可以通过Screen.mainScreen.bounds.width和Screen.mainScreen.bounds.height来获得屏幕的长和宽,通过stage.nativeWindow.x和stage.nativeWindow.y对窗体相对于左上角的位置进行定位。当然如果是固定位置的话,也可在app.xml中直接设置。以下用as举例说明:
[sourcecode language='java'] stage.nativeWindow.x=Screen.mainScreen.bounds.width-210;
stage.nativeWindow.y=30;[/sourcecode]
这样就将窗口的左上角定位在了距屏幕上沿30,右沿210的位置上。

2. 任务栏通知区图标
在任务栏通知区添加图标,可以对AIR窗体的动作进行方便的管理。制作的主要步骤是首先建立一个16*16的Bitmap图像。然后建立NativeMenu对象为点击动作添加弹出菜单。最后通过初始化SystemTrayIcon对象,在程序打开的时候,将图标添加至右下脚任务栏通知区内。如果我们想把程序最小化到任务栏通知区,且从任务栏中隐藏。这时并不是关掉程序,而是在后台继续执行。我们需要做的是设置stage.nativeWindow.visible的值为true/false。
示例代码如下:

[sourcecode language='java'] var clockImage:iconPNG16=new iconPNG16(16,16);
var sysTrayIcon:SystemTrayIcon=NativeApplication.nativeApplication.icon as SystemTrayIcon;

function creatSystemTray():void {
NativeApplication.nativeApplication.icon.bitmaps=[clockImage];
sysTrayIcon.tooltip=”tooltipStr”;
sysTrayIcon.addEventListener(MouseEvent.CLICK,undock);
sysTrayIcon.menu=createIconMenu();
}

function createIconMenu():NativeMenu {
var iconMenu:NativeMenu = new NativeMenu();
var openNativeMenuItem:NativeMenuItem=new NativeMenuItem(“Visite Flox”);
var exitCommand:NativeMenuItem=new NativeMenuItem(“Exit”);
openNativeMenuItem.addEventListener(Event.SELECT, getFlox);
exitCommand.addEventListener(Event.SELECT, exit);
iconMenu.addItem(openNativeMenuItem);
iconMenu.addItem(new NativeMenuItem(“”,true));
iconMenu.addItem(exitCommand);
return iconMenu;
}

function undock(event:Event = null):void {
if (stage.nativeWindow.visible) {
stage.nativeWindow.visible=false;
} else {
stage.nativeWindow.visible=true;
stage.nativeWindow.orderToFront();
}
}

function getFlox(event:Event):void{
var url:String = “http://www.flox.cn”;
var request:URLRequest = new URLRequest(url);
navigateToURL(request,”_blank”);
}

function exit(event:Event):void {
NativeApplication.nativeApplication.exit();
}

creatSystemTray();[/sourcecode]

示例Demo:AIR

AIRStock alpha0.1

AIR Stock 是一个免费的股票信息即时查询软件。

在安装之前,请确定您的计算机上是否已安装,Adobe AIR的运行环境。如果遇到air文件不能识别或安装有问题,请访问Adobe AIR的官方网站http://get.adobe.com/cn/air/获取最新的版本。

添加新的股票请点击右下角的”+”标志,在弹出的界面内的白色横条区域输入所需添加的代码。上证交易所股票,请在代码前加上sh,如:sh600508,深圳交易所代码请在代码前加上sz,如:sz000938。如需删除,请在此时上方的列表中选择所需删除的代码,右键点击则可删除。

左键单击任务栏中的小图标即可切换主界面的显示和隐藏右键点击它,弹出退出菜单。

下载:AIRStock

AMFPHP和Action Script通讯入门教程

AMFPHP是PHP的远程调用(RPC, Remote Procedure Call)工具。它可以使PHP与下述技术无缝通信:
(1) Flash 和 Flex Remoting
(2) JavaScript JSON 和 Ajax JSON
(3) XML 和XML-RPC
AMFPHP可以正确地序列化、反序列化复杂类型数据。除了对象和数组,它还支持resources 数据连接资源,这就意味着我们可以通过调用远程方法简单返回mysql_query,amfphp 会处理这一切。如果平台支持 (目前来说,Flash Remoting 和Flex Remoting),AMFPHP还可以处理循环引用和自定义数据它也支持简单的远程调试。还有AMFPHP附带一个浏览器,它可以在创建客户端代码前测 试远程服务。AMFPHP 1.0.1还添加了模板,可以自动生成客户端代码。AMFPHP 1.9 beta新增了对AMF3的支持。
AMFPHP 的官方网站是:www.amfphp.org/
AMFPHP 的官方下载地址是:http://sourceforge.net/project/showfiles.php?group_id=72483

以1.9 beta版本为例。加压缩后会有一个名为amfphp的文件夹,将其放到web目录下。我们自定义的类文件可以放到amfphp/services/目录下。例如:
[sourcecode language='php'] class CustomClass {
public function customFunction($msg){
return $msg." Welcome!";
}
}
?>[/sourcecode]
这里请注意,所保存的文件名必须与类的名称一致。像这个例子中的文件,就应该保存成CustomClass.php。这样在调用amfphp的时候就可以自动加载这个类文件,执行相应操作了。

当flash调用这个类时,脚本会将接收到的string前加上”here returns”,以同样的string格式返回给flash。
Flash端的Actionscrpt脚本如下:
[sourcecode language='java']var nc:NetConnection = new NetConnection();
nc.connect(“http://localhost/amfphp/gateway.php”);
var res:Responder = new Responder(onResult,onError);
var sendMsg:String = “Hi,man!”;
nc.call(“CustomClass.customFunction”,res,sendMsg);

function onResult(e:Object):void{
trace(“Result: “+e);
}
function onError(e:Object):void{
trace(“Error: “+e);
}[/sourcecode]

Actionscrpt的主要工作,第一步是建立一个NetConnection对象到服务器上的server.php,然后创建一个 Responder对象来接收返回的信息内容和错误信息。再通过NetConnection.call将请求内容发送出去。实例中即是呼叫 CustomClass中的customFunction,并将sendMsg信息后加上”Hi,man!”传给它。
本例中,我们trace出:
[sourcecode language='java']Result: Hi,man! Welcome![/sourcecode]

文中所用到的程序源文件:amfphp

转载请注明出处:http://www.flox.cn/?p=41

Zend AMF Server入门教程

Zend_Amf是Zend Framework 1.7+的一部分。它提供了一种PHP头端对FlashPlayer和AIR的通信支持。Zend_Amf_Server采用的是AMF3格式。Adobe已经确定Zend_AMF为其官方合作伙伴,支持性应该可以得到一定的保证。

具体请参见:http://framework.zend.com/manual/en/zend.amf.html

下载请到:http://framework.zend.com/download/latest

当我们下载完毕后,取出压缩包中的”library”文件夹,将其放到web目录下。这时,需要将这个目录配置到PHP的”include_path”路径下,有两种方式:一种是直接修改”php.ini”的”include_path”,将library的绝对路径添加到上面;另一种是在php脚本中,使用ini_set()方法将其包含进去。第一种方法比较简便,但是如果没有环境配置权限的话,恐难执行,比如虚拟主机的用户,这时就可以采取第二种方式了。

先给出大家一个最简单实例文件:server.php

[sourcecode language='php']

require_once "Zend/Amf/Server.php";

require_once "CustomClass.php";

$server=new Zend_Amf_Server();

$server->setClass(“CustomClass”);

echo($server->handle());

?>[/sourcecode]

环境ok以后,我们首先需要包含进连接所必须的server文件”Zend/Amf/Server.php”。然后添加入我们自己所编写的类,例如CustomClass。再来new 一个 Zend_Amf_Server对象,setClass到CustomClass,最后echo($server->handle())。很多地方,包括官方文档,最后的时候直接用的是$server->handle(),但是我在使用的过程中发现这样是不行的,需要echo出来才行。

一个简单的发送和接收string类,可以这样:

[sourcecode language='php']

class CustomClass

{

public function customFunction ($msg)

{

return "here returns ". $msg;

}

}

?>[/sourcecode]

当flash调用这个类时,脚本会将接收到的string前加上”here returns”,以同样的string格式返回给flash。

Flash端的Actionscrpt脚本如下:

[sourcecode language='java']var nc:NetConnection=new NetConnection();

nc.connect(“http://localhost/server.php”);

var res:Responder=new Responder(onResult,onError);

var sendMsg:String = “Hi,man!”

nc.call(“CustomClass.customFunction “,res, sendMsg);

function onResult(e:Object):void{

trace(“Result: “+e);

}

function onError(e:Object):void{

trace(“Error: “+e);

}[/sourcecode]

Actionscrpt的主要工作,第一步是建立一个NetConnection对象到服务器上的server.php,然后创建一个Responder对象来接收返回的信息内容和错误信息。再通过NetConnection.call将请求内容发送出去。实例中即是呼叫CustomClass中的customFunction,并将sendMsg信息前加上”here returns”传给它。

本例中,我们trace出:

[sourcecode language='java']Result: here returns Hi,man![/sourcecode]

关于Zend Framework更为详细的配置,请参阅:Zend Framework QuickStart

文中所用到的程序源文件:zend_amf.rar

转载请注明出处:http://www.flox.cn/?p=37