Android重力感应
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
手机的感应器在Android里边所代表的类是Sensor,你只要看到在android.hardware这个包下边的都是封装的关于一些特殊的硬件方面的类,比如说Camera、Sensor之类的。。一直都很怀疑为什么HTC的Google手机没有前置摄像头。。。怨念啊。。。
PS:虽然是2.1的机子,但是我用的是1.5的SDK。
代码很简单:我们首先要得到一个手机上的传感器。
Java代码
1.SensorManager sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
这行代码只要用过类似开发的都应该知道是什么。
getSystemService(String name)可以用来返回一个硬件设备的控制器。比如说LocationManage(和GPS相关用来确定位置的)、TelephonyManage(查询电话相关内容,比如说IMEI码)、AudioManager(顾名思义,是视频播放用的)等等。。。具体可以观看SDK文档里边Activity的讲解。/int ... d/app/Activity.html
得到重力感应的硬件控制了,然后我们就应该得到一个Sensor了。
Java代码
1.Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ALL);
关于这个参数。。。其实挺复杂的。。。。我开始用的是TYPE_ALL,出的是XYZ三条轴线的偏移量,至于其他的大家可以看下边:
下边是官方SDK中对于各种类型的解析(粗体红字是我加上去的)
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 :有时候你的机子并不会拥有这么全的感应装置,这个时候你应该再进行以下判断。比如说: Java 代码
1. Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_TEMPERATURE);
2.
3. if (sensor == null ){
4. log.w("NO_SERVICE","没有感应温度的感应装置。")
5. ... ...
6. }else {
7. ... ...
8. }
所有最基本的三维坐标系有三个轴:X、Y和Z,这个学过矩阵或者线性代数的都应该知道吧
(~~~~(>_<)~~~~ 我当年线性代数挂了。。。。惨不忍睹啊。。。后来自学DirectX的时候才觉得原来矩阵变换是这么的重要。。而且更重要的是这个一点也不难吗。。。。)
关于手机的XYZ坐标,把你的手机平放到桌子上,横x,纵y,然后z就是屏幕法线。
官方的例子:(直接粘贴的话空格会变小,所以就截图了)
然后我们注册一个Listener,用来监听我们所得到的值的改变。
Java代码
1.SensorEventListener lsn = new SensorEventListener() {
2.public
void onSensorChanged(SensorEvent e) {
3.x = e.values[SensorManager.DATA_X];
4.y = e.values[SensorManager.DATA_Y];
5.z = e.values[SensorManager.DATA_Z];
6.t.setText("x=" + Math.round(x * ROUND_NUMBER) + "," + "y="
7. + Math.round(y * ROUND_NUMBER) + "," + "z="
8. + Math.round(z * ROUND_NUMBER));