http://hemowolf.iteye.com/blog/1181065
ios常见视图在顶部往下拉(下冲)或底部往上拉(上冲)有一个弹性回退的动画效果。著名的cm rom和一些手机厂商也争相集成这种效果。android 从2.3开始实现了下冲到底部和上冲到顶部时颜色渐变动画效果。这种在iphone中经典的特效在一定程度上满足了android迷们追逐体验的需求。下面我们来探讨实现这种效果的思路和实现锥形。
view类有两个很重要的方法scrollto和scrollby,允许移动视图的可见区域。这就是我们今天实现动画效果的理论基础,我们可以在android数据列表顶部往下拖动列表或底部往上拖动列表时相应的移动数据列表,当停止拖动时再让它弹回去。那么怎么才能知道在顶端和底部呢?请查阅listview的相关资料。具体的原理讲完了上代码。
java代码

package com.droidwolf;
import android.content.context;
import android.util.attributeset;
import android.view.motionevent;
import android.widget.listview;
//by droidwolf 转载请注明
public class iplistview extends listview implements runnable {
private float mlastdowny = 0f;
private int mdistance = 0;
private int mstep = 10;
private boolean mpositive = false;
public iplistview(context context, attributeset attrs) {
super(context, attrs);
}
public iplistview(context context, attributeset attrs, int defstyle) {
super(context, attrs, defstyle);
public iplistview(context context) {
super(context);
@override
public boolean ontouchevent(motionevent event) {
switch (event.getaction()) {
case motionevent.action_down:
if (mlastdowny == 0f && mdistance == 0) {
mlastdowny = event.gety();
return true;
}
break;
case motionevent.action_cancel:
case motionevent.action_up:
if (mdistance != 0) {
mstep = 1;
mpositive = mdistance >= 0;
this.post(this);
mlastdowny = 0f;
mdistance = 0;
case motionevent.action_move:
if (mlastdowny != 0f) {
mdistance = (int) (mlastdowny - event.gety());
if ((mdistance < 0 && getfirstvisibleposition() == 0 && getchildat(0).gettop() == 0)
|| (mdistance > 0 && getlastvisibleposition() == getcount() - 1)) {
mdistance /= 2;
scrollto(0, mdistance);
return true;
return super.ontouchevent(event);
public void run() {
mdistance += mdistance > 0 ? -mstep : mstep;
scrollto(0, mdistance);
if ((mpositive && mdistance <= 0) || (!mpositive && mdistance >= 0)) {
scrollto(0, 0);
return;
mstep += 1;
this.postdelayed(this, 10);
}// end class
iplistview实现的动画只是简单的回退效果,也没有实现上冲和下冲特效,具体实现留给您去完善吧~~
iplistview.rar (39.7 kb)
下载次数: 216