Android: Listview's bounce to scrollview

2019-03-11 04:38发布

问题:

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.

回答1:

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.



回答2:

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


回答3:

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



回答4:

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.



回答5:

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