Adobe Flash Builder 4.5 Android Air 程序开发系列 之七 重力感应

本文介绍了如何使用ActionScript中的Accelerometer类实现设备运动传感器的数据读取,并通过几个实例展示了如何运用这些数据进行简单的动画制作、边界限制、围绕中心旋转及震动检测等功能。

运动传感器,设备中有个板载的感应器,感应器中有个轴用来感应移动。如x轴,从左到右,y轴从下到上,z轴,从后到钱。

   Accelerometer 类。

   flash.sensors.Accelerometer 类是新增加的ActionScript 类,用来接收从感应发过来得数据。是EveDispatcher 类的子类。

   

   flash.sensors.AccelerometerEvent 是一个新的事件,返回了感应器的更新的信息

   

   //检查设备是否支持重力感应

   import flash.sensors.Accelerometer;

   if(Accelerometer.isSuppported==false)

{

return;

}

如果用户不启用重力感应,则Accelerometer 类的muted 属性为flase。

重力感应,需要设置初始化一个Accelerotmter 的一个对象,

//

private var accelerometer:Accelerometer;

accelerometer=new Accelerometer();

import flash.events.AccelerometerEvent;

accelerometer.addEventListener(AccelerometerEvent.UPDATE,onUpdate);

function onUpdate(event:AccelerometerEvent):void

{

trace(event.accelerationX)

trace(event.accelerationY)

trace(event.accelerationZ);

trace(event.timestamp);

}

//可视化的状态呈现

接下来的应用程序,我们将展示重力感应在x,y,z轴上的值。创建一个颜色的工具条,x是红色,y是绿色,z是蓝色。中间的垂直线代表了

0点或者是重置状态。

简单的动画:

我们来制作一个简单的沿着x和y轴的动画。我们将会移动这个ball,随着设备的移动。

public class SimpleBall extends Sprite

{

private const MULTIPLIER:Number = 8.0;

private var _accelerometer:Accelerometer;

private var _ball:Shape;

public function SimpleBall()

{

stage.align = StageAlign.TOP_LEFT;

stage.scaleMode = StageScaleMode.NO_SCALE;

init();

}

private function init():void 

{

if (Accelerometer.isSupported) 

{

_ball = new Shape();

var g:Graphics = _ball.graphics;

g.beginFill(0xFF9900);

g.drawCircle(0, 0, 50);

g.endFill();

_ball.x = stage.stageWidth * 0.5;

_ball.y = stage.stageHeight * 0.5;

_ball.cacheAsBitmap = true;

addChild(_ball);

_accelerometer = new Accelerometer();

_accelerometer.addEventListener(AccelerometerEvent.UPDATE, onUpdate);

}

}

private function onUpdate(event:AccelerometerEvent):void 

{

_ball.x -= event.accelerationX * MULTIPLIER;

_ball.y += event.accelerationY * MULTIPLIER;

}

}

更新和渲染屏幕

边界

保持你的动画在屏幕的边界以内。设置边界当球儿的位置更新是改变他们。

public class Boundaries extends Sprite

{

private const MULTIPLIER:Number = 20.0;

private var _accelerometer:Accelerometer;

private var _vx:Number = 0.0;

private var _vy:Number = 0.0;

private var _ball:Shape;

private var _radius:int;

private var _xBounds:int;

private var _yBounds:int;

private var _newX:Number = 0.0;

private var _newY:Number = 0.0;

public function Boundaries()

{

stage.align = StageAlign.TOP_LEFT;

stage.scaleMode = StageScaleMode.NO_SCALE;

init();

}

private function init():void 

{

if (Accelerometer.isSupported) 

{

_ball = new Shape();

var g:Graphics = _ball.graphics;

g.beginFill(0xFF9900);

g.drawCircle(0, 0, 50);

g.endFill();

_ball.x = stage.stageWidth * 0.5;

_ball.y = stage.stageHeight * 0.5;

_ball.cacheAsBitmap = true;

addChild(_ball);

_radius = _ball.width;

_xBounds = stage.stageWidth - _radius;

_yBounds = stage.stageHeight - _radius;

_accelerometer = new Accelerometer();

_accelerometer.addEventListener(AccelerometerEvent.UPDATE, onUpdate);

stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);

}

}

