Android编程之重力感应用法分析

本文实例讲述了Android编程之重力感应用法。分享给大家供大家参考,具体如下:

重力感应主要是依靠手机的加速度传感器(accelerometer)来实现

在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器。因为很多功能用户根本不care的所以可能开发商会把某些功能屏蔽掉。还是得根据真机的实际情况来做开发,下面主要讨论加速度传感器的具体实现方式,传感器名称如下:

加速度传感器(accelerometer)
陀螺仪传感器(gyroscope)
环境光照传感器(light)
磁力传感器(magnetic field)
方向传感器(orientation)
压力传感器(pressure)
距离传感器(proximity)
温度传感器(temperature)

1.SensorMannager传感器管理对象

手机中的所有传感器都须要通过SensorMannager来访问,调用getSystemService (SENSOR_SERVICE)方法就可以拿到当前手机的传感器管理对象。

2.实现SensorEventListener接口

我们需要实现SensorEventListener接口onSensorChanged(SensorEventevent)方法来捕获手机传感器的状态,拿到手机 X轴Y轴Z轴三个方向的重力分量,有了这三个方向的数据重力感应的原理我们就已经学会了。

public void onSensorChanged(SensorEvent e) {
  float x = e.values[SensorManager.DATA_X];
  float y = e.values[SensorManager.DATA_Y];
  float z = e.values[SensorManager.DATA_Z];
}

如上述代码所示:float x y z 3个方向的取值范围是在-10到10之间。下面解释一下X轴 Y轴 Z轴 重力分量的含义(这里须要注意的是坐标原点:向天空为正数,向地面为负数,刚好与编程时坐标是相反的):

(1)手机屏幕向左侧方,X轴就朝向天空,垂直放置,这时候 Y 轴与Z轴没有重力分量,因为X轴朝向天空所以它的重力分量则最大。这时候X轴、Y轴、Z轴的重力分量的值分别为(10,0,0);

(2)手机屏幕向右侧方,X轴就朝向地面,垂直放置,这时候 Y 轴与 Z轴没有重力分量,因为X轴朝向地面所以它的重力分量则最小。这时候X轴、Y轴、Z轴的重力分量的值分别为(-10,0,0);

(3)手机屏幕垂直竖立放置,Y轴就朝向天空,垂直放置,这时候X 轴与Z轴没有重力分量,因为Y轴朝向天空所以它的重力分量则最大。这时候X轴、Y轴、Z轴的重力分量的值分别为(0,10,0);

(4)手机屏幕垂直竖立放置,Y轴就朝向地面,垂直放置,这时候X 轴与Z轴没有重力分量,因为Y轴朝向地面所以它的重力分量则最小 。这时候X轴、Y轴、Z轴的重力分量的值分别为(0,-10,0);

(5)手机屏幕向上,Z轴就朝向天空,水平放置,这时候 X 轴与Y轴没有重力分量,因为Z轴朝向天空所以它的重力分量则最大。这时候X轴、Y轴、Z轴的重力分量的值分别为(0,0,10);

(6)手机屏幕向上,Z轴就朝向地面,水平放置,这时候 X 轴与Y轴没有重力分量,因为Z轴朝向地面所以它的重力分量则最小。这时候X轴、Y轴、Z轴的重力分量的值分别为(0,0,-10)。

3.注册SensorEventListener

使用SensorMannager调用getDefaultSensor(Sensor.TYPE_ACCELEROMETER)方法拿到加速重力感应的Sensor对象。因为我讨论的是重力加速度传感器所以参数为Sensor.TYPE_ACCELEROMETER,如果需要拿到其它的传感器需要传入对应的名称。使用SensorMannager调用registerListener()方法来注册,第三个参数是检测的灵敏精确度,根据不同的需求来选择精准度,游戏开发建议使用  SensorManagerSENSOR_DELAY_ GAME。

4 .重力感应简单速度计算的方式

每次摇晃手机计算出 X轴 Y轴 Z轴的重力分量可以将它们记录下来 然后每次摇晃的重力分量和之前的重力分量可以做一个对比,利用差值和时间就可以计算出他们的移动速度。

