目录
要求
预备知识
熟悉在 Adobe AIR 上构建移动应用程序,包括熟悉 Objective C、Xcode 或 Android 开发。
需要的第三方产品
用户水平
中级
需要的产品
- Flash Builder 4.5 Premium(下载试用版)
示例文件
注意:要使用此原生扩展,您需要 Flash Builder 4.5.1 Premium 和 Adobe AIR 3,可以在 Adobe Labs 上获得它们的候选发行版。
Gyroscope 类是针对 Adobe AIR 的一个原生扩展。它允许来自 ActionScript 的 AIR 应用程序开发人员访问 Android 或 iOS 移动设备的陀螺仪数据。
附加的 ZIP 文件包含:
- 目录 AS 中的 ActionScript 库。此目录包含创建 Gyroscope 扩展的 ActionScript 部分的 Flash Builder 项目。
- 目录 NativeAndroid 中的 Android 原生库。此目录包含创建 Gyroscope 扩展的 Android 原生部分的 Eclipse 项目。要构建 Eclipse 项目,首先将 FlashRuntimeExtension.jar 从 _AIR_SDK_>/lib/android/FlashRuntimeExtensions.jar 复制到 NativeAndroid\lib 目录。
- 目录 NativeIOS 中的 iOS 原生库。此目录包含创建 Gyroscope 扩展的 iOS 原生部分的 Xcode 项目。要构建 Xcode 项目,首先将 FlashRuntimeExtension.h 从 <AIR_SDK>/include/FlashRuntimeExtensions.h 复制到 NativeIOS\iosextension 目录。
- 一个名为 Binaries 的目录,包含 AIR 应用程序开发人员使用原生扩展所需的所有内容:ANE 文件、SWC 文件和包含扩展 ID 的文本文件。
- 一个名为 Eg 的目录,包含使用 Gyroscope 原生扩展的示例 AIR 应用程序。
ActionScript 库
ActionScript 库包含 Gyroscope 类。Gyroscope 类向 AIR 应用程序提供了这些公共方法和属性:
- public static function get isSupported(): Boolean
- public function setRequestUpdateInterval(newInterval:int): void
- public function dispose(): void
该 AIR 应用程序可以创建 Gyroscope 类的多个实例。但是 Gyroscope 类仅创建一个 ExtensionContext 类实例,所有 Gyroscope 实例都可以共享该实例。
事件处理
扩展的原生部分分配一个 StatusEvent 事件供 ExtensionContext 实例监听:
extCtx.addEventListener(StatusEvent.STATUS, onStatus);
该事件包含设备陀螺仪的 x、y 和 z 数据。原生部分以最快的速度将此事件分配给原生操作系统。
每个 Gyroscope 实例以该实例的 setRequestUpdateInterval() 所设置的间隔分配一个类类型为 GyroscopeEvent 的事件:
private function onInterval(e:TimerEvent):void { // For each Gyroscope instance, at the requested interval, // dispatch the gyroscope data. if (extCtx != null) { dispatchEvent(new GyroscopeEvent(GyroscopeEvent.UPDATE, _x, _y, _z)); } }
dispose() 方法
AIR 应用程序在不再需要陀螺仪数据时调用 dispose()。每次应用程序创建 Gyroscope 类的一个实例,构造函数就会递增引用计数。dispose() 函数递减引用计数,当计数为 0 时,dispose() 调用一个原生函数以停止向 ActionScript 部分提供陀螺仪数据。
应用程序用途
要使用 Gyroscope 扩展,AIR 应用程序可以执行以下操作:
- 通过查看 isSupported 属性检查扩展是否受支持。
- 创建一个 Gyroscope 对象。
- 如果默认值 100 毫秒不是想要的间隔。设置 Gyroscope 对象的更新间隔。
- 监听 GyroscopeEvent 事件。
例如:
var gyro:Gyroscope; if(Gyroscope.isSupported) { gyro = new Gyroscope(); gyro.setRequestedUpdateInterval(1000); gyro.addEventListener(GyroscopeEvent.UPDATE,onChange); }
以下代码显示了事件处理函数:
private function onChange(e:GyroscopeEvent):void { trace("From gyro: " + e.x + " " + e.y + " " + " " + e.z); }
Android 原生库
Android 原生库是在 Java 中使用原生扩展 Java API 实现的。原生库包含以下类:
- GyroscopeExtension 实现 FREExtension
- GyroscopeExtensionContext 扩展 FREContext
- GyroscopeSupportedFunction、GyroscopeInitFunction、GyroscopeStartFunction 和 GyroscopeStopFunction 分别实现 FREFunction
原生库也包含类 GyroscopeListener。此类的一个对象接收 Android SensorEvent 事件,进而调用 GyroscopeExtensionContext 对象的 dispatchStatusEventAsync()。
原生库还包含使用这些 FREObject 方法的示例:
- newObject()
- getAsInt()
在初始化时,原生库使用 FREContext 类的 getActivity() 方法获取应用程序的 Android 活动。使用返回的活动,初始化方法(InitFunction.call())获取传感器服务:
SensorManager sm = (SensorManager)extCtx.getActivity().getSystemService(Activity.SENSOR_SERVICE);
注意:从 ActionScript 部分对 ExtensionContext.createExtensionContext() 的调用必须先返回,原生库才能够调用派生自 FREContext 类的对象的方法。因此,调用 getActivity() 发生在 ActionScript 部分在来自 createExtensionContext() 的返回值后调用的初始化函数内。对 getActivity() 的调用不能发生在 FREContext 构造函数内。
iOS 原生库
iOS 原生库在 Objective C 中使用原生扩展 C API 实现。原生库包含这些原生扩展 C API 的示例:
- 扩展初始化器和终结器,使用签名 FREInitializer() 和 FREFinalizer()。
- 上下文初始化器和终结器,使用签名 FREContextInitializer() 和 FREContextFinalizer()。
- 原生函数,使用签名 FREFunction()。原生函数包括 startGyro()、stopGyro()、supportGyro() 和 initStub()。
- FREDispatchStatusEventAsync()
- FRENewObjectFromBool()
原生函数使用 CMMotionManager 和 CMGyroData 等 iOS 类来检查一个陀螺仪是否可用,并访问设备的陀螺仪数据。
注意:在 iOS 原生实现中,不需要初始化,所以初始化原生函数 initStub() 不执行任何操作。但是,该函数必不可少,因为 Android 原生实现需要一个初始化函数。因此,要使扩展的 ActionScript 接口对于所有原生实现都相同,iOS 原生实现提供了存根。
延伸阅读
关于开发 Adobe AIR 的原生扩展的更多信息,请参阅:
评论