给listview删除一个item的时候加上一个折叠动画,感觉效果会好一点。
步骤是当删除一个view,先用动画把view的高度改变,看上去就是折叠的效果。当动画完成的时候,再真正把item移除。
做法大概分为两种,补间动画、属性动画
1:补间动画
private void deletePattern(final View view, final int position) {
Animation.AnimationListener al = new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
mDBHelper.deleteCustomPattern(mPatternList.get(position));
mPatternList.remove(position);
mPatternAdapter.notifyDataSetChanged();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
};
collapse(view, al);
}
private void collapse(final View view, Animation.AnimationListener al) {
final int originHeight = view.getMeasuredHeight();
Animation animation = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if (interpolatedTime == 1.0f) {
view.setVisibility(View.GONE);
} else {
view.getLayoutParams().height = originHeight - (int) (originHeight * interpolatedTime);
view.requestLayout();
}
}
@Override
public boolean willChangeBounds() {
return true;
}
};
if (al != null) {
animation.setAnimationListener(al);
}
animation.setDuration(300);
view.startAnimation(animation);
}
2:属性动画
- public static AnimatorSet buildListRemoveAnimator(final View view, final List list,
- final MyAnimListAdapter adapter, final int index) {
- AnimatorListener al = new AnimatorListener() {
- @Override
- public void onAnimationStart(Animator animation) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onAnimationRepeat(Animator animation) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onAnimationEnd(Animator animation) {
- // TODO Auto-generated method stub
- list.remove(index);
- ViewHolder vh = (ViewHolder) view.getTag();
- vh.needInflate = true;
- adapter.notifyDataSetChanged();
- }
- @Override
- public void onAnimationCancel(Animator animation) {
- // TODO Auto-generated method stub
- }
- };
- AnimatorSet animatorSet = new AnimatorSet();
- Animator anim = ObjectAnimator.ofFloat(view, "rotationX", 0, 90);
- Animator animb = ObjectAnimator.ofFloat(view, "alpha", 1, 0);
- ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
- final int height = view.getMeasuredHeight();
- valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- // TODO Auto-generated method stub
- if (animation.getAnimatedFraction() >= 1) {
- view.setVisibility(View.GONE);
- }
- else {
- view.getLayoutParams().height = height
- - (int) (height * animation.getAnimatedFraction());
- view.requestLayout();
- }
- }
- });
- anim.setDuration(ANIMATION_DURATION);
- animb.setDuration(ANIMATION_DURATION);
- valueAnimator.setDuration(ANIMATION_DURATION + ANIMATION_DURATION + 100);
- animatorSet.playTogether(anim, animb, valueAnimator);
- animatorSet.addListener(al);
- return animatorSet;
- }