Java 课堂上的加速计代码
我正在编写一个显示加速度计读数的应用程序,昨天我能够在主活动中编写所有加速度计代码,它在emulator和我的设备上运行良好 但今天我试图创建一个包含所有加速度计代码的类,并返回仅整数数组中的三个整数X,Y,Z,因此我创建了一个我认为正确的代码,但每次我在模拟器上运行项目时,它总是给我0,0,0。 所以我希望能得到任何帮助 活动代码::Java 课堂上的加速计代码,java,android,Java,Android,我正在编写一个显示加速度计读数的应用程序,昨天我能够在主活动中编写所有加速度计代码,它在emulator和我的设备上运行良好 但今天我试图创建一个包含所有加速度计代码的类,并返回仅整数数组中的三个整数X,Y,Z,因此我创建了一个我认为正确的代码,但每次我在模拟器上运行项目时,它总是给我0,0,0。 所以我希望能得到任何帮助 活动代码:: package com.example.accelerometer_sensor; import android.os.Bundle; import andr
package com.example.accelerometer_sensor;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
int [] AccVal = new int[3];
TextView acceleration;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AccelerometerClass acc = new AccelerometerClass();
acc.AccelerometerInit(this);
AccVal =acc.Vals;
acceleration = (TextView)findViewById(R.id.acceleration);
acceleration.setText("X: "+acc.Vals[0]+
"\nY: "+acc.Vals[1]+
"\nZ: "+acc.Vals[2]);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
加速计等级:
package com.example.accelerometer_sensor;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class AccelerometerClass implements SensorEventListener
{
int [] Vals = new int[3];
Sensor accelerometer;
SensorManager sm;
public void AccelerometerInit(Context context)
{
sm = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
accelerometer=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sm.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onResume() {
sm.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
sm.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
Vals[0]=(int)event.values[0];
Vals[1]=(int)event.values[1];
Vals[2]=(int)event.values[2];
}
}
请注意,我已经陷入这个问题很长时间了,希望您能提供帮助。我怀疑文本是在触发onSensorChanged事件之前编写的。 所以事情是这样的
thread.sleep(2000)将值写入文本字段之前停止线程几秒钟来测试这一点代码>2000以毫秒为单位
也可能是事件没有触发。您可以通过在登录到logcat的onSensorChanged()方法中添加一行来检查这一点
Log.d(TAG, "onSensorChanged method has been invoked");
编辑:我刚刚运行了它。一切正常,但您没有得到想要的结果,因为文本是在事件触发之前编写的。调用onSensorChanged()方法时,您需要更新UI。在AccelerometrClass中为对象VAL
实现getter
方法
public class AccelerometerClass implements SensorEventListener
{
int [] Vals = new int[3];
Sensor accelerometer;
SensorManager sm;
public AccelerometerClass(Context context)
{
sm = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
accelerometer=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sm.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_NORMAL);
}
...
// getter method
public int getValue(int index) {
return this.Vals[index];
}
}
从main活动访问它
:
public class MainActivity extends Activity {
int [] AccVal = new int[3];
TextView acceleration;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// this one will call constructor of AccelerometerClass and initialise sensors
AccelerometerClass acc = new AccelerometerClass(getApplicationContext());
acceleration = (TextView)findViewById(R.id.acceleration);
// access like this here
acceleration.setText("X: "+acc.getValue(0)+
"\nY: "+acc.getValue(1)+
"\nZ: "+acc.getValue(2));
}
}
这将解决您的问题我认为stackoverflow是解决这个问题的更好地方。您的模拟器是如何配置的?也许你们应该在一部真正的手机上测试你们的代码,或者看看这个问题:谢谢你们的回复,但你们能确切地告诉我如何更新用户界面吗??!thanksi按照您上面提到的那样做了,但在模拟器上仍然是3个零??!您在SensorChanged
事件中获得了帮助吗?将日志放在这个事件中以检查sir,我已经将这一行放在onsensorChanged()方法中:Log.d(标记,“onsensorChanged方法已被调用”);当我试图在模拟器上正常运行应用程序时,它会给我一个加载符号(循环加载),但什么也没有出现?!这意味着什么?那么这意味着加速计没有给我们的应用程序提供传感器数据更改。。更简单地说,加速度计数据不变。。请检查一次,将日志放入AccelerometerInit()
方法中,并检查是否调用了它。。应该叫。。如果已经调用了,那么我们的代码是正确的,但是传感器没有改变数据,所以我们不会因为打扰您而感到担心,但是我按照您所说的将这一行放在AccelerometerInit()中,第一行::Log.e(标记,“onSensorChanged方法已被调用”);我检查logcat发现:04-29 15:50:16.866:E/(770):onSensorChanged方法已被调用,因此我从您之前的评论中了解到,此方法调用不正确,请帮助我正确调用此方法。谢谢你的耐心和理解。