所以我在我的应用程序中使用了Sliding Up Panel Library,并且我试图在滑动面板中实现ScrollView
。由于滑动面板和ScrollView都是由垂直滚动控制的,这导致了一些问题。
一旦面板完全滑动,当ScrollView滚动到顶部时,我通过切换面板的dragview来部分地完成工作。
我现在面临的问题是,当滚动面板到顶部时,滚动不会像在Google地图中一样转移到ScrollView。 很难解释,所以请看这里的视频: 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创建一个完全工作的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() {
}
过去两天我一直在努力奋斗。所以至少在一些指针上真的希望如此。首先十分感谢。关注Jakob Harteg。
答案 0 :(得分:7)
抱歉延迟..我找到了解决方案。
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 .... />
希望它有用。
答案 1 :(得分:1)
查看此答案(涉及对SlidingUpPanelLayout的一些更改):https://stackoverflow.com/a/22720204/466937
答案 2 :(得分:0)
我猜ScrollView
是SlidingPanel
的孩子?
在这种情况下,请onInterceptTouchEvent
覆盖SlidingPanel
,以便在onTouch
时拦截ScrollView
的{{1}}事件。
y = 0
执行以下两项操作:
onInterceptTouchEvent
答案 3 :(得分:0)
我不知道我是否已经到了很晚但经过一段时间的努力工作后我发现AndroidSlidingUp面板有一个名为setScrollView的方法,可以正确处理滚动事件。
我希望这篇文章有用,因为我花了很多时间搜索,但我没有找到一些帮助我的提示。