重力感应装置包括感应器、处理器和控制器三个部分。感应器负责侦测存储器的状态,计算存储器的重力加速度值;处理器则对加速度值是否超出安全范围进行判断;而控制器则负责控制将磁头锁定或者释放出安全停泊区。一旦感应器侦测并经处理器判断当前的重力加速度超过安全值之后,控制器就会通过硬件控制磁头停止读写工作,并快速归位,锁定在专有的磁头停泊区。这一系列动作会在200毫秒内完成。当感应装置探测到加速度值恢复到正常值范围之后,产品才会恢复工作。

Android多媒体框架的代码在以下目录中:external/opencore/.这个目录是Android多媒体框架的根目录,其中包含的子目录如下所示:

* android:这里面是一个上层的库,它基于PVPlayer和PVAuthor的SDK实现了一个为Android使用的Player和Author
* baselibs:包含数据结构和线程安全等内容的底层库
* codecs_v2:这是一个内容较多的库,主要包含编解码的实现,以及一个OpenMAX的实现
* engines:包含PVPlayer和PVAuthor引擎的实现
*extern_libs_v2:包含了khronos的OpenMAX的头文件
*fileformats:文件格式的据具体解析(parser)类
* nodes:编解码和文件解析的各个node类
* oscl:操作系统兼容库
* pvmi: 输入输出控制的抽象接口
* protocols:主要是与网络相关的RTSP、RTP、HTTP等协议的相关内容
* pvcommon:pvcommon库文件的Android.mk文件,没有源文件
*pvplayer:pvplayer库文件的Android.mk文件,没有源文件
* pvauthor:pvauthor库文件的Android.mk文件,没有源文件
* tools_v2:编译工具以及一些可注册的模块

以下是部分测试代码:

