Android - Сделайте полосу прокрутки в HorizontalScrollView интерактивной - PullRequest
0 голосов
/ 13 февраля 2012

Я использую HorizontalScrollView в одном из моих макетов и заменил дорожку полосы прокрутки и большой палец, переопределив соответствующие атрибуты xml, так что дорожка представляет собой миниатюры представлений в пределах HorizontalScrollView, а большой палец указывает текущая позиция.

Пока все работает нормально, и я могу прокручивать вид. Однако я не могу использовать полосу прокрутки, т. Е. Дорожку и большой палец для прокрутки, я могу только прокручивать с помощью бросков поверх всего представления. Каждый щелчок / бросок в верхней части полосы прокрутки просто интерпретируется как щелчок / бросок в другом месте в HorizontalScrollView. Другими словами, я не могу перетащить большой палец и, таким образом, изменить положение, а также не могу перейти к определенной позиции, щелкнув где-нибудь на дорожке полосы прокрутки.

Вот мой макет:

<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:scrollbarFadeDuration="0"
android:scrollbarThumbHorizontal="@drawable/highlight_box"
android:scrollbarTrackHorizontal="@drawable/tumbnail_chain" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="horizontal" >

       ...couple of FrameLayouts

    </LinearLayout>

</HorizontalScrollView>

К сожалению, я пока не нашел решения этой проблемы

EDIT:
Я только что узнал, что полоса прокрутки не должна работать в Android, смотрите здесь

У кого-нибудь есть идея, как я могу реализовать желаемое поведение, описанное выше? Код не нужен, просто предложения!

РЕДАКТИРОВАТЬ 2 (Обходной путь):
Для тех, кто заинтересован в моем решении: я поместил прозрачный фиктивный вид поверх полосы прокрутки того же размера и установил OnTouchListener для этого вида. В методе onTouch слушателя я затем вычисляю относительную позицию события касания, касающуюся трек-бара, а затем перехожу к той же относительной позиции в пределах HorizontalScrollView с помощью метода scrollTo:

public boolean onTouch (View v, MotionEvent event) {
    int x = Math.round((event.getX() / mScrollbarWidth) * mScrollViewWidth);
    mScrollView.scrollTo(x, 0);
    return true;
}

, где mScrollBarWidth - ширина полосы прокрутки (по существу, ширины экрана), а mScrollViewWidth - ширина HorizontalScrollView в целом. Поскольку этот метод вызывается непрерывно во время прикосновения к фиктивному виду, вы можете не только перейти в положение, к которому вы прикоснулись, вы также можете перетащить большой палец на полосу прокрутки.

Ответы [ 2 ]

1 голос
/ 03 января 2013

У меня похожая ситуация, большой документ для отображения (в моем случае это нотная запись), и я хочу использовать перетаскивание полосы прокрутки (в дополнение к обычному перетаскиванию и переключению), чтобы пользователь мог получить произвольный доступ к любой части документалегко без часов прокрутки.

я думаю, что еще одно простое решение - посмотреть на позицию касания в onScroll и onFling, и если вы обнаружите, что находитесь над полосой прокрутки, выполните ручную прокрутку.моя полоса прокрутки настроена так, чтобы мне никогда не было так легко.

1 голос
/ 13 февраля 2012

Я думаю, что сенсорное событие в HorizontalScrollView перехватывается любым родительским представлением или макетом.создайте объект HorizontalScrollView в Java-файле и вызовите следующий код для него -

 view.getParent().requestDisallowInterceptTouchEvent(true); //view being the object of scrollview

Это может работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...