将滚动事件从滑动视图传输到ScrollView - 使用ScrollView(如Google Maps)滑动面板

时间:2013-10-27 15:45:54

标签: java android slideup

所以我在我的应用程序中使用了Sliding Up Panel Library,并且我试图在滑动面板中实现ScrollView。由于滑动面板和ScrollView都是由垂直滚动控制的,这导致了一些问题。

一旦面板完全滑动,当ScrollView滚动到顶部时,我通过切换面板的dragview来部分地完成工作。

enter image description here

我现在面临的问题是,当滚动面板到顶部时,滚动不会像在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。

4 个答案:

答案 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)

我猜ScrollViewSlidingPanel的孩子? 在这种情况下,请onInterceptTouchEvent覆盖SlidingPanel,以便在onTouch时拦截ScrollView的{​​{1}}事件。

y = 0执行以下两项操作:

  • 孩子获得行动取消活动
  • 父级通过onInterceptTouchEvent
  • 获取活动

答案 3 :(得分:0)

我不知道我是否已经到了很晚但经过一段时间的努力工作后我发现AndroidSlidingUp面板有一个名为setScrollView的方法,可以正确处理滚动事件。

我希望这篇文章有用,因为我花了很多时间搜索,但我没有找到一些帮助我的提示。