拉动ListView,Item之间的间距会变大,释放后恢复原样;
package cn.tangdada.tangbang.widget;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.animation.AccelerateInterpolator;
import android.widget.AbsListView;
import android.widget.ListView;
import cn.tangdada.tangbang.R;
import com.nineoldandroids.view.ViewPropertyAnimator;
/**
* 当滑动到顶部和底部时,实现Item的分离效果。
*
* @author pythoner
*
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class PullSeparateListView extends ListView
{
/**
* 最大滑动距离
*/
private static final float MAX_DELTAY = 100;
/**
* 分离后恢复的动画时长
*/
private static final long SEPARATE_RECOVER_DURATION = 200;
/**
* 摩擦系数
*/
private static final float FACTOR = 0.25f;
/**
* 按下x的缩放比例
*/
private static final float SCALEX = 1.0f;
/**
* 按下y的缩放比例
*/
private static final float SCALEY = 1.0f;
/**
* 展开全部
*/
private boolean separateAll;
/**
* 到达边界时,滑动的起始位置
*/
private float startY;
/**
* 按下时的View
*/
private View downView;
private int touchSlop;
private boolean separate = false;
private boolean showDownAnim;
/**
* 原始按下位置(在所有Item中的位置)
*/
private int originDownPosition;
/**
* 按下的位置(在屏幕中的位置)
*/
private int downPosition;
/**
* 上次滑动的位置,用于判断方向
*/
private float preY;
private float deltaY;
private boolean reachTop, reachBottom, move;
private OnScrollListener mScrollListener;
public PullSeparateListView(Context context, AttributeSet attrs)
{
super(context, attrs);
TypedArray t = context.obtainStyledAttributes(attrs, R.styleable.PullSeparateListView);
separateAll = t.getBoolean(R.styleable.PullSeparateListView_separate_all, false);
showDownAnim = t.getBoolean(R.styleable.PullSeparateListView_showDownAnim, true);
t.recycle();
init();
}
public PullSeparateListView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
}
public PullSeparateListView(Context context)
{
super(context);
init();
}
@SuppressWarnings("deprecation")
private void init()
{
// 不知道怎么让divider和selector和Item一起移动,所以去除,需要自己加分割线
this.setDivider(null);
this.setSelector(new BitmapDrawabl