Как прикрепить слушатель поворотной прокрутки к Android Wear numberPicker? - PullRequest
0 голосов
/ 17 мая 2018

Я работал над этим целый день и до сих пор не могу понять это.Я делаю приложение для Android для устройства Android Wear и не могу понять, как обнаружить вращающееся колесо на устройстве для получения событий прокрутки.Я знаю, что по умолчанию поворотное колесо назначено для ScrollViews и Listview и т. Д., И у меня это работает, но я не могу заставить его работать на простом NumberPicker.Как подсказывают Google API, я использовал OnGenericMotionListener и, хотя он не выдает никаких ошибок, он все равно ничего не получает.

Я бы хотел, чтобы NumberPicker прокручивал вращающееся колесо.Мой код выглядит следующим образом.Ничто в logcat не показывает никаких ошибок:

                MyActivity.this.setContentView(R.layout.number_picker);
                NumberPicker numberPicker = (NumberPicker) findViewById(R.id.numberPicker1);
                numberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
                numberPicker.setMaxValue(100);       
                numberPicker.setMinValue(0);   
                numberPicker.setWrapSelectorWheel(true);
                numberPicker.setOnValueChangedListener( new NumberPicker.
                    OnValueChangeListener() {
                    public void onValueChange(NumberPicker picker, int
                        oldVal, int newVal) {

                    }          
                });
                numberPicker.setOnGenericMotionListener(new OnGenericMotionListener() {
                    @Override
                    public boolean onGenericMotion(View v, MotionEvent event) {

                        Log.i(TAG, "Received scroll event:" + event.getAction());
                        switch (event.getAction()) {
                        case MotionEvent.ACTION_SCROLL:             

                        }
                        return false;
                    }
                });

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

В документации это немного сбивает с толку, но это все есть, обратите внимание на следующий абзац:

  • События поворотного ввода отправляются только в сфокусированное представление.Эти события не всплывают в иерархии представлений.Если нет сфокусированного представления или если сфокусированное представление возвращает false из View.onGenericMotionEvent, то (и только тогда) событие отправляется в Activity.onGenericMotionEvent.

В основном все, что у вас естьдля этого нужно переопределить onGenericMotionEvent для вашей активности следующим образом:

    @Override
    public boolean onGenericMotion(View v, MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_SCROLL && RotaryEncoder.isFromRotaryEncoder(ev)) {
            // Don't forget the negation here
            float delta = -RotaryEncoder.getRotaryAxisValue(ev) * RotaryEncoder.getScaledScrollFactor(
            getContext());

            // Swap these axes if you want to do horizontal scrolling instead
            scrollBy(0, Math.round(delta));

            return true;
        }

        return false;
    }

И все, ваша активность получит все входные события вращения.

0 голосов
/ 17 мая 2018

Я думаю, вы ищете это:

Добавить пользовательскую поворотную прокрутку ввода :

Если ваш прокручиваемый вид изначально не поддерживает поворотный ввод прокрутка, или если вы хотите сделать что-то кроме прокрутки в отклик на поворотные события ввода (увеличение / уменьшение, поворот циферблатов и т. д.), вы можно использовать методы RotaryEncoder в библиотеке поддержки носимых устройств.

Следующий фрагмент кода показывает, как использовать RotaryEncoder для добавления пользовательская прокрутка в представлении вашего приложения:

myView.setOnGenericMotionListener(new View.OnGenericMotionListener() {
    @Override
    public boolean onGenericMotion(View v, MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_SCROLL && RotaryEncoder.isFromRotaryEncoder(ev)) {
            // Don't forget the negation here
            float delta = -RotaryEncoder.getRotaryAxisValue(ev) * RotaryEncoder.getScaledScrollFactor(
            getContext());

            // Swap these axes if you want to do horizontal scrolling instead
            scrollBy(0, Math.round(delta));

            return true;
        }

        return false;
    }
});

В любом случае, вы можете проверить полное руководство о поворотных событиях в Android износ.

...