场景:删除某一项Item后,上部分保持不动,下部分依次往上移直至合并.
(总的来说:给LV的Item加动画都是在getView的方法里设定好的)
首先我们要一个依次往上位移的动画
①首先设置一个AnimationListener , 当动画结束之后刷新数据
/**
* @param v ListView中的Item
* @param index 当前Item的索引
*/
private void deleteCell(final View v, final int index) {
AnimationListener al = new AnimationListener() {
@Override
public void onAnimationEnd(Animation arg0) {
mAnimList.remove(index);
ViewHolder vh = (ViewHolder)v.getTag();
vh.needInflate = true;
mMyAnimListAdapter.notifyDataSetChanged();
}
@Override public void onAnimationRepeat(Animation animation) {}
@Override public void onAnimationStart(Animation animation) {}
};
collapse(v, al);
}
②自定义一个动画,自定义动画需要重写applyTransformation方法, 关于自定义动画的有参考:http://blog.youkuaiyun.com/startfromweb/article/details/7644405
interpolatedTime会从0.0增大到1.0
只要开始了动画,且interpolatedTime只要没减到0则此方法会一直运行
这个就是实现逐渐位移往上的关键
* @param v ListView的Item
* @param al 设置好的Animation
*/
private void collapse(final View v, AnimationListener al) {
final int initialHeight = v.getMeasuredHeight();
Animation anim = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if (interpolatedTime == 1) {
v.setVisibility(View.GONE);
}
else {
v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
v.requestLayout();
}
}
@Override
public boolean willChangeBounds() {
return true;
}
};
if (al!=null) {
anim.setAnimationListener(al);
}
anim.setDuration(ANIMATION_DURATION);
v.startAnimation(anim);
}