private SensorManager sensorMgr;
Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//保存上一次 x y z 的坐标
float bx = 0;
float by = 0;
float bz = 0;
long btime = 0;//这一次的时间
sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
SensorEventListener lsn = new SensorEventListener() {
  public void onSensorChanged(SensorEvent e) {
    float x = e.values[SensorManager.DATA_X];
    float y = e.values[SensorManager.DATA_Y];
    float z = e.values[SensorManager.DATA_Z];
    //计算出 X Y Z的数值下面可以根据这个数值来计算摇晃的速度了
    //速度 = 路程/时间
    //X轴的速度
    float speadX = (x - bx) / (System.currentTimeMillis() - btime);
    //y轴的速度
    float speadY = (y - by) / (System.currentTimeMillis() - btime);
    //z轴的速度
    float speadZ = (z - bz) / (System.currentTimeMillis() - btime);
    //这样简单的速度就可以计算出来,如果你想计算加速度也可以,在运动学里,加速度a与速度,
    //位移都有关系:Vt=V0+at,S=V0*t+1/2at^2, S=(Vt^2-V0^2)/(2a),根据这些信息也可以求解a
    bx = x;
    by = y;
    bz = z;
    btime = System.currentTimeMillis();
  }
  public void onAccuracyChanged(Sensor s, int accuracy) {
  }
};
// 注册listener,第三个参数是检测的精确度
sensorMgr.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_GAME);

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android操作SQLite数据库技巧总结》、《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android文件操作技巧汇总》、《Android编程开发之SD卡操作方法汇总》、《Android资源操作技巧汇总》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android基于Sensor感应器获取重力感应加速度的方法

    本文实例讲述了Android基于Sensor感应器获取重力感应加速度的方法.分享给大家供大家参考,具体如下: FETC项目指导老师提出了新的需求,想要在游戏地图中表现出用户用户当期移动的方向,再用GPS的话显然很不靠谱,所以想到了android强大的感应器... 很多移动设备都内置了感应器,android通过Sensor和SensorManager类抽象了这些感应器,通过这些类可以使用android设备的传感器 一 介绍Sensor类 SDK只有一句介绍"Class representing a

  • Android 重力传感器在游戏开发中的应用

    手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,将它们置于游戏当中,大大提升了游戏的可玩性和趣味性.本节将继续介绍智能手机的另一种神奇之处:传感器.    一.何为传感器 所谓传感器就是能够探测如光.热.温度.重力.方向等等的装置.    二.Android提供了哪些传感器 1.加速度传感器(重力传感器) 2.陀螺仪传感器 3.光传感器 4.恒定磁场传感器 5.方向传感器 6.恒定的压力传感器 7.接近传感器 8.温度传感器 今天我们给大家介绍的是游戏开发中最最常见

  • Android编程实现的重力感应示例代码

    本文实例讲述了Android编程实现的重力感应效果.分享给大家供大家参考,具体如下: android中的很多游戏的游戏都使用了重力感应的技术,就研究了一下重力感应 以屏幕的左下方为原点,箭头指向的方向为正.从-10到10,以浮点数为等级单位,想象以下情形: 手机屏幕向上(z轴朝天)水平放置的时侯,(x,y,z)的值分别为(0,0,10): 手机屏幕向下(z轴朝地)水平放置的时侯,(x,y,z)的值分别为(0,0,-10): 手机屏幕向左侧放(x轴朝天)的时候,(x,y,z)的值分别为(10,0,

  • Android开发获取重力加速度和磁场强度的方法

    本文实例讲述了Android开发获取重力加速度和磁场强度的方法.分享给大家供大家参考,具体如下: Android获取重力加速度和磁场强度主要依靠: Sensor.getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic) 输入数据: gravity为重力传感器测得的重力加速度float[3]: geomagnetic为罗盘传感器测得的地磁数据float[3]: 输出数据: R为通过这个方法计算得到的

  • Android 物理游戏之重力系统开发示例代码

    本节为大家提供有关物理游戏的知识,讲解了一个简单的圆形自由落体Demo的编写.本文要介绍的重力系统实际上是类似的. 在重力传感器中,虽然我也实现了一个圆形会根据手机反转的角度而拥有不同的速度,但是其内置加速度算法都是Android os封装好的,而今天我们要讲的重力系统就是去模拟这个加速度,从而让一个自由落体的圆形,感觉跟现实中的皮球一样有质有量!下落的时候速度加快,反弹起来以后速度慢慢减下来. 先贴上两张效果截图,让大家有一个直观的了解,之后再详加讲解: 圆形自由落体Demo简介 当你点击模拟

  • Android利用方向传感器获得手机的相对角度实例说明

    1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置. Y轴的方向是从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端. 将手机放在桌子上,z轴的方向是从手机指向天空. 2.方向传感器 在方向传感器中values变量的3个值都表示度数,它们的含义如下: values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度.0表示北(North):90表示东(East):180表示南(Sou

  • Android重力传感器实现滚动的弹球

    熟知: 什么是传感器: 所谓传感器能够探测如光.热.温度.重力.方向 等等的功能! Android中提供传感器有哪些: 1.  加速度传感器(重力传感器)      2.  陀螺仪传感器      3.  光传感器      5.  恒定磁场传感器      6.  方向传感器      7.  恒定的压力传感器      8.  接近传感器      9.  温度传感器 一. 问题描述 Android中有多达11种传感器,不同的手机设备支持的传感器类型也不尽相同 1. 重力传感器 GV-sen

  • Android编程中光线传感器的调用方法详解

    本文实例讲述了Android编程中光线传感器的调用方法.分享给大家供大家参考,具体如下: 1.activity如果要使用传感器,就必须实现SensorEventListener接口 2.得到传感器管理对象(sensormanager) 3.使用sensormanager.registerlistener 方法注册指定的传感器 4.在sensoreventlistener 接口中的onsensorchanged和onaccuracychanged方法中完成其他具体工作 public class T

  • Android利用传感器实现微信摇一摇功能

    本文实例为大家分享了Android微信摇一摇功能的实现方法,供大家参考,具体内容如下 import java.util.ArrayList; import java.util.List; import java.util.Random; import android.app.Activity; import android.app.Service; import android.content.res.Resources; import android.hardware.Sensor; impo

  • Android 传感器--光照传感器详解及使用

    Android 设备中有许多传感器,其中有一个传感器控制着你屏幕亮度的变化.当你在很暗的地方使用手机,你设备的屏幕会自动调暗,从而保护你眼睛. 起着这样作用,Android是通过一款光照传感器来获取你周围环境亮度的变化.光照传感器一般在手机的顶部的位置. 要在程序中使用这款传感器 (1)首先要获取SensorManager传感器管理器服务:SensorManager sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERV

随机推荐