private function onUpdate(event:AccelerometerEvent):void 

{

_vx = event.accelerationX * MULTIPLIER;

_vy = event.accelerationY * MULTIPLIER;

}

private function onEnterFrame(event:Event):void

{

_newX = _ball.x - _vx;

_newY = _ball.y + _vy;

if (_newX > _radius && _newX < _xBounds)

{

_ball.x = _newX;

}

if (_newY > _radius && _newY < _yBounds)

{

_ball.y = _newY;

}

}

围绕中心旋转:

public class RotateCenter extends Sprite

{

private const MULTIPLIER:Number = 10.0;

private var _accelerometer:Accelerometer;

private var _ball:Shape;

private var _radius:int;

private var _xBounds:int;

private var _yBounds:int;

private var _centerX:int;

private var _centerY:int;

private var _vx:Number = 0.0;

private var _vy:Number = 0.0;

private var _newX:Number = 0.0;

private var _newY:Number = 0.0;

public function RotateCenter()

{

stage.align = StageAlign.TOP_LEFT;

stage.scaleMode = StageScaleMode.NO_SCALE;

init();

}

private function init():void 

{

if (Accelerometer.isSupported) 

{

_ball = new Shape();

var g:Graphics = _ball.graphics;

g.beginFill(0xFF3300);

g.drawCircle(0, 0, 30);

g.beginFill(0xFFFF00);

g.drawCircle(10, 10, 10);

g.endFill();

_ball.x = stage.stageWidth * 0.5;

_ball.y = stage.stageHeight * 0.5;

_ball.cacheAsBitmap = true;

addChild(_ball);

_centerX = stage.stageWidth*0.5;

_centerY = stage.stageHeight*0.5;

_radius = _ball.width;

_xBounds = stage.stageWidth - _radius;

_yBounds = stage.stageHeight - _radius;

_accelerometer = new Accelerometer();

_accelerometer.addEventListener(AccelerometerEvent.UPDATE, onUpdate);

stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);

}

}

private function onUpdate(event:AccelerometerEvent):void 

{

_vx = event.accelerationX * MULTIPLIER;

_vy = event.accelerationY * MULTIPLIER;

}

private function onEnterFrame(event:Event):void

{

_newX = _ball.x - _vx;

_newY = _ball.y + _vy;

if (_newX > _radius && _newX < _xBounds)

{

_ball.x = _newX;

}

if (_newY > _radius && _newY < _yBounds)

{

_ball.y = _newY;

}

var dx:int = _centerX - _ball.x;

var dy:int = _centerY - _ball.y;

var radians:Number = Math.atan2(dy, dx);

_ball.rotation = radians*180/Math.PI;

}

}

震动:

震动设备是一个很常见的交互方式。你可以使用他来确定用户的强度,假设是一个真实的对象。

 震动可以被定义为一个强烈的运动,关联了一个很大的值。这个例子中,当织大于边界值2.0 ,我们认为移动是一个震动。

public class Shake extends Sprite

