Android:Listview反弹到scrollview

时间:2011-08-26 08:24:27

标签: android android-widget android-animation android-scrollview

任何将ListView的弹跳效果添加到常规scrollview的方法? 通过弹跳我的意思是当你触到列表的底部时橡皮筋就像效果一样。

6 个答案:

答案 0 :(得分:18)

将效果反弹添加到android

中的listview

第1步:在com.base.view包中创建新文件BounceListView

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

}

第2步:在您的布局中,请更改

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

<com.base.view.BounceListView 
   android:id="@+id/list"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
/>

答案 1 :(得分:11)

根据ScrollView API中的内容,如果您创建扩展onOverScrolled()类的自定义视图,则应该能够覆盖ScrollView方法。在快速进行谷歌搜索之后,我遇到了this link,看起来这就是你想要做的......我确实认为这种方法是在Android 2.3.1中添加的,所以你将仅限于设备跑那个。

答案 2 :(得分:5)

我找到了BounceListView的最佳实现(在LGPL许可下)。 这是:https://github.com/Larphoid/android-Overscroll-ListView

答案 3 :(得分:2)

您可能拥有自定义的三星设备。你应该知道弹跳效果不是Android操作系统的默认行为,它是三星引入的(它的实现也很差,它们应该使ScrollView的行为相同)。在Android 2.3中引入了Overscroll支持,默认行为不是弹跳,而是强烈的光线,其强度与滚动速度/“力”成正比。它可以无处不在(列表视图,滚动视图,网页浏览等)。

总之,你不应该担心这一点。没有简单的论据可以传递给ScrollView以使其像那样过度滚动。 IMO,并且经历了延长ScrollView课程的所有麻烦都不值得。只需依靠默认行为。

如果三星希望弄乱他们的用户并给他们一个不一致的用户界面,那么就这样吧。

答案 4 :(得分:0)

对于那些想要对ListView实施退回效果的人。

HOWTO

添加此效果的一种方法是使用addHeaderView中的addFooterViewListView及其填充(topPadding用于标题视图,bottomPadding用于页脚视图)第一次设置为0,然后我们覆盖onTouchEvent,并根据移动距离更改填充。

实施

Sample Code

注释

这个想法是从android-pulltorefresh借来的,因为弹跳效果比拉到刷新更简单,所以代码也更短。 ^ _ ^

希望这会对某人有所帮助..

答案 5 :(得分:0)

对于任何在 NestedScrollView 上寻找反弹效果的人,我制作了一个库: https://github.com/Valkriaine/Bouncy

用法:

在您的应用模块 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'

   }

并使用 BouncyNestedScrollView 作为普通的 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 指定滚动效果的大小,如果没有给定值,则默认为 0.5。

overscroll_animation_size 指定拖动的过度滚动效果的大小,如果没有给定值,则默认为 0.5。

强烈建议将两个值都保持在 5 以下。

BouncyNestedScrollView 是根据 NestedScrollView 的源代码修改的,因此从技术上讲,它应该适用于 NestedScrollView 的所有现有自定义选项。