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


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






  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值