3

我使用下面的代码来设置轨迹球的灵敏度

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当我在usingTrackball.getSensitivityX()Trackball.getSensitivityY()in 中检查轨迹球的灵敏度时navigationMovement,它返回“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
        }
    }

它还通过 usingTrackball.getSensitivityX()Trackball.getSensitivityY()in返回“2147483647” navigationMovement


最后,基于一些网络搜索,我将条件移动到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 ......等每次移动都绕过字段!


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

4

1 回答 1

1

我也无法理解这个 API 设计,以我的经验,这些方法不起作用。作为一种解决方法,您可以在类中调用以下方法Screen

Screen.setTrackballSensitivityXOffset
Screen.setTrackballSensitivityYOffset
Screen.setTrackballFilter

使用前两种方法,您可以将作为参数传递的偏移量添加到当前用户敏感度。取值范围为[-100, 100],特殊值Integer.MAX_VALUE也允许设置为“未设置”。(不要问我未设置是什么意思)。

现在是骇人听闻的部分。假设 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

您可以将该代码放在屏幕构造函数中。它仅适用于该屏幕。离开该屏幕后,灵敏度(实际上是偏移量)会恢复正常。

最后,同样在 screen 类中的最后一个方法允许您仅为该屏幕设置轨迹球过滤器。所以你可以把这一行放在你的构造函数中:

this.setTrackballFilter(Trackball.FILTER_ACCELERATION);

离开屏幕后它应该会恢复正常。

希望能帮助到你。

于 2012-09-25T13:52:14.277 回答