本文讲解android中的传感器,这是智能手机中的一个重要组成方面。
我们首先来讲解一下android手机中对坐标的定义:
X轴的方向是沿着屏幕水平方向从左向右,较短的边需要水平放置,较长的变需要垂直放置
Y轴的方向是从屏幕的左下角开始沿着屏幕的垂直方向指向屏幕的顶端
Z轴是将手机平放在桌子上,从手机里指向天空
传感器使用到一个values数组,他一般具有三个参数,参数的意义和传感器类型有关。
一、方向传感器
values[0]:表示方位,即手机围绕Z轴旋转的角度,0表示北,90表示东,180表示南,270表示西,常用于电子罗盘
values[1]:表示手机倾斜角度,0是完全水平(一般为-5到5),完全倾斜是+-180,常用于测量物体倾斜度
values[2]:表示手机沿Y轴的滚动角度,为+-90
二、加速度传感器
values分别表示三个方向上的加速度值
传感器实例:
一、电子罗盘
通过手机上的二维磁阻传感器,我们可以方便的实现电子罗盘(使用时需要将手机平放)
public class Main extends Activity implements SensorEventListener { private ImageView imageView; private float currentDegree = 0f; public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) { float degree = event.values[0]; RotateAnimation ra = new RotateAnimation(currentDegree, -degree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); ra.setDuration(200); imageView.startAnimation(ra); currentDegree = -degree; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imageView = (ImageView) findViewById(R.id.imageview); SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE); sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST); } }
二、计步器
通过检测人走路时的上下震动来计数
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btnStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始" /> <Button android:id="@+id/btnReset" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="重置" /> <Button android:id="@+id/btnStop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止" /> </LinearLayout> <TextView android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="#FF0" android:background="#00F" android:textSize="150sp" android:gravity="center" /> </LinearLayout>
public class Main extends Activity implements SensorEventListener, OnClickListener { private TextView textView; private float lastPoint; private int count = 0; private boolean flag = true; private SensorManager sm; public void onClick(View view) { String msg = ""; switch (view.getId()) { case R.id.btnStart: sm = (SensorManager) getSystemService(SENSOR_SERVICE); sm.registerListener(this, sm .getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST); msg = "已经开始计步器."; break; case R.id.btnReset: count = 0; msg = "已经重置计步器."; break; case R.id.btnStop: sm.unregisterListener(this); count = 0; msg = "已经停止计步器."; break; } textView.setText(String.valueOf(count)); Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btnStart = (Button) findViewById(R.id.btnStart); Button btnReset = (Button) findViewById(R.id.btnReset); Button btnStop = (Button) findViewById(R.id.btnStop); btnStart.setOnClickListener(this); btnReset.setOnClickListener(this); btnStop.setOnClickListener(this); textView = (TextView) findViewById(R.id.textview); textView.setText(String.valueOf(count)); } public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void onSensorChanged(SensorEvent event) { if (flag) { lastPoint = event.values[1]; flag = false; } if (Math.abs(event.values[1] - lastPoint) > 8) { lastPoint = event.values[1]; textView.setText(String.valueOf(++count)); } } }
在本实例中,我设置两次values[1]的差大于8即走了一步,大家按需求设置