`
mncc
  • 浏览: 54068 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android重力感应

阅读更多

个月底拿到的手机HTC Nexus One,最初是在纯粹的在玩的爽,后来到中关村图书大厦看了一下午的书,最后买了两本Android的书,然后看了看。只是看了看纯基础,也就是基础的布局和Activity的生命周期。

上周成都和京沪两头跑,什么都没看,这两天又在想火车票的事情。。。。。晕啊。。。刚刚拿到票。。。长出一口气。

关于手机重力感应的。

手机的感应器在Android里边所代表的类是Sensor,你只要看到在android.hardware这个包下边的都是封装的关于一些特殊的硬件方面的类,比如说Camera、Sensor之类的。。一直都很怀疑为什么HTC的Google手机没有前置摄像头。。。怨念啊。。。

 

PS:虽然是2.1的机子,但是我用的是1.5的SDK。

在JavaEye上边有一个很简单的帖子,最最基础的。
这里:Android重力感应Demo
我自己最开始看的很多代码都是根据这个开始改的。。。谢谢sunnyday55555 了!


代码很简单:我们首先要得到一个手机上的传感器。

 

SensorManager sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
 

这行代码只要用过类似开发的都应该知道是什么。

getSystemService(String name)可以用来返回一个硬件设备的控制器。比如说LocationManage(和GPS相关用来确定位置的)、 TelephonyManage(查询电话相关内容,比如说IMEI码)、AudioManager(顾名思义,是视频播放用的)等等。。。具体可以观看SDK文档里边 Activity的讲解。在线文档在这里(偶尔需要翻墙)

 

得到重力感应的硬件控制了,然后我们就应该得到一个Sensor了。

Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ALL);

 关于这个参数。。。其实挺复杂的。。。。我开始用的是TYPE_ALL,出的是XYZ三条轴线的偏移量,至于其他的大家可以看下边:

下边是官方SDK中对于各种类型的解析(粗体红字是我加上去的 )

 

<!-- =========== ENUM CONSTANT SUMMARY =========== -->

Constants
int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type.加速度
int TYPE_ALL A constant describing all sensor types.所有类型,NexusOne默认为 加速度
int TYPE_GYROSCOPE A constant describing a gyroscope sensor type回转仪(这个不太懂)
int TYPE_LIGHT A constant describing an light sensor type.光线感应吗
int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type.磁场
int TYPE_ORIENTATION A constant describing an orientation sensor type.定向(指北针)和角度
int TYPE_PRESSURE A constant describing a pressure sensor type压力计
int TYPE_PROXIMITY A constant describing an proximity sensor type.距离?不太懂
int TYPE_TEMPERATURE A constant describing a temperature sensor type温度啦

 

然后就是我们需要即时了解手机的偏转度。以TYPE_ALL为例子。(其实就是TYPE_ACCELEROMETER)

 

PS:有时候你的机子并不会拥有这么全的感应装置,这个时候你应该再进行以下判断。比如说:

Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_TEMPERATURE);

if(sensor == null){
        log.w("NO_SERVICE","没有感应温度的感应装置。")
        ... ...
}else{
        ... ...
}
 

所有最基本的三维坐标系有三个轴:X、Y和Z,这个学过矩阵或者线性代数的都应该知道吧(~~~~(>_<)~~~~ 我当年线性代数挂了。。。。惨不忍睹啊。。。后来自学DirectX的时候才觉得原来矩阵变换是这么的重要。。而且更重要的是这个一点也不难吗。。。。

 

关于手机的XYZ坐标,把你的手机平放到桌子上,横x,纵y,然后z就是屏幕法线。

 

官方的例子:(直接粘贴的话空格会变小,所以就截图了 )

 

然后我们注册一个Listener,用来监听我们所得到的值的改变。

SensorEventListener lsn = new SensorEventListener() {
			public void onSensorChanged(SensorEvent e) {
				x = e.values[SensorManager.DATA_X];
				y = e.values[SensorManager.DATA_Y];
				z = e.values[SensorManager.DATA_Z];
				t.setText("x=" + Math.round(x * ROUND_NUMBER) + "," + "y="
						+ Math.round(y * ROUND_NUMBER) + "," + "z="
						+ Math.round(z * ROUND_NUMBER));
			}

			public void onAccuracyChanged(Sensor s, int accuracy) {
			}
		};

在这里我把数字放大了,我预先定义了一个变量ROUND_NUMBER ,是为了以后用来更改灵敏度的。我取的值是100。

这个就简单了,我们首先声明一个SensorEvent的监听,每当它得到的值改变的时候,我就在一个TextView  t 上边输出改变了的值。

 

在这里使用TYPE_ALL返回的值SensorEvent里边的values就是得到的数字。

得到的values默认是一个float[] 。也就是说是一个float类型的数组。他在TYPE_ALL的声明下一共返回三个值,分别就是x、y、z轴的值,假如你将手机平放在水平面上,默认分别是0,0,10。(我在网上查到有的人和我得到的数字不一样,有人说是0,0,-10,关于这个我不知道是为什么,如果有人的Gphone比较多的话可以看看是怎么一回事 ),而当你将手机垂直立起,显示的应当是0,10,0。

 

PS: SensorManager里边有很多的有意思的常量,比如说SensorManager.GRAVITY_EARTH 是地球的重力加速度,当然也有GRAVITY_MARS 火星的,GRAVITY_MOON 月球的,最恶搞的还有GRAVITY_DEATH_STAR_I (星球大战里的卫星武器死星I号)。。。。还有一个GRAVITY_THE_ISLAND ,这个不知道是哪里。。。汗。。。难道是《岛》这本书里的世界?还是Neverland?

 

然后我们可以给Manager注册一个监听。

sensorMgr.registerListener(lsn, sensor,
				SensorManager.SENSOR_DELAY_GAME);

三个参数分别是监听,感应装置,和灵敏度。

 

灵敏度分为:

SENSOR_DELAY_FASTEST 最灵敏,快的然你无语
SENSOR_DELAY_GAME 游戏的时候用这个,不过一般用这个就够了,和上一个很难看出区别(也许是我的手机CPU高?1GHz的。。。)
SENSOR_DELAY_NORMAL 比较慢。
SENSOR_DELAY_UI 最慢的,几乎就是横和纵的区别

 

也许有些人想要拿这个来练练手了。比如说是现在每天播放的联通iPhone广告里有一个“可以用来测量相框水平 ”这个广告词。

 

但是,但是。。。。恩恩。。。。输出的最好还是角度比较好吧?

 

所以我们改一改,做一个基本的LevelBar。。。没有什么图形界面,只是用来输出。

 

我们首先注册的Sensor应该改了。。。不是TYPE_ALL ,而是TYPE_ORIENTATION !

 

然后剩下的基本上都一样。SensorEvent 返回的values也是三个值的数组。但是 ,这三个值还是稍微有些不同的,如果你看了输出的值,那么就可能会明白了。

 

首先是第一个,有些人发现就算是平放在桌面上第一个值也会变,那么,第一个值其实不是轴角度,而是方向。

 

对了,这就是我在随上边写的指北针 !当数字是0 的时候,你的手机指向的是正北 方向,90的话是东180是南270是西 。这下子,再加上一个漂亮的图形界面,一个指南针软件就可以出来了吧。

 

然后是第二个和第三个,就是x,y轴的角度值!对,是角度值而且不用换算。这样子,你可以把屏幕横过来,然后直接输出y轴的角度值了,什么时候他是90度,那么就是水平了!

 

 

代码就不贴了。。。。可以看我一开始给的链接。sunnyday55555写的就足够用了

 

 

 

PS:关于灵敏度,不要调的太灵敏了,我放在桌子上都一直在变。。。。

PS:PS:马上过年了,我回家是没有网络的,而且我美工很差,希望有哪位做一个像是苹果iPhone的LevelBar一样的软件,放到market上边免费下一下。

分享到:
评论
7 楼 梳子不爱头发 2014-10-28  
楼主写的很不错,之前看很多博没看懂,看这篇就懂了很多
6 楼 rongchengzhuang 2010-03-01  
膜拜,楼主写的很好,分析的很清晰,
5 楼 zhuixinjian 2010-03-01  
这个重力感应demo应该是raymondlueng写的博客吧
4 楼 hhhhhh1972 2010-02-25  
正在学习,很有用。
3 楼 lordhong 2010-02-24  
写作风格我喜欢, 呵呵, 重力感应可能不同型号的手机都不一样吧, 硬件和driver驱动应该都有点不同
2 楼 szc1984107 2010-02-23  
好文章,赞一个~~~
我年后入了里程碑,还在熟悉系统呢~~~
1 楼 yangxin114 2010-02-20  
学习学习中...

相关推荐

    Android 重力感应游戏-疯狂的小球源码程序

    Android 重力感应游戏-疯狂的小球源码程序,基于Android 平台的重力感应游戏-疯狂的小球。

    android重力感应源代码

    本文将深入探讨Android重力感应源代码的相关知识点,帮助开发者理解和实现这一功能。 首先,我们要知道Android中的Sensor类是处理传感器事件的核心接口。在`android.hardware.Sensor`包下,Sensor类提供了获取...

    Android重力感应示例(源码)

    在Android开发中,重力感应是一项重要的功能,它允许应用程序响应设备的移动和方向变化。...通过理解并实践"Android重力感应示例(源码)",你将能够自如地利用这一功能,提升应用的交互性和实用性。

    android重力感应实例代码

    这个“android重力感应实例代码”提供了一个具体的示例,帮助开发者理解如何在Android应用中集成并使用重力感应数据。下面将详细介绍相关知识点。 1. **Android传感器系统服务** Android系统提供了Sensor Service...

    Android 重力感应游戏-疯狂的小球

    总之,"疯狂的小球"作为一款基于Android重力感应技术的游戏,融合了硬件传感器、物理引擎、用户交互和关卡设计等多个方面的技术,为玩家带来独特且刺激的体验。通过不断优化和创新,开发者可以创造出更加引人入胜的...

    Android 重力感应的测试程序源码-IT计算机-毕业设计.zip

    本项目“Android重力感应的测试程序源码”提供了一个实用的示例,帮助开发者理解如何在Android应用中集成并利用重力感应器的数据。下面将详细解析这个项目的知识点。 1. **Android传感器服务**: - Android系统...

    Android重力感应实例

    这个"Android重力感应实例"可能是为了展示如何利用Android SDK中的传感器API来开发一个控制小车的应用。下面将详细阐述Android重力感应的工作原理、相关API以及如何在实际开发中应用。 一、Android重力感应工作原理...

    Android应用源码之Android重力感应跑步测速应用-IT计算机-毕业设计.zip

    该压缩包文件“Android应用源码之Android重力感应跑步测速应用-IT计算机-毕业设计.zip”包含了一个Android应用程序的源代码,该程序利用Android设备的重力感应器来实现跑步测速功能。这个项目对于学习Android开发,...

    android重力感应禁止调用oncreat方法

    ### Android重力感应与禁止调用onCreate方法详解 #### 一、问题背景与解决方案概述 在Android开发过程中,有时我们需要让应用支持横竖屏自动切换,但又不希望每次屏幕方向改变时都重新调用`onCreate()`方法。这是...

    android 重力感应摇骰子游戏

    通过以上这些知识点,我们可以构建出一个基于Android重力感应的摇骰子游戏,让玩家享受科技带来的乐趣。在实际开发中,还需要结合具体需求进行功能扩展和细节调整,以打造一个既娱乐又具有技术含量的应用。

    Android重力感应跑步测速应用.rar

    总的来说,开发一个Android重力感应跑步测速应用需要理解传感器的工作原理,掌握数据处理和计算技巧,以及具备良好的UI设计和性能优化能力。这个过程既考验技术功底,也体现了对用户体验的细腻把握。

    android 利用重力感应监听

    在Android开发中,利用重力感应来实现特定功能是一种常见的技术。通过集成传感器API,开发者可以获取设备的重力变化数据,从而实现如来电时翻转手机静音这样的实用功能。下面将详细介绍如何在Android中利用重力感应...

    Android应用源码之Android重力感应跑步测速应用_源码.zip

    该Android应用源码展示了如何利用Android设备的重力感应器来实现跑步测速功能。在Android平台上,开发者可以通过Android传感器API来访问设备的各种传感器数据,包括重力感应器。这个应用的核心技术点主要包括以下几...

    Android 重力感应的测试程序源码.zip

    在Android平台上,重力感应是通过传感器服务来实现的,这是一种强大的功能,允许开发者创建具有交互性和动态性的应用。这个“Android 重力感应的测试程序源码.zip”包含了一个具体的示例,可以帮助我们理解如何在...

    Android 重力感应控件.zip

    在Android开发中,重力感应控件是一种利用设备内置的传感器技术来响应用户移动设备时产生的重力变化,从而更新视图的组件。这个"Android 重力感应控件.zip"包提供了一个能够根据重力感应事件动态更新界面的自定义...

    android重力感应

    在Android平台上,重力感应是通过传感器服务来实现的,它可以帮助开发者获取设备在空间中的运动状态,例如手机的翻转、倾斜等动作。本文将深入探讨如何在Android中进行重力感应的开发,以及相关的知识和技术。 首先...

Global site tag (gtag.js) - Google Analytics