Android上几个常用硬件传感器的意义及用法

1、示例讲解加速剂、磁场传感器、方向传感器

1)MainActivity.java

public class MainActivity extends Activity {
	private static final String TAG = MainActivity.class.getSimpleName();
	SensorManager sm;
	Handler mHandler = new Handler();
	TextView tv;
	CompassView compassView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
		tv = (TextView) findViewById(R.id.txt);
		compassView = (CompassView) findViewById(R.id.compassView);
		Timer timer = new Timer("update", false);
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				mHandler.post(new Runnable() {
					@Override
					public void run() {
						float[] values = calculateOrientation();
						if(!(values[0]==0&&values[1]==0&&values[2]==0)){
							tv.setText("方位角:"+values[0]
									+"\n俯仰角:"+values[1]
									+"\n横滚角:"+values[2]);
							compassView.setValues(values);
							compassView.invalidate();
						}
					}
				});
			}
		}, 0L, 100L);
		setRotation();
	}
	@Override
	protected void onResume() {
		super.onResume();
		Sensor accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		Sensor magneticField = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
		
		sm.registerListener(mSensorEventListener, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
		sm.registerListener(mSensorEventListener, magneticField, SensorManager.SENSOR_DELAY_FASTEST);
		sm.registerListener(mSensorEventListener, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL);
	}
	@Override
	protected void onPause() {
		sm.unregisterListener(mSensorEventListener);
		super.onPause();
	}
	private float[] aValues = new float[3];
	private float[] mValues = new float[3];
	private int rotation;
	private SensorEventListener mSensorEventListener = new SensorEventListener() {
		@Override
		public void onSensorChanged(SensorEvent event) {
			//求加速度
//			float x = event.values[0];
//			float y = event.values[1];
//			float z = event.values[2];//9.8m/s^2
//			double a = Math.round(Math.sqrt(Math.pow(x, 2)+Math.pow(y, 2)+Math.pow(z, 2)));
//			double currentAcceleration = Math.abs(a-SensorManager.STANDARD_GRAVITY);
//			Log.d(TAG, x+"-"+y+"-"+z+"-"+currentAcceleration);
			
			if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
				aValues = event.values;
			}else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
				mValues = event.values;
			}else if(event.sensor.getType() == Sensor.TYPE_ORIENTATION){
				float headingAngle = event.values[0];
				float pitchAngle = event.values[1];
				float rollAngle = event.values[2];
				Log.d(TAG, headingAngle+"-"+pitchAngle+"-"+rollAngle);
			}
		}
		@Override
		public void onAccuracyChanged(Sensor sensor, int accuracy) {
		}
	};
	private float[] calculateOrientation(){
		float[] values = new float[3];
		float[] inR = new float[9], outR = new float[9];
		SensorManager.getRotationMatrix(inR, null, aValues, mValues);
		int x_axis = SensorManager.AXIS_X, y_axis = SensorManager.AXIS_Y;
		switch (rotation) {
		case Surface.ROTATION_0:
			break;
		case Surface.ROTATION_90:
			x_axis = SensorManager.AXIS_Y;
			y_axis = SensorManager.AXIS_MINUS_X;
			break;
		case Surface.ROTATION_180:
			y_axis = SensorManager.AXIS_MINUS_Y;
			break;
		case Surface.ROTATION_270:
			x_axis = SensorManager.AXIS_MINUS_Y;
			y_axis = SensorManager.AXIS_X;
		}
		SensorManager.remapCoordinateSystem(inR, x_axis, y_axis, outR);
		SensorManager.getOrientation(outR, values);
		values[0] = (float) Math.toDegrees(values[0]);
		values[1] = (float) Math.toDegrees(values[1]);
		values[2] = (float) Math.toDegrees(values[2]);
		return values;
	}
	/**
	 * 每次切屏会调用此方法
	 */
	private void setRotation(){
		//Activity方法,返回Object
		WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
		Display d = wm.getDefaultDisplay();
		//顺时针旋转,华为X1不显示180,仅显示下面几个固定值
		rotation = d.getRotation();
	}
}
2)activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView 
        android:id="@+id/txt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="方位"/>
    <com.qinuli.testproject.CompassView
        android:id="@+id/compassView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>
3)CompassView.java,显示方位角、俯仰角、横滚角的值
public class CompassView extends View {
	private Paint mPaint;
	private int increment = 300;
	public CompassView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mPaint = new Paint();
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		//(150,150),(450,450),(750,750)
		canvas.drawLine(150f, 150f, (float)(150+Math.sin(-Math.toRadians(values[0]))*120), 
			(float)(150-Math.cos(Math.toRadians(values[0]))*120), mPaint);
		canvas.drawLine(150f, 150f+increment, (float)(150+Math.sin(Math.toRadians(values[1]))*120), 
			(float)(150+increment-Math.cos(Math.toRadians(values[1]))*120), mPaint);
		canvas.drawLine(150f, 150f+increment*2, (float)(150+Math.sin(Math.toRadians(values[2]))*120), 
			(float)(150+increment*2-Math.cos(Math.toRadians(values[2]))*120), mPaint);
	}
	
	private float[] values = new float[3];
	public void setValues(float[] values){
		this.values = values;
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值