anroid 利用方向传感器或者加速度传感器实现手机或者平板6个方向操作
最近项目里面要实现android设备6个方向操作远程设备移动,首先想到的是方向传感器,但是由于android设备的多样性,在测试过程中并不是所有的设备都有方向传感器,当没有方向传感器的话,就使用加速度传感器来实现,但是有一个缺点就是当水平移动的时候,就会有错误,其次就是项目中程序规定是横屏,然后手机和平板第一方向是不同的,手机默认竖屏正方向为0,现在横屏则方向为1,而平板默认就是横屏的,所以横屏正方向为0。
对于源码里面的
[java]
private float accDefaultX = 9999;
private float accDefaultY = 9999;
private float fBaseDefault = 9999;
private float accDefaultX = 9999;
private float accDefaultY = 9999;
private float fBaseDefault = 9999;是用来确定初始方向的,程序是按照开启传感器的方向为水平方向,如果需要使用现实中的水平方向为设备的水平方向,则可以去掉
[java]
if (accDefaultX == fBaseDefault) {
accDefaultX = fValues[0];
}
if (accDefaultY == fBaseDefault) {
accDefaultY = fValues[1];
}
mx = fValues[0] - accDefaultX;
my = fValues[1] - accDefaultY;
if (accDefaultX == fBaseDefault) {
accDefaultX = fValues[0];
}
if (accDefaultY == fBaseDefault) {
accDefaultY = fValues[1];
}
mx = fValues[0] - accDefaultX;
my = fValues[1] - accDefaultY;
源码如下:
[java]
package com.zhangjie.sensor;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
public class OriginSensor extends Activity implements SensorEventListener{
public static final String TAG = "OriginSensor";
private SensorManager mSensorManager;
private Sensor aSensor;
private WindowManager mWindowManager;
private Display mDisplay;
private int orientation = 0;
private float accDefaultX = 9999;
private float accDefaultY = 9999;
private float fBaseDefault = 9999;
private double angle = 25;
private float[] fValues = null;
public static int Sensor_Type = -1;
float mx, my;
Button clickButton;
boolean iscleck = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
mDisplay = mWindowManager.getDefaultDisplay();
orientation = mDisplay.getOrientation();
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
clickButton = new Button(this);
clickButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!iscleck) {
EnableSensor();
iscleck = true;
}else {
DisableSensor();
iscleck = false;
}
}
});
setContentView(clickButton);
}
public void EnableSensor(){
if (Sensor_Type == -1) {
SelectSensorType();
if (Sensor_Type == 2) {
//屏蔽功能
}
}else {
aSensor = mSensorManager.getDefaultSensor(Sensor_Type);
mSensorManager.registerListener(this, aSensor,SensorManager.SENSOR_DELAY_UI);
}
accDefaultX = fBaseDefault; //这样做的原因为每次重启,将重启的位置作为水平位置
accDefaultY = fBaseDefault;
}
public void DisableSensor(){
mSensorManager.unregisterListener(this);
current_dir = 0;
}
/*
* 优先选择方向传感器,如果没有方向传感器则选择加速度传感器,如果没有加速度传感器则屏蔽重力感应功能
* Sensor_Type = 3 :方向传感器
* Sensor_Type = 1 :加速度传感器
* Sensor_Type = 2:屏蔽重力感应功能
*/
public void SelectSensorType(){
 
补充:移动开发 , Android ,