下面的代码我用来获取传感器变化的x,y值。基于此,我正在尝试移动屏幕上的球。
private SensorManager sensorMgr;
@SuppressWarnings("unused")
private TextView accuracyLabel;
private TextView xLabel, yLabel, zLabel;
private Button calibrateButton;
public int mScrWidth,mScrHeight,wh,hgt;
public float x, y, z;
// deltas for calibration
private float cx, cy, cz;
private long lastUpdate = -1;
public float mSpdx;
public float mSpdy;
public CollisionSurface cf=null;
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
xLabel = (TextView) findViewById(R.id.textView1);
yLabel = (TextView) findViewById(R.id.textView2);
zLabel = (TextView) findViewById(R.id.textView3);
sensorMgr= (SensorManager) getSystemService(SENSOR_SERVICE);
lastUpdate = System.currentTimeMillis();
Point size = new Point();
WindowManager w = getWindowManager();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
w.getDefaultDisplay().getSize(size);
wh = mScrWidth = size.x;
hgt = mScrHeight = size.y;
}else{
Display d = w.getDefaultDisplay();
wh= mScrWidth = d.getWidth();
xLabel.setText(""+wh);
}
/* ((SensorManager)getSystemService(Context.SENSOR_SERVICE)).registerListener(
new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
//set ball speed based on phone tilt (ignore Z axis)
mSpdx = event.values[1];
mSpdy = event.values[0];
//timer event will redraw ball
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {} //ignore this event
},
((SensorManager)getSystemService(Context.SENSOR_SERVICE))
.getSensorList(Sensor.TYPE_ACCELEROMETER).get(o), SensorManager.SENSOR_DELAY_GAME);
*/
cf=new CollisionSurface(this.getApplicationContext());
setContentView(cf);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
@Override
protected void onPause() {
super.onPause();
sensorMgr.unregisterListener(this, SENSOR_ACCELEROMETER);
sensorMgr = null;
cx = 0;
cy = 0;
cz = 0;
}
@SuppressWarnings("deprecation")
@Override
protected void onResume() {
super.onResume();
sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
sensorMgr.registerListener(this, sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
// ...and the orientation sensor
boolean accelSupported = sensorMgr.registerListener(this, SENSOR_ACCELEROMETER,SENSOR_DELAY_UI);
if (!accelSupported) {
// on accelerometer on this device
sensorMgr.unregisterListener(this, SENSOR_ACCELEROMETER);
//accuracyLabel.setText(R.string.no_accelerometer);
}
}
// from the android.hardware.SensorListener interface
public void onAccuracyChanged(int sensor, int accuracy) {
// this method is called very rarely, so we don't have to
// limit our updates as we do in onSensorChanged(...)
if (sensor == SENSOR_ACCELEROMETER) {
switch (accuracy) {
case SENSOR_STATUS_UNRELIABLE:
//accuracyLabel.setText(R.string.accuracy_unreliable);
break;
case SENSOR_STATUS_ACCURACY_LOW:
//accuracyLabel.setText(R.string.accuracy_low);
break;
case SENSOR_STATUS_ACCURACY_MEDIUM:
//accuracyLabel.setText(R.string.accuracy_medium);
break;
case SENSOR_STATUS_ACCURACY_HIGH:
//accuracyLabel.setText(R.string.accuracy_high);
break;
}
}
}
public void onSensorChanged(SensorEvent sensorEvent)
{
{
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
// the values you were calculating originally here were over 10000!
x= (int) Math.pow(sensorEvent.values[1], 2);
y= (int) Math.pow(sensorEvent.values[2], 2);
}
if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) {
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(int sensor, float[] values) {
// TODO Auto-generated method stub
if (sensor == SENSOR_ACCELEROMETER) {
long curTime = System.currentTimeMillis();
// only allow one update every 100ms, otherwise updates
// come way too fast and the phone gets bogged down
// with garbage collection
if (lastUpdate == -1 || (curTime - lastUpdate) > 100) {
lastUpdate = curTime;
x = values[DATA_X];
y = values[DATA_Y];
z = values[DATA_Z];
// xLabel.setText(String.format("X: %+2.5f (%+2.5f)", (x+cx), cx));
// yLabel.setText(String.format("Y: %+2.5f (%+2.5f)", (y+cy), cy));
// zLabel.setText(String.format("Z: %+2.5f (%+2.5f)", (z+cz), cz));
}
}
}我不能得到x,y,z值在手机的倾斜..我需要做哪些更改..
发布于 2015-04-14 15:12:01
尝尝这个
public class MainActivity extends Activity implements SensorEventListener{
// deltas for calibration
private float cx, cy, cz;
private int SENSOR_ACCELEROMETER = Sensor.TYPE_ACCELEROMETER;
private SensorManager sensorMgr;
@SuppressWarnings("unused")
private TextView accuracyLabel;
private TextView xLabel, yLabel, zLabel;
private Button calibrateButton;
public int mScrWidth, mScrHeight, wh, hgt;
public float x, y, z;
float lastUpdate;
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lastUpdate = System.currentTimeMillis();
Point size = new Point();
WindowManager w = getWindowManager();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
w.getDefaultDisplay().getSize(size);
wh = mScrWidth = size.x;
hgt = mScrHeight = size.y;
} else {
Display d = w.getDefaultDisplay();
wh = mScrWidth = d.getWidth();
xLabel.setText("" + wh);
}
/*
* ((SensorManager)getSystemService(Context.SENSOR_SERVICE)).
* registerListener( new SensorEventListener() {
*
* @Override public void onSensorChanged(SensorEvent event) { //set ball
* speed based on phone tilt (ignore Z axis) mSpdx = event.values[1];
* mSpdy = event.values[0]; //timer event will redraw ball }
*
* @Override public void onAccuracyChanged(Sensor sensor, int accuracy)
* {} //ignore this event },
* ((SensorManager)getSystemService(Context.SENSOR_SERVICE))
* .getSensorList(Sensor.TYPE_ACCELEROMETER).get(o),
* SensorManager.SENSOR_DELAY_GAME);
*/
}
@Override
protected void onPause() {
super.onPause();
if (sensorMgr.getDefaultSensor(SENSOR_ACCELEROMETER) != null) {
sensorMgr.unregisterListener(this);
sensorMgr = null;
}
cx = 0;
cy = 0;
cz = 0;
}
@Override
protected void onResume() {
super.onResume();
sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
// ...and the orientation sensor
if (sensorMgr.getDefaultSensor(SENSOR_ACCELEROMETER) != null) {
sensorMgr.registerListener(this,
sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
}
}
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
// the values you were calculating originally here were over
// 10000!
x = sensorEvent.values[0];
y = sensorEvent.values[1];
System.out.println(x);
System.out.println(y);
System.out.println(sensorEvent.values[2]);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}https://stackoverflow.com/questions/29620115
复制相似问题