您的位置:首页 > 移动开发 > Android开发

Android中实现ListView的弹性效果

2016-08-04 11:09 267 查看
关于在Android中实现ListView的弹性效果,有很多不同的方法,网上一搜,也有很多,下面贴出在项目中经常用到的两种实现ListView弹性效果的方法(基本上拿来就可以用),供大家参考:
     第一种比较简单,好容易理解,只是动态改变了ListView在Y轴上的可移动距离,代码如下:

[java]
view plain
copy





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的弹性效果,这里可以根据手势来进行更多的扩展,代码如下:

[java]
view plain
copy





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;  
    }  
}  

     以上两种常用的实现方法,整理出来,希望对大家有所帮助!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: