2012-09-24 76 views
3

我使用以下代碼來設置軌跡球在Blackberry中,設置軌跡球靈敏度不起作用?

public class Main extends UiApplication { 

    public static void main(String[] args) { 
     Main theApp = new Main(); 
     theApp.enterEventDispatcher(); 
    } 

    public Main() { 
     if (Trackball.isSupported()) { 
      Trackball.setFilter(Trackball.FILTER_ACCELERATION); 
      Trackball.setSensitivityX(20); 
      Trackball.setSensitivityY(20); 
     } 
     pushScreen(new LoginScreen()); 
    } 
} 

這裏的靈敏度真實使用的屏幕:

public class LoginScreen extends MainScreen { 
    public LoginScreen() { 
     super(MainScreen.NO_VERTICAL_SCROLL | MainScreen.NO_VERTICAL_SCROLLBAR); 
     add(...) // SOME COMPONENTS ARE ADDED HERE 
    } 
} 

當我檢查軌跡球在LoginScreen的靈敏度navigationMovement使用Trackball.getSensitivityX()Trackball.getSensitivityY() ,它返回「2147483647」,同時如果我立即在Main之後檢查它,它將返回「20」!


所以我感動設置塊的LoginScreen內部本身如下:

public class LoginScreen extends MainScreen { 
     public LoginScreen() { 
      super(MainScreen.NO_VERTICAL_SCROLL | MainScreen.NO_VERTICAL_SCROLLBAR); 
      if (Trackball.isSupported()) { 
       Trackball.setFilter(Trackball.FILTER_ACCELERATION); 
       Trackball.setSensitivityX(20); 
       Trackball.setSensitivityY(20); 
      } 
      add(...) // SOME COMPONENTS ARE ADDED HERE 
     } 
    } 

它也返回 「2147483647」 通過在navigationMovement使用Trackball.getSensitivityX()Trackball.getSensitivityY()


最後,基於一些web搜索,我移動navigationMovement內的條件,如下所示:

protected boolean navigationMovement(int dx, int dy, int status, int time) { 
     if (Trackball.isSupported()) { 
      Trackball.setFilter(Trackball.FILTER_ACCELERATION); 
      Trackball.setSensitivityX(20); 
      Trackball.setSensitivityY(20); 
     } 
     return super.navigationMovement(dx, dy, status, time);  
    } 

問題變得該導航運動從字段在索引0處跳轉到索引2到索引4 ...等每場比賽繞過場!


如何正確設置軌跡球對屏幕的靈敏度?

回答

1

我也無法理解這個API設計,根據我的經驗,這些方法都不起作用。作爲一種變通方法,可以調用下列方法中Screen類:

Screen.setTrackballSensitivityXOffset
Screen.setTrackballSensitivityYOffset
Screen.setTrackballFilter

隨着前兩種方法中,可以添加作爲參數給當前用戶靈敏度的偏移通過。值在[-100,100]範圍內,特殊值Integer.MAX_VALUE也可以將該值設置爲「未設置」。 (不要問我是什麼意思)。

現在來hacky部分。假設100是靈敏度的最大值,如果我們想將其設置爲100,我們首先需要獲得期望值和實際值之間的差值。然後您將靈敏度偏移設置爲屏幕。爲了簡便起見,我沒有檢查值在範圍:

int desiredSensitivityX = 100; //your value here 
int offsetX = desiredSensitivityX - Trackball.getSensitivityXForSystem(); // make sure offset is not out of range 
this.setTrackballSensitivityXOffset(offsetX); //here "this" is your screen 

你可以把這些代碼屏幕構造內。它只適用於該屏幕。一旦離開該屏幕,靈敏度(實際上是偏移量)就會恢復正常。

最後,同樣在屏幕類中的最後一個方法允許您僅爲該屏幕設置軌跡球過濾器。所以你可以把這一行放在你的構造函數中:

this.setTrackballFilter(Trackball.FILTER_ACCELERATION); 

並且在你離開你的屏幕後它應該恢復正常。

希望它有幫助。

+0

非常感謝,它的工作:) –