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
中使用addHeaderView
和addFooterView
,并将它们的填充(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 studio 的滚动视图中?