2015-05-05 48 views
2

我正在研究在MainActivity上有一个操纵杆的应用程序。游戏杆是一个自定义的视图,并有一个游戏杆类。当用户触摸操纵杆并移动它时,我希望将Y轴值发送到MainActivity,以便我可以使用该值。将值传递给另一个类

在Joystick.java中,我有一个onTouch()侦听器。触摸时,操纵杆产生坐标(操纵杆的X和Y),以便我可以在Y轴上得到-100至100的值。

public class Joystick extends View implements OnTouchListener{ 
    int xAxis, yAxis; 

    public int getYAxis(){ 
     return yAxis; 
    } 

    @Override 
    public boolean onTouch(View arg0, MotionEvent event){ 
     // Code to process event and assign xAxis and yAxis values (-100, 100) 
    } 
} 

MainActivity我试着做以下,以获得yAxis值:

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // ... other code 

    Joystick joy = (Joystick) findViewById(R.id.joystick1); 
    joy.setOnTouchListener(new View.OnTouchListener(){ 
     @Override 
     public boolean onTouch(View v, MotionEvent event){ 
      // updateMotorControl() is the funcion I need to pass my value to 
      updateMotorControl(joy.getYAxis(), 0); 

      return true; 
     } 
    } 

但当然AndroidStudio告诉我,joy需要被声明为final。问题是,如果它是最终的,我永远不会更新值。

我已经尝试了一百万件事情,并且不断收到类似的错误。我不是问为什么我会得到这个错误。我想知道的是,将该值传递给MainActivity并转而转入updateMotorControl()的最佳方法是什么?

+0

你能不能通过它通过一个构造函数? –

+0

你可以使用_this_而不是快乐(或者只是写'getYAxis()');) –

+0

@ChrisBolton我可以看到你的意思,但我不确定那是怎么工作的。你能告诉我如何在代码中做到这一点? –

回答

0

你应该建立在操纵杆一个新的接口

public interface DataCallback { 
     /** 
     * This method is called when xAxis and yAxis change. 
     * @param instance 
     */ 
     void dataIsAvailableNow(int x, int y); 
    } 

添加DataCallback场:

public class Joystick extends View implements OnTouchListener{ 
     int xAxis, yAxis; 
     DataCallback mCallback; 

     public int getYAxis(){ 
      return yAxis; 
     } 

     public void setCallback(DataCallback callback) { 
      this.mCallback = callback; 
     } 

     @Override 
     public boolean onTouch(View arg0, MotionEvent event){ 
      // Code to process event and assign xAxis and yAxis values (-100, 100) 
      if (mCallback != null) { 
       mCallback.dataIsAvailableNow(-100,100); 
      } 
     } 
    } 

,并在MainActivity实现接口,并设置监听

joy.setCallback(this); 
0

继续前进,让欢乐结束。 'final'并不意味着你不能改变你的对象内的值;它只意味着你不能取代对象本身。回想一下,Java将围绕对象作为参考值 - 制作游戏杆最终意味着您无法将其替换为另一个实例。

+0

但是,当我从'updateMotorControl()'读取值时,即使当我移动游戏杆时,它们仍然保持为0 –

+0

您是否拦截触摸事件两次?它看起来像是你正在替换你在“//处理事件的代码并分配xAxis和yAxis值(-100,100) ”中的代码。 –