【AICon】 如何构建高效的 RAG 系统?RAG 技术在实际应用中遇到的挑战及应对策略?>>> 了解详情
写点什么

Gyroscope 原生扩展示例

  • 2011-09-26
  • 本文字数:2487 字

    阅读完需:约 8 分钟

目录

要求

预备知识

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

2011-09-26 00:001423
用户头像

发布了 27 篇内容, 共 23553 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

MySQL复杂where条件分析

程序员历小冰

MySQL

甲方日常4

句子

工作 随笔杂谈 日常

C语言内存泄露很严重,如何应对?

华为云开发者联盟

c 内存泄露 内存 代码 函数

1. 不吹不擂,第一篇就能提升你对Bean Validation数据校验的认知

YourBatman

Hibernate-Validator Bean Validation 数据校验 JSR380

话题讨论 | 当你敲代码累了时,一般喜欢吃点什么补充能量?

InfoQ写作社区官方

加班 写作平台 代码 话题讨论

Cassandra Gossip协议的二三事儿

华为云开发者联盟

源码 三次握手 开发者 Cassandra Gossip协议

Golang写算法

卒迹

算法 Go 语言

DockerHub 镜像仓库的使用

哈喽沃德先生

Docker 容器 微服务 镜像

SpreadJS 纯前端表格控件应用案例:雨诺订单管理系统(雨诺OMS)

葡萄城技术团队

自己做的 PPT 总被批「缺少干货」?试试先回答这三个问题

Tony Wu

效率工具 方法论 PPT

java安全编码指南之:对象构建

程序那些事

Java 安全 安全编码指南 对象构建

云原生如何来进行HTTPS升级

soolaugust

架构 云原生 设计模式

面试是一张窄窄的船票

escray

学习 面试

week 12 学习总结

Geek_2e7dd7

SpreadJS 纯前端表格控件应用案例:表格数据管理平台

葡萄城技术团队

挽救你的视频号:能够把PPT转换成视频,把备注转换成语音的开源项目

陈磊@Criss

LeetCode题解:155. 最小栈,单个栈存储入栈元素与最小值之差,JavaScript,详细注释

Lee Chen

大前端 LeetCode

你也许还不懂静态方法和实例方法

架构师修行之路

Keepass+Synology 打造私人密码管理器

zj坚果

新时代背景下的Java语法特性

九叔(高翔龙)

Java java 14 java 14 新特性 Java 分布式

揭开链表的真面目

Java旅途

Java 数据结构 链表

SpreadJS 纯前端表格控件应用案例:MHT-CP数据填报采集平台

葡萄城技术团队

Jenkins持续集成「编译打包、代码检查、单元测试、环境部署、软件测试​」

清菡软件测试

jenkins

oeasy教您玩转linux-010110内容回顾

o

anyRTC Native 4.1.0.1与Web SDK 4.0.11上线

anyRTC开发者

学习 WebRTC 语音 直播 sdk

week 12 作业

Geek_2e7dd7

拖延症竟然是自己给自己的一种奖励?如何干掉它?

非著名程序员

个人成长 拖延症 番茄土豆工作法

产品经理的架构思维

吴世亮

架构 产品经理 电商

性能相关 磁盘I/O子系统

Linuxer

面试必备知识点:悲观锁和乐观锁的那些事儿

鄙人薛某

面试 乐观锁 悲观锁 CAS 并发控制

MAC系统初始化

焦振清

macos 重装系统

Gyroscope原生扩展示例_语言 & 开发_Adobe_InfoQ精选文章