方向传感器
在安卓平台上,传感器通常使用三维坐标系来确定方向,这个坐标系是一个数值,通过获取该数值便可以确定所处的方向,,系统返回的值时长度为三的float数组,包含三个方向的值(X,Y,Z)
1.如何获取坐标系的值
通过onSensorChanged中的参数SensorEvent event,即可获取坐标系的值,event值是float[]类型,而且最多有三个参数,这三个对应关系如下
下面的操作都是手机朝上水平放在桌面上,values=0
- values[0]:方位角,手机绕着
Z
轴旋转的角度,0-正北(North),90-正东(East),180-正南(South),270-正西(West) - values[1]:倾斜角,手机翘起来的程度,手机绕着
X
周旋转,取值[ -180 ~~ +180 ],手机顶部翻到桌面(0~ -180),底部翻到桌面(0~+180) - values[2]:滚动角,沿着
Y
轴的滚动角度,取值[ -90 ~~ +90 ],从左侧抬起到垂直桌面[0 ~~ -90 ],右侧抬起到垂直[ 0 ~~ +90 ],在垂直位置继续转动,值还在[ -90 ~~ +90 ]之间变化
2.实例,获取手机中坐标系的值
①在xml文件里设置TextView组件输出值
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}"
android:orientation="vertical"
android:gravity="center"
>
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#0000ff"
android:textSize="40sp"
/>
<TextView
android:id="@+id/tv2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#ff0000"
android:textSize="40sp"
/>
<TextView
android:id="@+id/tv3"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#00ff00"
android:textSize="40sp"
/>
</LinearLayout>
②java文件
`接口SensorEventListener`
public class SensorTextActivity extends Activity implements SensorEventListener{
`定义文本框`
private TextView tv1;
private TextView tv2;
private TextView tv3;
`定义传感器管理器`
private SensorManager sManager;
`定义方向传感器`
private Sensor mSensorOrientation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sensor_text);
`绑定文本组件`
tv1 = (TextView) findViewById(R.id.tv1);
tv2 = (TextView) findViewById(R.id.tv2);
tv3 = (TextView) findViewById(R.id.tv3);
`获取传感器管理器`
sManager = (SensorManager) getSystemService(SENSOR_SERVICE);
`获取方向传感器`
mSensorOrientation = sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
`注册传感器事件监听`
sManager.registerListener(this, mSensorOrientation, SensorManager.SENSOR_DELAY_UI);
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
tv1.setText("方位角:"+(float) (Math.round(event.values[0] * 100))/100);
tv2.setText("倾斜角:"+(float) (Math.round(event.values[1] * 100))/100);
tv3.setText("滑动角:"+(float) (Math.round(event.values[2] * 100))/100);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}
效果:::
附加
设置一个角度:触发效果
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
tv1.setText("方位角:"+(float) (Math.round(event.values[0] * 100))/100);
tv2.setText("倾斜角:"+(float) (Math.round(event.values[1] * 100))/100);
tv3.setText("滑动角:"+(float) (Math.round(event.values[2] * 100))/100);
`添加的代码`
float aa=((float) (Math.round(event.values[0] * 100))/100);
float bb=((float) (Math.round(event.values[1] * 100))/100);
if((aa>=0&&aa<=360)&&(bb>=-110&&bb<=-60)){
Toast.makeText(this, "偷拍心爱的人!!", Toast.LENGTH_SHORT).show();
}
}
效果:::