最近项目中用到了弹性滑动,但是这个弹性滑动只有在2.3之后才有了功能函数,在2.2以及之前的版本中,只有自己去实现了。
查了一下网上的资源,貌似没有提供出来一个具体的方式来实现。看到一个牛人写的一个软件中实现了弹性滑动,查了查源码,然后看了看ListView的源码,然后自己搞了一下,实现了弹性滑动。
基本思路就是得到出当前的可显示的item的位置,然后判断出否是越界,这里的越界就是是否有过度的滑动。如果有的话,就利用ScrollTo()这个方法,先把控件滑动到手势触摸事件的位置,当触摸事件结束时,滑动到屏幕顶端,或者末端。
首先是自定义一个类,继承ListView,然后在其中加入手势的事件模型。在处理touch事件时将事件交给手势listener来处理。并且返回父类的处理结果。
public class BouncyListView extends ListView {
private Context context;
/*
* Slide over so that cross-border
*/
private boolean outBound = false;
private int distance;
private int firstOut;
public BouncyListView(Context context) {
super(context);
this.context = context;
}
public BouncyListView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public BouncyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
}
GestureDetector mGestureDetector = new GestureDetector(context,
new GestureDetector.OnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
int firstPos = getFirstVisiblePosition();
int lastPos = getLastVisiblePosition();
int itemCount = getCount();
//outbound Top
if (outBound && firstPos != 0 && lastPos != (itemCount - 1)) {
scrollTo(0, 0);
return false;
}
View firstView = getChildAt(firstPos);
if (!outBound)
firstOut = (int) e2.getRawY();
if (firstView != null
&& (outBound || (firstPos == 0
&& firstView.getTop() == 0 && distanceY < 0))) {
//Record the length of each slide
distance = firstOut - (int) e2.getRawY();
scrollTo(0, distance/2);
return true;
}
//outbound Bottom
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
return false;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
});
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
int act = event.getAction();
if ((act == MotionEvent.ACTION_UP || act == MotionEvent.ACTION_CANCEL)
&& outBound) {
outBound = false;
//scroll back
}
if (!mGestureDetector.onTouchEvent(event)) {
outBound = false;
} else {
outBound = true;
}
return super.dispatchTouchEvent(event);
}
}
实现过度滑动,item跟随手势的代码是这一段:
int firstPos = getFirstVisiblePosition();
int lastPos = getLastVisiblePosition();
int itemCount = getCount();
if (outBound && firstPos != 0
&& lastPos != (itemCount - 1)) {
scrollTo(0, 0);
return false;
}
View firstView = getChildAt(firstPos);
if (!outBound)
firstOut = (int) e2.getRawY();
if (firstView != null && (outBound ||
(firstPos == 0 && firstView.getTop() == 0 && distanceY < 0))){
distance = firstOut - (int) e2.getRawY();
scrollTo(0, distance/2);
return true;
}
scrollTo(0, distance/2);使得item只是过度滑动你所滑动距离的一半,这样更美观。
而实现弹性滑动的基本思路就是滑动回去加个时间。
代码如下:
Rect rect = new Rect();
getLocalVisibleRect(rect);
TranslateAnimation am = new TranslateAnimation( 0, 0, -rect.top, 0);
am.setDuration(300);
startAnimation(am);
scrollTo(0, 0);
这个代码是从项目中摘出的。只有上面的弹性滑动,下边部分其实一样。
显示效果如下
看别人的代码往往会给自己带来一些思路,然后自己去研究,以上的思路可以应用与Gridview,我这里实现Gridview的弹性滑动是没有问题的。我目前遇到的一个问题就是ScrollView的弹性滑动问题。看了很长时间的ScrollView的源码,但是没有太好的思路,主要是在显示部分的坐标拿不到,不像ListView里可以通过getFirstVisiblePosition()这样一个方法来拿到item的位置,继而拿到item,ScrollView中只有一个子控件。他的滑动实现貌似跟ListView,Gridview这些采用Adapter的不一样。在研究中,哪位兄台如果知道其中原来,还请告知一声。
- 大小: 28 KB
分享到:
相关推荐
android在2.3版本以后提供了一个弹性滑动的实现,但是在2.3以下的版本中如何实现,网上的所有的例子基本上都是一个模板,完全复制粘贴,而且那个例子只实现了顶部回弹,还有部分BUG未修复,因此我在原例的基础上修改...
例如,可以使用ObjectAnimator来平滑地改变删除按钮的位置,或者使用ValueAnimator来控制滑动速度和弹性效果。 总的来说,实现ListView中Item左滑显示删除按钮涉及多个步骤,包括自定义ListView、滑动布局设计、...
这个“简单的listview弹性效果”项目就是为了实现这样的功能,同时确保在不同分辨率的手机上都能正常工作。 首先,我们要理解ListView的工作原理。ListView通过复用视图(ViewHolder)来提高性能,当用户滚动时,只...
本文将深入探讨“具有弹性的ListView”,这是一种通过增强ListView的功能,使其在滑动到顶部或底部时产生弹性效果,增加用户体验的特殊实现。 首先,我们需要理解ListView的基本原理。ListView通过Adapter来绑定...
本文将深入探讨如何实现“弹性拉伸”的ScrollView、在ScrollView中嵌套ListView以及添加ScrollView的滑动监听。这些技巧在创建复杂的用户界面时非常实用。 首先,让我们谈谈“弹性拉伸”效果的ScrollView。这种效果...
另外,滑动界面和内嵌ListView可能需要自定义滚动行为,这时可以使用Scroller或OverScroller组件来实现弹性滑动和物理反弹效果。Scroller并不直接处理触摸事件,而是计算出滑动动画的效果,并提供给ViewGroup在绘制...
然而,要实现一个弹性的ListView,即所谓的Pull to Refresh(下拉刷新)和Load More(上拉加载更多)功能,可能会遇到一些挑战,尤其是在处理用户快速交互时。根据描述,这里遇到的问题是在快速上拉或下拉操作后,...
标题"ListView添加弹性头部"意味着我们要探讨如何为ListView添加一个可伸缩、有弹性的头部视图,这种效果常见于下拉刷新的设计中,用户上滑时头部放大或显示动画,给人一种交互上的趣味性。以下我们将详细介绍如何...
- **属性动画**:如果需要更精细的控制,如滑动速度、弹性效果等,可以使用ValueAnimator或ObjectAnimator。通过监听动画的更新回调,改变View的位置。 4. **状态判断**:为避免重复应用动画,需要检查当前项是否...
总的来说,这个资源提供了一个学习和实践Android ListView弹性刷新效果的机会。通过研究和修改"RefreshDemo"项目,开发者可以更好地理解滑动事件处理、自定义视图动画以及如何与ListView的滚动状态交互。对于想要...
标签"Flabby"暗示了这种ListView的特性,它可能意味着开发者需要在代码中添加一些弹性效果,比如使用弹簧物理模型来模拟物体的弹性运动。这通常需要计算每个Item的重力、张力和摩擦力等参数,并根据这些参数更新Item...
其次,弹性ListView的实现可能涉及到对滑动手势的监听和处理。开发者需要监听MotionEvent,当用户滑动列表时,根据滑动的速度和方向来调整ListView的滚动速度和位置。此外,还需要考虑边界条件,当列表滚动到顶部或...
- **自定义ListView**:要实现弹性效果,我们需要创建一个继承自ListView的自定义组件,并重写onTouchEvent()方法,以捕获用户的滑动事件,然后调用OverScroller的fling()方法来启动弹性滚动。 3. **...
以下将详细介绍两种在Android中实现ListView弹性效果的方法。 ### 第一种方法:动态改变`overScrollBy`参数 这种方法的核心是在`overScrollBy`方法中动态调整`maxOverScrollY`的值。`overScrollBy`是ListView处理...
本篇将深入探讨如何在Android中实现ListView的3D弹性滚动,即Fling效果。 首先,要理解3D效果的本质,它通常是通过改变ListView项的透明度、大小或位置来模拟深度感。在Android中,我们可以通过自定义Adapter和...
6. **使用BounceView**:此开源项目提供了新的解决方案,它增强了默认的滑动体验,增加了弹性回弹效果,同时解决了滑动冲突。BounceView可能是通过自定义手势检测和事件分发机制来实现这一目标的。 7. **避免不必要...
这篇博文“有弹性的ScrollView&ListView&HorizontalScrollView”似乎探讨了如何为这些视图添加弹性效果,使滚动体验更加流畅和有趣。弹性滚动效果通常是通过模拟物理世界的回弹效果来实现的,它能让用户在到达视图...
这种效果在iOS中的UIScrollView中被称为“弹性滑动”或“回弹效果”,在Android中则可以自定义实现。 "带阻尼效果的listview"是通过在ListView的滚动过程中添加一个模拟真实世界阻力的算法来实现的。这种效果不仅...
本教程将聚焦于如何手工编写一个弹性下拉刷新的ListView,仅用100行代码即可实现这一功能。了解并掌握这个过程不仅有助于提升开发者对Android UI组件的理解,还能提高代码复用性。 首先,我们需要创建一个自定义的...
这个特性常见于iOS的UI设计,当用户快速滑动ListView到达顶部或底部时,内容会有一个短暂的回弹效果,仿佛具有物理弹性。在Android中实现这种效果,通常需要自定义滚动监听器,检测滑动的速度和方向。当达到边界时,...