2015-05-05 45 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) 」中的代碼。 –