900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Android重力感应器入门介绍

Android重力感应器入门介绍

时间:2019-11-23 10:03:56

相关推荐

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

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

在android基本所有传感器都是通过SensorManager类实现的。官网API说明如下

SensorManager lets you access the device'ssensors. 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 willnotdisable 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. */@Overridepublic 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 stubx = 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);}}

因为是重力感应在模拟器貌似不好显示,所以一般都是用真机调试运行的。

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。