Android: Listview's bounce to scrollview

后端 未结 6 863
生来不讨喜
生来不讨喜 2021-02-02 00:33

Any way of adding ListView\'s bounce effect to regular scrollview? By bounce I mean the rubber band like effect when you hit the bottom of the list.

相关标签:
6条回答
  • 2021-02-02 00:45

    By the looks of things in the ScrollView API you should be able to override the onOverScrolled() method if you create a custom view that extends the ScrollView class. After doing a quick Google search I came across this link and it looks as if this is what you are trying to do... I do believe this method was added in Android 2.3.1 though so you will be limited to devices running that.

    0 讨论(0)
  • 2021-02-02 00:48

    For those who want to implement the bounce effect on ListView.

    Howto

    one way to add this effect is using addHeaderView and addFooterView in ListView, and their padding(topPadding for header view, and bottomPadding for footer view) are set to 0 for the first time, then we override the onTouchEvent, and change the padding according to the moving distance.

    Implementation

    Sample Code

    Notes

    The idea is borrowed from android-pulltorefresh, since bouncing effect are more simple than pull-to-refresh, so the code is shorter too. ^_^

    Hope this will help someone..

    0 讨论(0)
  • 2021-02-02 00:49

    Add effect bounce to listview in android

    Step 1: Create new file BounceListView in package com.base.view

    public class BounceListView extends ListView
    {
        private static final int MAX_Y_OVERSCROLL_DISTANCE = 200;
    
        private Context mContext;
        private int mMaxYOverscrollDistance;
    
        public BounceListView(Context context) 
        {
            super(context);
            mContext = context;
            initBounceListView();
        }
    
        public BounceListView(Context context, AttributeSet attrs) 
        {
            super(context, attrs);
            mContext = context;
            initBounceListView();
        }
    
        public BounceListView(Context context, AttributeSet attrs, int defStyle) 
        {
            super(context, attrs, defStyle);
            mContext = context;
            initBounceListView();
        }
    
        private void initBounceListView()
        {
            //get the density of the screen and do some maths with it on the max overscroll distance
            //variable so that you get similar behaviors no matter what the screen size
    
            final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
                final float density = metrics.density;
    
            mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE);
        }
    
        @Override
        protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) 
        { 
            //This is where the magic happens, we have replaced the incoming maxOverScrollY with our own custom variable mMaxYOverscrollDistance; 
            return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent);  
        }
    
    }
    

    Step 2: At your layout, please change

    <ListView 
       android:id="@+id/list"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
    />
    

    to

    <com.base.view.BounceListView 
       android:id="@+id/list"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
    />
    
    0 讨论(0)
  • 2021-02-02 00:49

    I found the best implementation of BounceListView (under LGPL license). Here it is: https://github.com/Larphoid/android-Overscroll-ListView

    0 讨论(0)
  • 2021-02-02 00:51

    You probably have a customized Samsung device. You should know that the bounce effect is not the default behavior of the Android OS, it's something introduced by Samsung (and it's poorly implemented as well, they should've made the ScrollView behave the same). Overscroll support was introduced in Android 2.3, and the default behavior is not bouncing, instead it's a glow of light with the intensity directly proportional to the scroll speed / "force". And it works everywhere (listviews, scrollviews, webviews, etc).

    In conclusion, you should not worry about this. There's no simple argument that you can pass to ScrollView to make it overscroll like that. And going through all the trouble of extending the ScrollView class is not worth it, IMO. Just rely on the default behavior.

    If Samsung wants to mess with their users and give them an inconsistent UI, then so be it.

    0 讨论(0)
  • 2021-02-02 00:52

    For anyone looking for the bounce effect on NestedScrollView, I have made a library: https://github.com/Valkriaine/Bouncy

    Usage:

    In your app module build.gradle:

       dependencies {
            implementation 'com.factor:bouncy:1.8'
    
            // if you want BouncyRecyclerView too, add implementation for recyclerview
            implementation 'androidx.recyclerview:recyclerview:1.1.0'
    
       }
    

    And use BouncyNestedScrollView as a normal NestedScrollView:

    <com.factor.bouncy.BouncyNestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:fling_animation_size=".7"
            app:overscroll_animation_size=".7">
    
        <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                
                ...
                ...
                ...
    
        </LinearLayout>
    
    </com.factor.bouncy.BouncyNestedScrollView>
    

    fling_animation_size specifies the magnitude of overscroll effect for fling, default is 0.5 if no value is given.

    overscroll_animation_size specifies the magnitude of overscroll effect for drag, default is 0.5 if no value is given.

    Strongly suggest to keep both values lower than 5.

    BouncyNestedScrollView was modified based on the source code of NestedScrollView, so technically it should work with all existing customization options of NestedScrollView.

    0 讨论(0)
提交回复
热议问题