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

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

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

Введите описание изображения здесь

Проблема, с которой я столкнулся сейчас, заключается в том, что при прокрутке панели вверх, прокрутка не переносится в 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() { } 

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

Solutions Collecting From Web of "Передача события прокрутки из скользящего вида в ScrollView – Раздвижная панель с ScrollView, например, Google Maps"

Ознакомьтесь с этим ответом (подразумевает некоторые изменения в SlidingUpPanelLayout): https://stackoverflow.com/a/22720204/466937

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

 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 .... /> 

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

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

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

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

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

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