在Blackberry中,设置轨迹球灵敏度不起作用?

问题描述:

我使用以下代码来设置轨迹球在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 ...等每场比赛绕过场!


如何正确设置轨迹球对屏幕的灵敏度?

我也无法理解这个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

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