Android重力感应器入门介绍
一直对android的重力感应器比较感兴趣,玩一些带重力感应的游戏的时候就特别的好奇如何实现的。今天心血来潮花了一点时间看了API以及找了一些资料研究了一下,作了一个初步了解入门,现在将研究写下。
整个重力感应坐标设定如下:
以屏幕的左下方为原点(2d编程的时候,是以屏幕左上方为原点的,这个值得注意一下),箭头指向的方向为正。从-10到10,以浮点数为等级单位,想象一下以下情形:
手机屏幕向上(z轴朝天)水平放置的时侯,(x,y,z)的值分别为(0,0,10);
手机屏幕向下(z轴朝地)水平放置的时侯,(x,y,z)的值分别为(0,0,-10);
手机屏幕向左侧放(x轴朝天)的时候,(x,y,z)的值分别为(10,0,0);
手机竖直(y轴朝天)向上的时候,(x,y,z)的值分别为(0,10,0);
其他的如此类推,规律就是:朝天的就是正数,朝地的就是负数。利用x,y,z三个值求三角函数,就可以精确检测手机的运动状态了。
int TYPE_ACCELEROMETER A constant describing an accelerometer sensor type.//三轴加速度感应器 返回三个坐标轴的加速度 单位m/s2
在android基本所有传感器都是通过SensorManager类实现的。官网API说明如下
SensorManager lets you access the device's sensors
. Get an instance of this class by callingContext.getSystemService()
with the argumentSENSOR_SERVICE
.
有一点值得注意的是
Always make sure to disable sensors you don't need, especially when your activity is paused. Failing to do so can drain the battery in just a few hours. Note that the system willnot disable sensors automatically when the screen turns off.
大概意思是说必须确认当你终止不用的时候必须要将sensor给关闭,不然可能会导致你电池很快耗尽。这个我没有试过是不是这种情况。不过大家在OnPause()函数里面关闭一下就可以了。很简单、、以免发生自己不想要的结果。
设置一个监听SensorEventListener对象对手机重力变化进行监听,一般在void onSensorChanged(SensorEvent e) 实现对应处理。
闲话少说,代码还是最直接的说明。。。
package hfut.gmm;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.widget.TextView;public class Sensor_demoActivity extends Activity {private TextView tv;private float x;private float y;private float z;private SensorManager sensorMgr;private Sensor sensor;private SensorEventListener lsn; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv=(TextView)this.findViewById(R.id.textView1); IntentFilter filter=new IntentFilter(); filter.addAction("hfut.gmm.sensordemo"); this.registerReceiver(myBroadCast, filter); sensorMgr=(SensorManager)this.getSystemService(Context.SENSOR_SERVICE); sensor=sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); lsn = new SensorEventListener() { @Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}@Overridepublic void onSensorChanged(SensorEvent e) {// TODO Auto-generated method stub x = e.values[SensorManager.DATA_X]; y = e.values[SensorManager.DATA_Y]; z = e.values[SensorManager.DATA_Z]; Sensor_demoActivity.this.sendBroadcast(new Intent("hfut.gmm.sensordemo"));} }; sensorMgr.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_GAME); } private BroadcastReceiver myBroadCast =new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubtv.setText("重力坐标:x="+x+" y="+y+ "z="+z);} }; protected void onPause() { super.onPause(); sensorMgr.unregisterListener(lsn); }}因为是重力感应在模拟器貌似不好显示,所以一般都是用真机调试运行的。
图片在手机麻烦就不上传了。
更多相关文章
- 谷安: HTC Android(安卓)智能手机将率先内建景德镇银联支付功能.
- Google 受罚后将向 Android(安卓)手机制造商收费:每款设备最高 40
- 手机服务器Android消息推送(二)--基于MQTT协议实现的推送功能
- android 将res内图片文件通过Bitmap对象存到手机本地中
- 手机端软件界面设计中的几种常用布局
- 【android 蓝牙开发——传统蓝牙】
- 安兔兔发布 2020 年 5 月 Android(安卓)中端手机性能榜,联发科天
- 四通道手机和Android的信用卡替代
- 如何用手机访问电脑本地 localhost 网页或者服务器, 以调试web项