Gyroscope 原生扩展示例

阅读数:892 2011 年 9 月 26 日

话题:语言 & 开发

目录

要求

预备知识

熟悉在 Adobe AIR 上构建移动应用程序,包括熟悉 Objective C、Xcode 或 Android 开发。

需要的第三方产品

用户水平

中级

需要的产品

示例文件

注意:要使用此原生扩展,您需要 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 的原生扩展的更多信息,请参阅:

查看原文:Gyroscope native extension sample