2013-03-10 155 views
1

我正在使用加速度计控制角色的游戏。我的问题是:我需要使用OnSensorChanged()中无法访问的类和方法中传感器接收的值。我相信我需要在OnSensorChanged中实现回调,但我不知道该怎么做。谁能帮我吗?Android加速度计问题

+0

我们可以看到一些代码吗? – Geobits 2013-03-10 20:38:28

+0

嗯,我只是将SensorListener注册到我的加速计类中,并且在该类中有OnSensorChanged。这几乎是我的所有代码,因为没有其他工作。我得到我的加速度计值很好,但我似乎无法拿走它们并将它们保存到变量中。这就是我真正想做的事情,但变量总是只存在于OnSensorChanged内部。如果我能保存这些价值观,我就不会有更多的问题。 – vulgarknight 2013-03-10 20:48:06

+0

为什么你不能定义一个类成员来保存由onSensorChanged传递的值。 – 2013-03-10 21:16:08

回答

0

我相信在这篇文章(How to Define Callbacks in Android?)的答案会帮助你。

总之,创建回调接口:

// The callback interface 
interface MyCallback { 
    void callbackCall(SensorEvent event); 
} 

实现的回调中是应该做计算类的接口:

class Callback implements MyCallback { 
    void callbackCall(SensorEvent event) { 
     // callback code goes here 
    } 
} 

从你的活动,你必须让通话onSensoreChanged():

// The class that takes the callback 
class Worker extends Activity implements SensorEventListener { 
    MyCallback callback; 

    public void onSensorChanged(SensorEvent event) { 

     callback.callbackCall(event); 
    } 
} 

我希望这有助于。

UPDATE:

我假设你已经知道进程和线程(如果没有,请看看Android的文档约Processes and Threads)。

onSensorChanged方法是一个I/O,在单独的线程(而不是主UI线程)中执行I/O操作是一种很好的做法。

调用回调方法后,可以将事件存储在另一个变量中,并使用该类中的那些局部变量。

由于您正在编写游戏,因此您的应用不太可能需要每一个事件。因此,当应用程序忙于计算游戏数据时,其他事件可能会被丢弃。你可以通过设置一个“繁忙”标志(布尔值)并在这个if块中包含计算代码。

void callbackCall(SensorEvent event) { 
     if (!busy) { 
      // Set the busy flag to block other event changes 
      busy = true; 
      // callback code goes here 

      // Once finished, reset the busy flag to allow other events to come in 
      busy = false; 
     } 
    } 
+0

因此,如果我想在一个类中使用我的字符X和Y坐标,并且在另一个类中使用加速度计sensorlistener,则会调用OnSensorChanged中的回调函数,但是如何在其他类中存在event.values修改坐标?那么一旦从处理玩家位置的类中调用另一种方法,这些值是否会被抛出? – vulgarknight 2013-03-10 21:14:20

+0

我已更新上述答案,以回答您的问题。 – Armin 2013-03-10 21:39:25

+0

好的,所以回调在类的同一个线程上调用它?所以当回调为变量赋值时,该变量在该类中是持久的? – vulgarknight 2013-03-10 21:47:20