Передача события прокрутки с скользящего вида на ScrollView - Скользящая панель с ScrollView, например Google Maps

Итак, я использую "Библиотека раздвижной панели" в моем приложении, и я пытаюсь реализовать ScrollView внутри раздвижная панель. Поскольку и скользящая панель, и ScrollView управляются вертикальными прокрутками, это вызывает некоторые проблемы.

Я частично получил его для работы, переключив панель перетаскивания, когда панель была полностью сдвинута, и когда ScrollView прокручивается вверх.

enter image description here

Проблема, с которой я столкнулся сейчас, заключается в том, что при прокрутке панели вверх, прокрутка не переносится в ScrollView, как в Google Maps. Немного трудно объяснить, поэтому посмотрите видео здесь: www.youtube.com/watch?v=9MUsmQzusX8&feature=youtu.be

Это прослушиватель слайдов панели:

...
slidePanel.setEnableDragViewTouchEvents(true);
slidePanel.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() {

    @Override
    public void onPanelSlide(View panel, float slideOffset) {

            // Change the dragview to panelheader when panel is fully expanded
            // I'm doing this here instead of in onPanelExpanded, 
            // because onPanelExpanded first gets called once scroll 
            // is released. 
            if (slideOffset <= 0) {
                slidePanel.setDragView(layoutPanelTop);
            } 

            // If the panel is not fully expanded set the whole 
            // panel as dragview
            else if(slideOffset > 0) {
                slidePanel.setDragView(layoutPanel);
            }
        }
    }

    @Override
    public void onPanelExpanded(View panel) {
        // layout.setDragView(layoutPanelTop);

        panelCollapsed = false;
        panelExpanded = true;
        panelAnchored = false;

        Log.v("TAG, "panelExpanded");

    }

    @Override
    public void onPanelCollapsed(View panel) {
        slidePanel.setDragView(layoutPanel);

        panelCollapsed = true;
        panelExpanded = false;
        panelAnchored = false;

        Log.v(TAG, "panelCollapsed");
    }

    @Override
    public void onPanelAnchored(View panel) {
        slidePanel.setDragView(layoutPanel);

        panelCollapsed = false;
        panelExpanded = false;
        panelAnchored = true;

        Log.v(TAG, "panelAnchored");
    }
});

И мне удалось создать полностью работающий прослушиватель прокрутки, расширив scrollview, который может обнаруживать направления прокрутки и события onDown и onUp:

private boolean atScrollViewTop = false;

@Override
public void onScrollChanged(int scrollY) {
    scrollY = Math.min(mMaxScrollY, scrollY);
    if (scrollY <= 0) {
        Log.v("myTag", "You at scrollview top");
        atScrollViewTop = true;

    } else {
        atScrollViewTop = false;
    }
    mScrollSettleHandler.onScroll(scrollY);

    switch (mState) {
        case STATE_SCROLL_UP:
            if (panelExpanded && atScrollViewTop) {
                slidePanel.setDragView(layoutPanel);
            } else {
                slidePanel.setDragView(layoutPanelTop);
            }
            Log.v("myTag", "scrolling up");
            break;
        case STATE_SCROLL_DOWN:
            slidePanel.setDragView(layoutPanelTop);
            Log.v("myTag", "scrolling down");
            break;
    }
}

@Override
public void onDownMotionEvent() {

}

@Override
public void onUpOrCancelMotionEvent() {

}

Я боролся с этим в течение последних двух дней. Так что действительно надеюсь на какой-то указатель, по крайней мере. Большое спасибо заранее. С уважением, Якоб Хартег.

Ответы

Ответ 1

Проверьте этот ответ (подразумевает некоторые изменения в SlidingUpPanelLayout): fooobar.com/questions/379516/...

Ответ 2

Извините за задержку.. я нахожу решение.

image = (ImageView) findViewById(R.id.image); //Layout to slide  

SlidingUpPanelLayout layout = (SlidingUpPanelLayout)
findViewById(R.id.sliding_layout); 

layout.setDragView(image); 
/*This method sets the layout to be used only
 in the sliding panel, while all layouts children
 are able to perform other functions such as scrolling */  

И это макет

<..SlidingUpPanelLayout
    android:id="@+id/sliding_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center" />

        <LinearLayout
            android:id="@+id/slide_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <ImageView 
                android:id="@+id/image"
                android:layout_width="match_parent"
                android:layout_height="35dp"
                android:background="@drawable/ec_image"/>

            <!-- FINALLY SCROLLVIEW -->
            <ScrollView .... />

Надеюсь, это полезно.

Ответ 3

Я предполагаю, что ScrollView является дочерним элементом SlidingPanel?
В этом случае переопределите onInterceptTouchEvent в SlidingPanel, чтобы перехватить событие onTouch вашего ScrollView, когда y = 0.

onInterceptTouchEvent выполняет следующие два:

  • ребенок получает событие отмены действия
  • родительский элемент get trough onTouch

Ответ 4

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

Я надеюсь, что этот пост будет полезен, потому что я проводил много времени, и я не нашел подсказки, которые помогут мне.