OverscrollLayout

Introduction: 支持超出屏幕滑动的 Layout,支持任何 View,支持上下或者左右的 OverScroll.继承自 RelativeLayout,就像使用 RelativeLayout 本行、身一样方便,支持对自定义 View 的扩展。
More: Author   ReportBugs   DemoAPK   
Tags:
超屏幕滑动-OverScrol-

一个可以对任意 view 实现超屏幕滑动的 layout,继承自 RelatvieLayout,只能包含一个子 view. 默认对 AbsListView,RecyclerView,ScrollView,HorizontalScrollView,ViewPager 以及一般的 View 做了处理。ViewPager 本身禁止超屏幕滑动。一般的 View 支持纵向滑动。AbsListView,RecyclerView,ScrollView, HorizontalScrollView 支持在他们的滚动方向上做超屏幕滑动。有自定义的 View 想要支持这个功能,可以对 OverScrollLayout 设置 OverScrollCheckListener.也可以通过设置 OnOverScrollListener 来监听是否是正在做超屏幕滑动。 image

v1.1.0

添加 fling 惯性。

v1.01

1.优化 OverScroll 的边界的平滑度。
2.添加阻力系数 setFraction(float fraction),越拉越难拉!

感谢mkrcpp提出改进意见!

v1.0

一般的 view 可以这么用

    <com.wcy.overscroll.OverScrollLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/overscroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_blue_bright"
        android:orientation="vertical">
        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"></ListView>
    </com.wcy.overscroll.OverScrollLayout>

在 Activity 里面如果需要监听 overScroll 可以这样写

        overScrollLayout.setOnOverScrollListener(new OnOverScrollListener() {
            @Override
            public void onTopOverScroll() {
                Log.i(TAG, "====onTopOverScroll=======");
            }
            @Override
            public void onBottomOverScroll() {
                Log.i(TAG,"====onBottomOverScroll=======");
            }
            @Override
            public void onLeftOverScroll() {
                Log.i(TAG,"====onLeftOverScroll=======");
            }
            @Override
            public void onRightOverScroll() {
                Log.i(TAG,"====onRightOverScroll=======");
            }
        });


如果不需要监听,则和使用一个 RelativeLayout 一样简单。


如果是对自定义的 View 做 OverScroll 的话需要设置 OvserScrollCheckListener.
 overScrollLayout.setOverScrollCheckListener(OverScrollCheckListener l)
 在 OverScrollCheckListener 中
 public int getContentViewScrollDirection() ;用于指定 overscroll 的方向,
 包括横向和纵向:OverScrollLayout.SCROLL_VERTICAL,OverScrollLayout.SCROLL_HORIZONTAL。
  public boolean canOverScroll(float dealtX, float dealtY, View contentView);用于判断是否可以 OverScroll.
  public boolean canScrollUp();用于判断是否到达顶部,用于检查垂直 Overscroll;
  public boolean canScrollDown();用于判断是否到达底部,用于检查垂直 OverScroll;
  public boolean canScrollLeft();用于判断是否到达左边界,用于检查水平 OverScroll;
  public boolean canScrollRight() ;用于判断是否已到达右边界,用于检查水平 OverScroll。

  以为 StaggeredGridView 为例子,要实现它的 OverScroll  那么 OverScrollCheckListener 可以这么实现:
         overScrollLayout.setOverScrollCheckListener(new OverScrollCheckListener() {
            @Override
            public int getContentViewScrollDirection() {
                return OverScrollLayout.SCROLL_VERTICAL;
            }
            @Override
            public boolean canOverScroll(float dealtX, float dealtY, View contentView) {
                if (dealtY < 0 && !canScrollUp()) {
                    return true;
                }
                if (dealtY > 0 && !canScrollDown()) {
                    return true;
                }
                return false;
            }
            @Override
            public boolean canScrollUp() {
                int fp = staggeredGridView.getFirstPosition();
                if (fp == 0) {
                    View child = staggeredGridView.getChildAt(0);
                    if (child.getTop() >= staggeredGridView.getPaddingTop()) {
                        return false;
                    }
                }
                return true;
            }
            @Override
            public boolean canScrollDown() {
                int fp = staggeredGridView.getFirstPosition();
                int lp = staggeredGridView.getChildCount() + fp - 1;
                if (lp == staggeredGridView.getAdapter().getCount() - 1) {
                    int numClos = staggeredGridView.getColumnCount();
                    int childCount = staggeredGridView.getChildCount();
                    for (int i = 1; i <= numClos; i++) {
                        View view = staggeredGridView.getChildAt(childCount - i);
                        if (view.getBottom() <= staggeredGridView.getHeight() + staggeredGridView.getPaddingBottom()) {
                            return false;
                        }
                    }
                }
                return true;
            }
            @Override
            public boolean canScrollLeft() {
                return false;
            }
            @Override
            public boolean canScrollRight() {
                return false;
            }
        });
Apps
About Me
GitHub: Trinea
Facebook: Dev Tools