一直对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

sensor类一般不需要new而是通过SensorManager的方法获得

在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);    }}
因为是重力感应在模拟器貌似不好显示,所以一般都是用真机调试运行的。

图片在手机麻烦就不上传了。




更多相关文章

  1. 谷安: HTC Android(安卓)智能手机将率先内建景德镇银联支付功能.
  2. Google 受罚后将向 Android(安卓)手机制造商收费:每款设备最高 40
  3. 手机服务器Android消息推送(二)--基于MQTT协议实现的推送功能
  4. android 将res内图片文件通过Bitmap对象存到手机本地中
  5. 手机端软件界面设计中的几种常用布局
  6. 【android 蓝牙开发——传统蓝牙】
  7. 安兔兔发布 2020 年 5 月 Android(安卓)中端手机性能榜,联发科天
  8. 四通道手机和Android的信用卡替代
  9. 如何用手机访问电脑本地 localhost 网页或者服务器, 以调试web项

随机推荐

  1. android LayoutInflater、setContentView
  2. Android SpannableString和SpannableStri
  3. Android NDK Log信息打印
  4. Android(安卓)3 开始 Activity MainThrea
  5. Android 通过命令将文件导出
  6. Android ListPreference
  7. android的一些常用手机信息获取
  8. android播放本地音乐程序
  9. Android--(11)--解读单选(RadioButton)和
  10. Android之SQLite列操作