2013-10-27 31 views
14

所以我在我的应用程序中使用Sliding Up Panel Library,我试图在滑动面板中实现ScrollView。由于滑动面板和ScrollView都是由垂直滚动控制的,所以这导致了一些问题。从滑动视图到滚动视图的滚动事件 - 滑动面板与滚动视图像谷歌地图

我已经部分地通过切换面板的dragview,一旦面板一直向上滑动,并且当ScrollView被滚动到顶部时,它已经工作。

enter image description here

我现在面临的问题是,滚动面板顶部的滚动不转移到了滚动,就像它在谷歌地图的功能在。 有点难以解释,所以看视频在这里: 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 Harteg。

+0

Jakob - 你有没有运气让这个工作?任何建议将不胜感激! – Kyle

+0

@凯尔不,我很遗憾没有。花数小时努力尝试,但从来没有进一步超过视频显示..所以我最终重新设计了我的布局。 – Jakob

+0

@ Jakob-实际上我在SlidingUpPanel中有Listview。每个listview项目上都有一个按钮。我想在按钮上点击关闭列表视图项目来折叠面板。我认为setDragView()是折叠面板的方法。但我不明白我如何在我的适配器类中实现?请告诉我,我该怎么做。提前致谢。 – Lawrance

回答

0

我猜ScrollViewSlidingPanel的孩子?
在这种情况下,将onInterceptTouchEvent替换为SlidingPanel即可拦截ScrollViewonTouch事件,此时y = 0

onInterceptTouchEvent做有以下两种:

  • 孩子获得行动取消事件
  • 父母得到事件槽onTouch
+0

仍然无法得到它的工作..你能给我一些更多的代码相关的指针(我不要求你写我的应用程序,我只是卡住.. )。这里是SlidingPanel的代码(https://github.com/umano/AndroidSlidingUpPanel/blob/master/library/src/com/sothree/slidinguppanel/SlidingUpPanelLayout.java),它覆盖了第544行的InterceptTouchEvent,它在这里我假设做某种修改的权利? – Jakob

+0

你好。 我想要做同样的事情。你能分享一下你是如何做到的?它可以节省我几个小时的头痛! Tx –

+0

不幸的是,我从来没有得到它的工作... – Jakob

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

希望它是有用的。

+0

好吧,这是我的代码的基础,我试图实现一个更复杂的用户体验,比这提供。但是,无论如何感谢 – Jakob

0

我不知道我是否已经到了晚期,但努力工作了几天后我发现AndroidSlidingUp面板有一个方法称为setScrollView谁正确处理滚动事件。

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