В 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 с помощью Trackball.getSensitivityX() а также Trackball.getSensitivityY() в 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
        }
    }

Он также возвращает "2147483647" с помощью Trackball.getSensitivityX() а также Trackball.getSensitivityY() в 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 ... и т.д., обходя поле с каждым движением!


Как правильно установить чувствительность трекбола для экрана?

1 ответ

Решение

Я также не могу понять этот дизайн API, по моему опыту, эти методы не работали. В качестве обходного пути вы можете вызвать следующие методы в Screen учебный класс:

Screen.setTrackballSensitivityXOffset
Screen.setTrackballSensitivityYOffset
Screen.setTrackballFilter

С помощью первых двух методов вы можете добавить смещение, переданное в качестве параметра, к текущей чувствительности пользователя. Значения находятся в диапазоне [-100, 100], а также специальные значения Integer.MAX_VALUE также разрешено устанавливать значение как "unset". (Не спрашивайте меня, что означает unset).

Теперь начинается хакерская часть. Предполагая, что 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);

и он должен вернуться к нормальной жизни после того, как вы покинете экран.

Надеюсь, поможет.

Другие вопросы по тегам