Android TV: действие PlaybackControlsRow, длительное нажатие

Я пытаюсь реализовать действия перемотки вперед и назад, используя PlaybackControlsRow, используя Leanback library для Android TV, однако я не могу найти никакого метода для обнаружения длительного нажатия на эти кнопки. Моя текущая реализация проста, ищет только 10 секунд одним щелчком мыши:

private void setupRows() {
    final ClassPresenterSelector ps = new ClassPresenterSelector();
    final PlaybackControlsRowPresenter playbackControlsRowPresenter =
            new PlaybackControlsRowPresenter(new DescriptionPresenter());

    playbackControlsRowPresenter.setOnActionClickedListener(action -> {
        if (action.getId() == playPauseAction.getId()) {
            togglePlayback(playPauseAction.getIndex() == PlayPauseAction.PLAY);
        } else if (action.getId() == fastForwardAction.getId()) {
            fastForward();
            return;
        } else if (action.getId() == rewindAction.getId()) {
            rewind();
            return;
        }
        if (action instanceof PlaybackControlsRow.MultiAction) {
            ((PlaybackControlsRow.MultiAction) action).nextIndex();
            notifyChanged(action);
        }
    });

    ps.addClassPresenter(PlaybackControlsRow.class, playbackControlsRowPresenter);
    ps.addClassPresenter(ListRow.class, new ListRowPresenter());
    rowsAdapter = new ArrayObjectAdapter(ps);

    updatePlaybackControlsRow();

    setAdapter(rowsAdapter);
}

private void fastForward() {
    ((PlaybackActivity) getActivity()).onFragmentFastForward();

    final int currentTime = ((PlaybackActivity) getActivity()).getPosition();
    playbackControlsRow.setCurrentTime(currentTime);
}

private void rewind() {
    ((PlaybackActivity) getActivity()).onFragmentRewind();

    final int currentTime = ((PlaybackActivity) getActivity()).getPosition();
    playbackControlsRow.setCurrentTime(currentTime);
}

In PlaybackActivity:

public void onFragmentFastForward() {
    // Fast forward 10 seconds.
    videoView.seekTo(videoView.getCurrentPosition() + (10 * 1000));
}

public void onFragmentRewind() {
    videoView.seekTo(videoView.getCurrentPosition() - (10 * 1000));
}

Можно ли реализовать быструю перемотку вперед и назад при длительном нажатии действий, таких как события нажатия и нажатия клавиш на кнопках действий?


person Yuriy Yunikov    schedule 11.03.2017    source источник
comment
Вы можете попробовать использовать GestureDetector. для обнаружения общих жестов без самостоятельной обработки отдельных событий касания. Это поддерживает onLongPress(). Для получения дополнительной информации и примера фрагмента кода посетите страницу Обнаружение жестов.   -  person Teyam    schedule 12.03.2017
comment
@Teyam Да, спасибо. Это может быть возможным решением. Тем не менее, я все еще думал, что в Leanback library для PlaybackControlsRow была некоторая поддержка из коробки, но это не похоже на это.   -  person Yuriy Yunikov    schedule 13.03.2017


Ответы (1)


После поиска других решений кажется, что PlaybackControlsRowPresenter разработан таким образом, что он не должен иметь долгих нажатий, а вместо этого увеличивать/уменьшать скорость на количество нажатий на кнопки быстрой перемотки вперед/назад. Это хорошо видно из реализации внутреннего конструктора классов PlaybackControlsRowPresenter.FastForwardAction и PlaybackControlsRowPresenter.RewindAction:

/**
 * Constructor
 * @param context Context used for loading resources.
 * @param numSpeeds Number of supported fast forward speeds.
 */
public FastForwardAction(Context context, int numSpeeds) {

Итак, в результате мое решение на данный момент заключается в увеличении/уменьшении скорости при каждом нажатии на кнопки быстрой перемотки вперед/назад (что по умолчанию выполняется в пользовательском интерфейсе). После этого когда нажимаю плей - просто возобновляет видео с искомой точки.

ОБНОВЛЕНИЕ (обновленные части кода):

    private void setupRows() {
        final ClassPresenterSelector ps = new ClassPresenterSelector();
        final PlaybackControlsRowPresenter playbackControlsRowPresenter =
                new PlaybackControlsRowPresenter(new DescriptionPresenter());

        playbackControlsRowPresenter.setOnActionClickedListener(action -> {
            if (action.getId() == playPauseAction.getId()) {
                togglePlayback(playPauseAction.getIndex() == PlayPauseAction.PLAY);
                ((PlaybackControlsRow.MultiAction) action).nextIndex();
                notifyChanged(action);
            } else if (action.getId() == fastForwardAction.getId()) {
                if (currentSpeed <= MAX_SPEED) {
                    currentSpeed++;

                    showTogglePlayback(false, true);

                    if (currentSpeed < 0) {
                        prevRewind();
                    } else if (currentSpeed > 0) {
                        nextFastForward();
                    } else {
                        currentSpeed++;
                        prevRewind();
                        nextFastForward();
                    }

                    ((PlaybackActivity) getActivity()).seek(currentSpeed);
                }
            } else if (action.getId() == rewindAction.getId()) {
                if (currentSpeed >= MIN_SPEED) {
                    currentSpeed--;

                    showTogglePlayback(false, true);

                    if (currentSpeed > 0) {
                        prevFastForward();
                    } else if (currentSpeed < 0) {
                        nextRewind();
                    } else {
                        currentSpeed--;
                        prevFastForward();
                        nextRewind();
                    }

                    ((PlaybackActivity) getActivity()).seek(currentSpeed);
                }
            } else if (action.getId() == R.id.lb_control_picture_in_picture &&
                       PlaybackActivity.supportsPictureInPicture(getActivity())) {
                getActivity().enterPictureInPictureMode();
            }
        });

        ps.addClassPresenter(PlaybackControlsRow.class, playbackControlsRowPresenter);
        ps.addClassPresenter(ListRow.class, new ListRowPresenter());
        rowsAdapter = new ArrayObjectAdapter(ps);

        updatePlaybackControlsRow();

        setAdapter(rowsAdapter);
    }

    private void prevFastForward() {
        fastForwardAction.setIndex(fastForwardAction.getIndex() - 1);
        notifyChanged(fastForwardAction);
    }

    private void nextFastForward() {
        fastForwardAction.nextIndex();
        notifyChanged(fastForwardAction);
    }

    private void prevRewind() {
        rewindAction.setIndex(rewindAction.getIndex() - 1);
        notifyChanged(rewindAction);
    }

    private void nextRewind() {
        rewindAction.nextIndex();
        notifyChanged(rewindAction);
    }
person Yuriy Yunikov    schedule 19.03.2017
comment
Полная реализация @NabeelK довольно большая, поэтому я опубликовал обновленный код по сравнению с кодом в вопросе. пожалуйста, +1 вопрос и ответ, если это вам поможет. - person Yuriy Yunikov; 05.01.2019