Java 课堂上的加速计代码

Java 课堂上的加速计代码,java,android,Java,Android,我正在编写一个显示加速度计读数的应用程序,昨天我能够在主活动中编写所有加速度计代码,它在emulator和我的设备上运行良好 但今天我试图创建一个包含所有加速度计代码的类,并返回仅整数数组中的三个整数X,Y,Z,因此我创建了一个我认为正确的代码,但每次我在模拟器上运行项目时,它总是给我0,0,0。 所以我希望能得到任何帮助 活动代码:: package com.example.accelerometer_sensor; import android.os.Bundle; import andr

我正在编写一个显示加速度计读数的应用程序,昨天我能够在主活动中编写所有加速度计代码,它在emulator和我的设备上运行良好

但今天我试图创建一个包含所有加速度计代码的类,并返回仅整数数组中的三个整数X,Y,Z,因此我创建了一个我认为正确的代码,但每次我在模拟器上运行项目时,它总是给我0,0,0。 所以我希望能得到任何帮助

活动代码::

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事件之前编写的。 所以事情是这样的

  • 寄存器侦听器
  • 写入文本(此时所有0)
  • 事件激发并更改x、y、z值
  • 文本已经写入,因此值不会更新。我可能是错的,但是您可以通过在使用
    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方法已被调用,因此我从您之前的评论中了解到,此方法调用不正确,请帮助我正确调用此方法。谢谢你的耐心和理解。