Android ListView弹性效果的实现方法

所属分类: 软件编程 / Android 阅读数: 705
收藏 0 赞 0 分享

关于在Android中实现ListView的弹性效果,有很多不同的方法,网上一搜,也有很多,下面贴出在项目中经常用到的两种实现ListView弹性效果的方法(基本上拿来就可以用),供大家参考:

第一种比较简单,好容易理解,只是动态改变了ListView在Y轴上的可移动距离,代码如下:

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.DisplayMetrics; 
import android.widget.ListView; 
/** 
 * 弹性ListView。 
 * @author E 
 */ 
public class FlexiListView extends ListView{ 
  //初始可拉动Y轴方向距离 
  private static final int MAX_Y_OVERSCROLL_DISTANCE = 100; 
  //上下文环境 
  private Context mContext; 
  //实际可上下拉动Y轴上的距离 
  private int mMaxYOverscrollDistance; 
   
  public FlexiListView(Context context){ 
    super(context); 
    mContext = context; 
    initBounceListView(); 
  } 
   
  public FlexiListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mContext = context; 
    initBounceListView(); 
  } 
   
  public FlexiListView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    mContext = context; 
    initBounceListView(); 
  } 
   
  private void initBounceListView(){ 
    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) {  
    //实现的本质就是在这里动态改变了maxOverScrollY的值 
    return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent);  
  } 
   
} 

第二种方法,结合了手势来实现ListView的弹性效果,这里可以根据手势来进行更多的扩展,代码如下:

import android.content.Context; 
import android.graphics.Rect; 
import android.util.AttributeSet; 
import android.view.GestureDetector; 
import android.view.GestureDetector.OnGestureListener; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.animation.TranslateAnimation; 
import android.widget.ListView; 
/** 
 * 具有弹性效果的ListView。主要是实现父类dispatchTouchEvent方法和OnGestureListener中onScroll方法。 
 * @author E 
 */ 
public class FlexibleListView extends ListView implements OnGestureListener{ 
   
  private Context context = null; 
  private boolean outBound = false; 
  private int distance; 
  private int firstOut; 
   
  public FlexibleListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this.context = context; 
  } 
   
  public FlexibleListView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    this.context = context; 
  } 
   
  public FlexibleListView(Context context) { 
    super(context); 
    this.context = context; 
  } 
   
  GestureDetector lisGestureDetector = new GestureDetector(context, this); 
   
  @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 (!lisGestureDetector.onTouchEvent(event)) { 
      outBound = false; 
    } else { 
      outBound = true; 
    } 
    Rect rect = new Rect();  
    getLocalVisibleRect(rect);  
    TranslateAnimation am = new TranslateAnimation( 0, 0, -rect.top, 0);  
    am.setDuration(300);  
    startAnimation(am);  
    scrollTo(0, 0); 
    return super.dispatchTouchEvent(event); 
  } 
 
  @Override 
  public boolean onDown(MotionEvent e) { 
    return false; 
  } 
 
  @Override 
  public void onShowPress(MotionEvent e) { 
  } 
 
  @Override 
  public boolean onSingleTapUp(MotionEvent e) { 
    return false; 
  } 
 
  @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; 
  } 
} 

以上两种常用Android ListView弹性效果的实现方法,整理出来,希望对大家有所帮助!

更多精彩内容其他人还在看

Retrofit2日志拦截器的使用

这篇文章主要介绍了Retrofit2日志拦截器的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android创建外部lib库及自定义View的图文教程

这篇文章主要给大家介绍了关于Android创建外部lib库及自定义View的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android分享微信小程序失败的一些事小结

这篇文章主要给大家介绍了关于Android分享微信小程序失败一些事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android分享微信小程序技巧之图片优化

这篇文章主要给大家介绍了关于Android分享微信小程序技巧之图片优化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android Viewpager实现无限循环轮播图

这篇文章主要为大家详细介绍了Android Viewpager实现无限循环轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中的Bitmap序列化失败的解决方法

这篇文章主要介绍了Android中的Bitmap序列化失败的解决方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Android自定义通用标题栏CustomTitleBar

这篇文章主要为大家详细介绍了Android自定义通用标题栏CustomTitleBar,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android组合控件自定义标题栏

这篇文章主要为大家详细介绍了Android组合控件自定义标题栏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义复合控件实现通用标题栏

这篇文章主要为大家详细介绍了Android自定义复合控件实现通用标题栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

ExpandableListView实现简单二级列表

这篇文章主要为大家详细介绍了ExpandableListView实现简单二级列表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多