|
我们介绍了加速度传感器的相关知识及如何在模拟器中调试传感器的应用,本节将对传感器的另一种--姿态传感器进行介绍。姿态传感器是使用最多的传感器之一,该传感器主要感应手机方位的变化,捕获的同样是三个数,分别代表手机沿Yaw轴、Pitch轴和Roll轴转过的角度。
Yaw轴、Pitch轴和Roll轴与平时我们理解的空间坐标系有所不同,下面分别对这三个轴所表示的含义进行详细介绍。
Yaw轴,该轴是三个轴中最简单的一个,其表示的方向是不变的,一直是重力加速度g的反方向,即一直是竖直向上的,与手机的姿态无关。
Pitch轴,该轴的方向并不是固定不变的,而是会随着手机沿Yaw轴旋转而改变,唯一不变的关系是该轴永远与Yaw轴成90度角,图表示了该轴的方向。实际上Yaw轴与Pitch轴相当于焊到一起的一个90度支架,无论手机怎么旋转,其与Yaw轴的角度都为90度。
效果图:
Roll轴,该轴是沿着手机屏幕向上的轴,在图14-10中可以看到,无论手机是何种姿态,Roll轴都是沿着手机的屏幕向上的,其方向是与手机绑定的。
介绍完姿态传感器的原理后,便通过一个简单的案例介绍如何在Android中应用姿态传感器,开发步骤如下。
新建一个名为Sample的Android项目。
准备字符串资源,用下列代码替换strings.xml文件内的代码。
java代码: <?xml version="1.0" encoding="utf-8"?>
<!-- 声明xml的版本及编码格式 -->
<resources>
<string name="hello">Hello World, Sample</string>
<!-- 定义字符串hello -->
<string name="app_name">Sample</string>
<!-- 定义字符串app_name -->
<string name="title">姿态传感器案例</string>
<!-- 定义字符串title -->
<string name="myTextView1">Yaw为:</string>
<!-- 定义字符串myTextView1-->
<string name="myTextView2">itch为:</string>
<!-- 定义字符串myTextView2-->
<string name="myTextView3">Roll为:</string>
<!-- 定义字符串myTextView3-->
</resources>
说明:定义程序中所需要的字符串资源,统一管理的好处是方便程序的调试与维护。
搭建界面,编写main.xml文件,其代码与加速度传感器案例中的main.xml文件完全相同。
编写逻辑代码,用下列代码替换Sample.java中原有的代码。
Java代码:
package eoe.demo;
//声明所在包
import org.openintents.sensorsimulator.hardware.SensorManagerSimulator;
//引入相关类
import android.app.Activity;
//引入相关类
import android.hardware.SensorListener;
//引入相关类
import android.hardware.SensorManager;
//引入相关类
import android.os.Bundle;
//引入相关类
import android.widget.TextView;
//引入相关类
public class Sample extends Activity {
TextView myTextView1;
//Yaw 10
TextView myTextView2;
//Pitch 11
TextView myTextView3;
//Roll 12
//SensorManager mySensorManager;
//SensorManager对象引用
SensorManagerSimulator mySensorManager;
//声明SensorManagerSimulator对象,调试时用
@Override
public void onCreate(Bundle savedInstanceState) {
//重写onCreate方法
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//设置当前的用户界面
myTextView1 = (TextView) findViewById(R.id.myTextView1);
//得到myTextView1的引用
myTextView2 = (TextView) findViewById(R.id.myTextView2);
//得到myTextView2的引用
myTextView3 = (TextView) findViewById(R.id.myTextView3);
//得到myTextView3的引用
//mySensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
//获得SensorManager
//调试时用
mySensorManager = SensorManagerSimulator.getSystemService(this, SENSOR_SERVICE); mySensorManager.connectSimulator();
//与Simulator连接
}
private SensorListener mySensorListener = new SensorListener(){
@Override
public void onAccuracyChanged(int sensor, int accuracy) {}
//重写onAccuracyChanged方法
@Override
public void onSensorChanged(int sensor, float[] values) {
//重写onSensorChanged方法
if(sensor == SensorManager.SENSOR_ORIENTATION){
//只检查姿态的变化
myTextView1.setText("Yaw为:"+values[0]);
//将数据显示到TextView
myTextView2.setText("Pitch为:"+values[1]);
//将数据显示到TextView
myTextView3.setText("Roll为:"+values[2]);
//将数据显示到TextView
}
}
};
@Override
protected void onResume() {
//重写的onResume方法
mySensorManager.registerListener(
//注册监听
mySensorListener,
//监听器SensorListener对象
SensorManager.SENSOR_ORIENTATION,
//传感器的类型为姿态
SensorManager.SENSOR_DELAY_UI
//频度
);
super.onResume();
}
@Override
protected void onPause() {
//重写onPause方法
mySensorManager.unregisterListener(mySensorListener);
//取消注册监听器
super.onPause();
}
} |
|