{

private const THRESHOLD:Number = 1.5;

private var _accelerometer:Accelerometer;

private var _isMeasuring:Boolean = false;

private var _isShaking:Boolean = false;

public function Shake()

{

stage.align = StageAlign.TOP_LEFT;

stage.scaleMode = StageScaleMode.NO_SCALE;

init();

}

private function init():void 

{

if (Accelerometer.isSupported) 

{

trace("is supported");

_accelerometer = new Accelerometer();

_accelerometer.addEventListener(AccelerometerEvent.UPDATE, onUpdate);

}

}

private function onUpdate(event:AccelerometerEvent):void 

{

if (_isMeasuring) {

return;

}

_isMeasuring = true;

trace("x", event.accelerationX);

trace("y", event.accelerationY);

trace("z", event.accelerationZ);

if (Math.abs(event.accelerationX) > THRESHOLD)

{

_isShaking = true;

}

if (Math.abs(event.accelerationY) > THRESHOLD*2)

{

_isShaking = true;

}

if (Math.abs(event.accelerationZ) > THRESHOLD*3)

{

_isShaking = true;

}

if (_isShaking)

{

trace("we have a shake");

}

_isMeasuring = false;

}

平滑的值


转载:http://www.cnblogs.com/csharponworking/archive/2011/08/04/2127990.html

先展示下效果 https://pan.quark.cn/s/e81b877737c1 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 执行环境,它使开发者能够在服务器端执行 JavaScript 编程,显著促进了全栈开发的应用普及。 在 Node.js 的开发流程中,`node_modules` 文件夹用于存储所有依赖的模块,随着项目的进展,该文件夹可能会变得异常庞大,其中包含了众多可能已不再需要的文件和文件夹,这不仅会消耗大量的硬盘空间,还可能减慢项目的加载时间。 `ModClean 2.0` 正是为了应对这一挑战而设计的工具。 `ModClean` 是一款用于清理 `node_modules` 的软件,其核心功能是移除那些不再被使用的文件和文件夹,从而确保项目的整洁性和运行效率。 `ModClean 2.0` 是此工具的改进版本,在原有功能上增加了更多特性,从而提高了清理工作的效率和精确度。 在 `ModClean 2.0` 中,用户可以设置清理规则,例如排除特定的模块或文件类型,以防止误删重要文件。 该工具通常会保留项目所依赖的核心模块,但会移除测试、文档、示例代码等非运行时必需的部分。 通过这种方式,`ModClean` 能够协助开发者优化项目结构,减少不必要的依赖,加快项目的构建速度。 使用 `ModClean` 的步骤大致如下:1. 需要先安装 `ModClean`,在项目的根目录中执行以下命令: ``` npm install modclean -g ```2. 创建配置文件 `.modcleanrc.json` 或 `.modcleanrc.js`,设定希望清理的规则。 比如,可能需要忽略 `LICENSE` 文件或整个 `docs`...
2026最新微信在线AI客服系统源码 微信客服AI系统是一款基于PHP开发的智能客服解决方案,完美集成企业微信客服,为企业提供7×24小时智能客服服务。系统支持文本对话、图片分析、视频分析等多种交互方式,并具备完善的对话管理、人工转接、咨询提醒等高级功能。 核心功能 ### 1.  智能AI客服 #### 自动回复 - **上下文理解**:系统自动保存用户对话历史,AI能够理解上下文,提供连贯的对话体验 - **个性化配置**:可自定义系统提示词、最大输出长度等AI参数 #### 产品知识库集成 - **公司信息**:支持配置公司简介、官网、竞争对手等信息 - **产品列表**:可添加多个产品,包括产品名称、配置、价格、适用人群、特点等 - **常见问题FAQ**:预设常见问题及答案,AI优先使用知识库内容回答 - **促销活动**:支持配置当前优惠活动,AI会自动向用户推荐 ### 2. 多媒体支持 #### 图片分析 - 支持用户发送图片,AI自动分析图片内容 - 可结合文字描述,提供更精准的分析结果 - 支持常见图片格式:JPG、PNG、GIF、WebP等 #### 视频分析 - 支持用户发送视频,AI自动分析视频内容 - 视频文件自动保存到服务器,提供公网访问 - 支持常见视频格式:MP4、等 ### 3.  人工客服转接 #### 关键词触发 - **自定义关键词**:可配置多个转人工触发关键词(如:人工、客服、转人工等) - **自动转接**:用户消息包含关键词时,自动转接给指定人工客服 - **友好提示**:转接前向用户发送提示消息,提升用户体验 #### 一键介入功能 - **后台管理**:管理员可在对话管理页面查看所有对话记录 - **快速转接**:点击"一键介入"按钮,立即将用户转接给人工客服
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值