【问题标题】:Transfer scroll event from sliding view to ScrollView - Sliding panel with ScrollView like Google Maps将滚动事件从滑动视图转移到 ScrollView - 带有 ScrollView 的滑动面板,如谷歌地图
【发布时间】:2013-10-27 15:45:53
【问题描述】:

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

当面板一直向上滑动并且 ScrollView 滚动到顶部时,我通过切换面板的拖动视图来部分工作。

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

我已经设法通过扩展滚动视图创建了一个完全正常工作的滚动视图侦听器,它可以检测滚动方向以及 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- 实际上我在 SlidingUpPanel 中有 Listview。每个列表视图项上都有一个按钮。我想在单击特定列表视图项的按钮上折叠面板。我认为 setDragView() 是折叠面板的方法。但我不明白如何在我的适配器类中实现?请告诉我我该怎么做。提前致谢。
  • @Lawrence setDragView() 不是折叠的方法。要折叠它,我认为它像 smoothSlideTo(1.0);但不确定。
  • 但是我应该在哪里应用 smoothSlideTo() 方法?在按钮的自定义适配器onClickListner中,是真的吗?
  • @Lawrence 你应该调用 slidePanel.smoothSlideTo(1.0f, 500);在您的 onClickListener 中(其中 500 是您的速度)
  • 这能回答你的问题吗? SlidingUpPanelLayout and ScrollView

标签: java android slideup


【解决方案1】:

抱歉耽搁了……我找到了解决办法。

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

希望有用。

【讨论】:

  • 这是我的代码的基础,我正在尝试实现比它提供的更复杂的用户体验。不过还是谢谢
【解决方案2】:

我猜ScrollViewSlidingPanel 的孩子?
在这种情况下,将onInterceptTouchEvent 覆盖到您的SlidingPanel 以在y = 0 时拦截您的ScrollViewonTouch 事件。

onInterceptTouchEvent 做了以下两个:

  • 孩子获得动作取消事件
  • 家长通过onTouch获取事件

【讨论】:

  • 仍然无法让它工作..你能给我一些与代码相关的指针吗(我不是要你写我的应用程序,我只是卡住了.. )。这是 SlidingPanel 的代码 (github.com/umano/AndroidSlidingUpPanel/blob/master/library/src/…),它在第 544 行覆盖了 onInterceptTouchEvent,我想在这里做一些修改吧?
【解决方案3】:

我不知道是不是来晚了,但经过几天的努力,我发现AndroidSlidingUp面板有一个名为setScrollView的方法,可以正确处理滚动事件。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2018-02-11
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多