Android:Listview 反弹到滚动视图

Posted

技术标签:

【中文标题】Android:Listview 反弹到滚动视图【英文标题】:Android: Listview's bounce to scrollview 【发布时间】:2011-11-04 08:08:54 【问题描述】:

有什么方法可以将 ListView 的反弹效果添加到常规滚动视图中? 弹跳是指当您击中列表底部时的橡皮筋效果。

【问题讨论】:

【参考方案1】:

android中的listview中添加效果弹跳

第一步:在包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_
   android:layout_
/>

<com.base.view.BounceListView 
   android:id="@+id/list"
   android:layout_
   android:layout_
/>

【讨论】:

感谢您的解决方案。但这仅在发生溢出时才有效。 无法按我的意愿工作。 ListView 正在拉伸,但没有橡胶效果 - 当我放开 ListView 时,滚动被锁定。 overScrollBy 不会在 2.3 上触发 =/ @ThienNguyen 很幸运(对我而言),这正是我想要的。感谢您的提示。 将列表视图的高度设置为wrap_content***.com/a/15480186/369317是一种不好的做法【参考方案2】:

ScrollView API 的外观来看,如果您创建一个扩展ScrollView 类的自定义视图,您应该能够覆盖onOverScrolled() 方法。在做了一个快速的谷歌搜索后,我遇到了this link,看起来这就是你想要做的……我相信这个方法是在 Android 2.3.1 中添加的,所以你将仅限于运行该方法的设备.

【讨论】:

【参考方案3】:

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

【讨论】:

这个 BounceListView 类似乎运行良好,但是,当第一次加载项目时,您无法看到它们。您必须在列表视图上滚动才能显示项目。你有解决方案吗?【参考方案4】:

您可能拥有一台定制的三星设备。你应该知道反弹效果不是 Android 操作系统的默认行为,它是三星引入的东西(而且它的实现也很差,他们应该让 ScrollView 的行为相同)。在 Android 2.3 中引入了过度滚动支持,默认行为不是弹跳,而是一种强度与滚动速度/“力”成正比的光辉。它无处不在(列表视图、滚动视图、网络视图等)。

总之,您不必担心这一点。没有简单的参数可以传递给ScrollView 以使其像那样过度滚动。并且通过扩展ScrollView 类的所有麻烦是不值得的,IMO。只依赖默认行为。

如果三星想惹恼他们的用户并给他们一个不一致的用户界面,那就这样吧。

【讨论】:

@RaphMclee 我使用三星设备和香草模拟器进行开发,我能够观察到这些差异。但请注意,这是一篇旧帖子,可能与当前一代三星设备无关。 好的,所以您没有指向文档的链接。您从使用不同设备的经验中获得了此信息。谢谢你的信息。【参考方案5】:

对于那些想要在ListView上实现反弹效果的人。

如何

添加此效果的一种方法是在ListView 中使用addHeaderViewaddFooterView,并将它们的填充(topPadding 用于页眉视图,bottomPadding 用于页脚视图)设置为0第一次,然后我们覆盖onTouchEvent,并根据移动距离改变填充。

实施

Sample Code

注意事项

借鉴android-pulltorefresh的思路,由于弹跳效果比pull-to-refresh更简单,所以代码也更短。 ^_^

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

【讨论】:

【参考方案6】:

对于任何在 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_
        android:layout_
        app:fling_animation_size=".7"
        app:overscroll_animation_size=".7">

    <LinearLayout
            android:orientation="vertical"
            android:layout_
            android:layout_>
            
            ...
            ...
            ...

    </LinearLayout>

</com.factor.bouncy.BouncyNestedScrollView>

fling_animation_size指定fling的overscroll效果大小,不指定则默认为0.5。

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

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

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

【讨论】:

以上是关于Android:Listview 反弹到滚动视图的主要内容,如果未能解决你的问题,请参考以下文章

如何将Listview数据裁剪到android中的滚动位置?

在包含 ListView (Android) 的视图中滚动

如何将 listView 放在 android studio 的滚动视图中?

当滚动视图反弹时,滚动 UIScrollView 子视图不应该移动

滚动视图中的 Android 列表视图

在android中使用listview无法正常播放视频