Android ListView弹性效果的实现方法

关于在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弹性效果的实现方法,整理出来,希望对大家有所帮助!