BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Gyroscope原生扩展示例

| 作者 Adobe 关注 0 他的粉丝 发布于 2011年9月27日. 估计阅读时间: 11 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

目录

要求

预备知识

熟悉在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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT