文档章节

Android 实现ListView的弹性效果

yolinfeng
 yolinfeng
发布于 2015/06/09 15:42
字数 609
阅读 97
收藏 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;
	}
}


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






本文转载自:http://blog.csdn.net/eastman520/article/details/19043973

yolinfeng
粉丝 12
博文 196
码字总数 11946
作品 0
珠海
架构师
私信 提问
【压岁干货】精彩技术博客+优秀源码集锦

虽然2015年已经过了一月有余,但在中国,好像只有过了春节才算进入新的一年。眼看着这也春节倒计时了,大家好像又都忙了起来,赶项目赶项目…… 从DevStore整理了一些优秀的技术博客和源码作...

牵着蜗牛去西藏
2015/02/04
1K
4
android listview仿iphone特效 弹性listview

ios常见视图在顶部往下拉(下冲)或底部往上拉(上冲)有一个弹性回退的动画效果。著名的CM ROM和一些手机厂商也争相集成这种效果。android 从2.3开始实现了下冲到底部和上冲到顶部时颜色渐变动画...

少年追梦
2015/07/14
117
0
android中的selector背景选择器

关于listview和button都要改变android原来控件的背景,在网上查找了一些资料不是很全,所以现在总结一下android的selector的用法。 首先android的selector是在drawable/xxx.xml中配置的。 先...

泡泡爸爸
2013/03/17
117
0
《IT蓝豹》listview实现各种版面设计功能

本项目主要listview实现各种版面设计功能,有实现列表的,gridview效果的,有混排效果的等等。 自定义TwoWayView继承RecyclerView,通过TwoWayView去根据布局实现到底选择哪一个效果, 本项目...

抉择很难
2015/11/11
55
0
android的selector(背景选择器)

最近做listview和button都要改变Android原来控件的背景,在网上查找了一些资料不是很全,所以现在总结一下android的selector的用法。 首先android的selector是在drawable/xxx.xml中配置的。 ...

z.net
2012/11/05
90
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员云计算教程分享Linux云计算面试常见问题三

  好程序员云计算教程分享Linux云计算面试常见问题三,今天将在前两篇的基础上,继续为大家带来Linux云计算面试题。   1、虚拟化平台在实施云时有何要求?   虚拟化平台在实施云时的要求...

好程序员官网
1分钟前
0
0
什么是CAS机制?

我们先看一段代码: 启动两个线程,每个线程中让静态变量count循环累加100次。 最终输出的count结果一定是200吗?因为这段代码是非线程安全的,所以最终的自增结果很可能会小于200。我们再加...

天子剑毅
4分钟前
1
0
CSS 中的Grid 网格布局

Can I Use 的兼容: https://www.caniuse.com/#search=grid 原文阮一峰老师: http://www.ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html...

蓝小驴
4分钟前
1
0
哪些方面可以看出企业建站源码质量?

源代码是构成网站的核心,即网站程序代码,包括网站文件及目录结构,拥有源代码才拥有网站的全部。传统自助建站因其SAAS模式无法开放源代码,用户实质上是每年支付租金租用放在平台网站的使用...

victron
15分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部