Code Monkey home page Code Monkey 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.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;
            }
        });

overscrolllayout's People

Contributors

wcy10586 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

overscrolllayout's Issues

scrollview怎么确定事件只响应一次

overScrollLayout.setOnOverScrollListener(new OnOverScrollListener() {
@OverRide
public void onTopOverScroll() {
Log.d(TAG,"-------scroll-------up");
}

        @Override
        public void onBottomOverScroll() {
            Log.d(TAG,"-------scroll-------bottom");
        }

        @Override
        public void onLeftOverScroll() {
            Log.d(TAG,"-------scroll-------left");
        }

        @Override
        public void onRightOverScroll() {
            Log.d(TAG,"-------scroll-------right");
        }
    });

如上代码,发现下拉时onTopOverScroll方法会调用很多次

惯性

别的都挺完美了,就差一个惯性
我尝试使用behavior 但是没有搞定
就是Listview fling 的边界的时候有一个惯性回弹,
目前的回弹建立在拖拽的基础上,不是fling.
不知楼主有没有方案

另外关于越拉越难拉动的算法
private float getDealt(float dealt, float distance) {
if (dealt * distance < 0)
return dealt;
//x 为0的时候 y 一直为0, 所以当x==0的时候,给一个0.1的最小值
float x = (float) Math.min(Math.max(Math.abs(distance), 0.1) / Math.abs(baseOverScrollLength), 1);
float y = Math.min(new AccelerateInterpolator(0.15f).getInterpolation(x), 1);
return dealt * (1 - y);
}
这个我试过感觉要更好一点

建议

边界还不够平滑,可以添加算法,越拉越难拉,就像Android手机QQ一样,支持多指拉动是一个特色,感觉可以扩展成 上下拉刷新,一定非常不错

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.