您的位置:首页 > 移动开发 > Android开发

Android listview item删除动画和item排序动画

2017-06-13 21:41 1016 查看


我明明是正着录得,但截取gif动画就变成倒着了,大家凑活看吧.

今天讲的就是上面动画所演示的,listview删除item和上下item进行交换的动画.我们有时候listview会执行删除item的操作,但是如果没有动画就会显得很突兀,用户体验非常不好,因此,我们删除item的时候可以加个动画效果,这样看上去就顺眼多了.不多说,上代码

首先,我们看一下删除动画:

private AnimatorSet getDeleteAnimation(int position){

// 存储所有的Animator,利用AnimatorSet直接播放
ArrayList<Animator> animators = new ArrayList<Animator>();
//获取显示的一个view的position
int firstVisiblePosition = mListView.getFirstVisiblePosition();
View deleteView = mListView.getChildAt(position - firstVisiblePosition);
int viewHeight = deleteView.getHeight();
int viewWidth = deleteView.getWidth();
//平移动画
ObjectAnimator translationXAnimator = ObjectAnimator.ofFloat(deleteView, "translationX", viewWidth);
translationXAnimator.setDuration(500);
animators.add(translationXAnimator);

//透明动画
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(deleteView, "alpha", 1, 0);
alphaAnimator.setDuration(500);
animators.add(alphaAnimator);

int delay = 500;
int firstViewToMove = position + 1;
for (int i=firstViewToMove;i < mListView.getChildCount(); ++i){
View viewToMove = mListView.getChildAt(i);
ObjectAnimator moveAnimator = ObjectAnimator.ofFloat(viewToMove, "translationY", 0,  - viewHeight);
moveAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
moveAnimator.setStartDelay(delay);

delay += 100;

animators.add(moveAnimator);
}
//动画集合
AnimatorSet animationSet = new AnimatorSet();
animationSet.playTogether(animators);

return animationSet;

}


如果你比较熟悉属性动画,那么上面代码没什么你应该能看得懂,如果不明白的话,你也可以去学学关于属性动画的文章,不需要太深入,稍微了解你就能看的懂了.当我们进行删除操作的时候,就可以启动动画了

viewHolder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AnimatorSet animatorSet = getDeleteAnimation(position);
animatorSet.start();
animatorSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {

}

@Override
public void onAnimationEnd(Animator animation) {
remove(position);
// 动画结束后,恢复ListView所有子View的属性
for (int i=0; i<mListView.getChildCount() ;++i){
View v = mListView.getChildAt(i);
v.setAlpha(1f);
v.setTranslationY(0);
v.setTranslationX(0);
}
}

@Override
public void onAnimationCancel(Animator animation) {

}

@Override
public void onAnimationRepeat(Animator animation) {

}
});
}

});


remove方法:

private void remove(int position){
if (position < mModelLists.size()){
mModelLists.remove(position);
}
this.notifyDataSetChanged();
}


这样就可以实现item删除动画

接下来,我们要实现item移动动画,动画代码:

private AnimatorSet changePositionAnimation(int position, int type){
// 存储所有的Animator,利用AnimatorSet直接播放
ArrayList<Animator> animators = new ArrayList<Animator>();
//获取显示的一个view的position
int firstVisiblePosition = mListView.getFirstVisiblePosition();
View moveView = mListView.getChildAt(position - firstVisiblePosition);
int viewHeight = moveView.getHeight();
int viewWidth = moveView.getWidth();
AnimatorSet animatorSet = new AnimatorSet();

if (type == 1){//向下移动
View upView = mListView.getChildAt(position - firstVisiblePosition + 1);
ObjectAnimator objectAnimatorUp = ObjectAnimator.ofFloat(upView, "translationY", -viewHeight);
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(moveView, "translationY", viewHeight);
animators.add(objectAnimator);
animators.add(objectAnimatorUp);
}else if (type == 2){//向上移动
View downView = mListView.getChildAt(position - firstVisiblePosition - 1);
ObjectAnimator objectAnimatorDow = ObjectAnimator.ofFloat(downView, "translationY", viewHeight);
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(moveView, "translationY", -viewHeight);
animators.add(objectAnimator);
animators.add(objectAnimatorDow);
}

animatorSet.setDuration(300);
animatorSet.playTogether(animators);

return animatorSet;
}


向上移动点击事件:

viewHolder.takeUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AnimatorSet animatorSet = changePositionAnimation(position, 2);
animatorSet.start();
animatorSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {

}

@Override
public void onAnimationEnd(Animator animation) {
remove(position);
insertItem(albumImage, position - 1);
for (int i=0; i<mListView.getChildCount() ;++i){
View v = mListView.getChildAt(i);
v.setTranslationY(0);
}
}

@Override
public void onAnimationCancel(Animator animation) {

}

@Override
public void onAnimationRepeat(Animator animation) {

}
});

}
});


向下移动点击事件:

//下一个
viewHolder.takeDown.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AnimatorSet animatorSet = changePositionAnimation(position, 1);
animatorSet.start();
animatorSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {

}

@Override
public void onAnimationEnd(Animator animation) {
remove(position);
insertItem(albumImage, position + 1);
for (int i=0; i<mListView.getChildCount() ;++i){
View v = mListView.getChildAt(i);
v.setTranslationY(0);
}
}

@Override
public void onAnimationCancel(Animator animation) {

}

@Override
public void onAnimationRepeat(Animator animation) {

}
});
}
});


insertItem方法:

private void insertNext(HexAlbumImage image, int to){
mModelLists.add(to, image);
this.notifyDataSetChanged();
}


通过上述代码,我们就可以实现item动画了,如果有什么问题可以问我哦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: