给Android ListView添加删除item动画
2016-05-12 21:14
519 查看
给listview删除一个item的时候加上一个折叠动画,感觉效果会好一点。
步骤是当删除一个view,先用动画把view的高度改变,看上去就是折叠的效果。当动画完成的时候,再真正把item移除。
做法大概分为两种,补间动画、属性动画
1:补间动画
![](http://git.oschina.net/nov_eleven/photo/raw/master/listview.gif)
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;
}
步骤是当删除一个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); }
![](http://git.oschina.net/nov_eleven/photo/raw/master/listview.gif)
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;
}
相关文章推荐
- Android -- 初探MVP模式
- AndroidTextview跑马灯横向滚动
- Android应用的界面编程
- Android的单位和尺寸
- Android 真机调试 LogCat不显示VERBOSE、DEBUG的日志信息
- Fresco 专为ANDROID加载图片(简单使用)
- Android学习笔记-常见报错
- android:EditText控制首字母不能输0
- [转]Android Context应用上下文详解
- Android开发 状态栏沉浸
- Android学习笔记六:SQLite使用
- Android.mk
- Android重写返回按钮退回桌面(根据源码查看)
- Android实现高仿QQ附近的人搜索展示
- Android GestureDetector方法详解
- AndroidAnnotation常用注解使用说明
- Android的编程初体验--布局管理器
- Android 线程创建与销毁
- android animation——动画的基本属性
- 关于Android事件派发流程的理解