Giter Site home page Giter Site logo

overscrolllayout's Introduction

OverscrollLayout

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

##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;
            }
        });

overscrolllayout's People

Contributors

wcy10586 avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.