Android ListView 删除动画

Android 的ListView在删除时,被删除的项目直接消失,比较生硬,在此实现一下删除动画,大家一起探讨;

以下是Activity代码;主界面只有一个ListView,通过Adapter提供数据,界面如下,当点击某一项时,将播放动画,并删除点击的项目;

package app.com.listviewdeleteanimation;

import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;

public class MainActivity extends ActionBarActivity implements ListView.OnItemClickListener{    /**      *  Adapter 提供数据,提供remove方法,可以删除指定的条目;      *      **/
    public class Adapter extends BaseAdapter{
        private Context mContext;
        private ArrayList<String> mItems;

        public Adapter(Context c,String [] data) {
            super();

            mContext = c;

            mItems = new ArrayList<String>();
            for (String item : data){
                mItems.add(item);
            }
        }

        public void remove(int position){
            if(position < mItems.size()){
                mItems.remove(position);
            }

            notifyDataSetChanged();
        }

        @Override
        public int getCount() {
            return mItems.size();
        }

        @Override
        public int getItemViewType(int position) {
            // current menu type
            return position;
        }

        @Override
        public String getItem(int position) {
            return mItems.get(position);
        }

        @Override
        public boolean isEmpty() {
            return mItems.isEmpty();
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = LayoutInflater.from(mContext).inflate(
                        android.R.layout.simple_list_item_1, parent, false);
            }

            TextView tv = (TextView) convertView;

            tv.setText(getItem(position));

            return convertView;
        }
    }

    private ListView mListView;
    private Adapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mListView = (ListView)findViewById(R.id.listView);

        mAdapter = new Adapter(this, new String[] {"1","2","3","4","5","6","7",});

        mListView.setAdapter(mAdapter);
        mListView.setOnItemClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, final int position, long id){        // 获得ListView第一个View的position
        int firstVisiblePosition = mListView.getFirstVisiblePosition();        // 存储所有的Animator,利用AnimatorSet直接播放
        ArrayList<Animator> animators = new ArrayList<Animator>();
     // 获得要删除的View
        View itemToDelete = mListView.getChildAt(position - firstVisiblePosition);

        int viewHeight = itemToDelete.getHeight();
        int dividerHeight = mListView.getDividerHeight();

        ObjectAnimator hideAnimator = ObjectAnimator.ofFloat(itemToDelete, "alpha",1f, 0f);

        animators.add(hideAnimator);

        int delay = 0;
        int firstViewToMove = position + 1;
        for (int i=firstViewToMove;i < mListView.getChildCount(); ++i){
            View viewToMove = mListView.getChildAt(i);

            ObjectAnimator moveAnimator = ObjectAnimator.ofFloat(viewToMove, "translationY", 0, -dividerHeight-viewHeight);
            moveAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
            moveAnimator.setStartDelay(delay);

            delay += 100;

            animators.add(moveAnimator);
        }

        AnimatorSet set = new AnimatorSet();
        set.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {}
            @Override
            public void onAnimationEnd(Animator animation) {
                mAdapter.remove(position);
                // 动画结束后,恢复ListView所有子View的属性
                for (int i=0;i<mListView.getChildCount();++i){
                    View v = mListView.getChildAt(i);

                    v.setAlpha(1f);
                    v.setTranslationY(0);
                }

            }
            @Override
            public void onAnimationCancel(Animator animation) {}
            @Override
            public void onAnimationRepeat(Animator animation) {}
        });

        set.playTogether(animators);
        set.start();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
时间: 2024-08-07 00:13:31

Android ListView 删除动画的相关文章

给Android ListView添加删除item动画

给Android ListView添加删除item动画 给listview删除一个item的时候加上一个折叠动画,感觉效果会好一点. 步骤是当删除一个view,先用动画把view的高度改变,看上去就是折叠的效果.当动画完成的时候,再真正把item移除. private void deletePattern(final View view, final int position) { Animation.AnimationListener al = new Animation.AnimationL

Android ListView动画特效实现原理及源码

Android 动画分三种,其中属性动画为我们最常用动画,且能满足项目中开发几乎全部需求,google官方包支持3.0+,我们可以引用三方包nineoldandroids来失陪到低版本.本例子中就是用属性动画实现效果. 对普通的View做动画,我们只要定义好要的动画ObjectAnimator或AnimatorSet,然后设置属性启动及可.但是,对ListView做动画应该如何.什么时候.在什么地方.对哪个View做动画属性呢? github上有成熟的listview动画包 https://gi

Android ListView动画特效实现原理及源代码

Android 动画分三种,当中属性动画为我们最经常使用动画,且能满足项目中开发差点儿所有需求,google官方包支持3.0+.我们能够引用三方包nineoldandroids来失陪到低版本号.本样例中就是用属性动画实现效果. 对普通的View做动画,我们仅仅要定义好要的动画ObjectAnimator或AnimatorSet.然后设置属性启动及可. 可是.对ListView做动画应该怎样.什么时候.在什么地方.对哪个View做动画属性呢? github上有成熟的listview动画包 http

精通RecyclerView:打造ListView、GridView、瀑布流;学会添加分割线、 添加删除动画 、Item点击事件

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53126706 本文出自[DylanAndroid的博客] 精通RecyclerView:打造ListView.GridView.瀑布流:学会添加分割线. 添加删除动画 .Item点击事件 在上一篇Android用RecyclerView练手仿美团分类界面写了RecyclerView的基本用法, 今天想想,在这里重新学习一下RecyclerView的完整用法.包括如何打造一个普

Android ListView动画实现方法

在Android中listview是最常用的控件之一,但是有时候我们会觉得千篇一律的listview看起来过于单调,于是就产生了listView动画,listview加载了动画会让用户体验更好,本期就分享一些listview动画以及实现方法,效果图 相信大家都熟悉Android的Tween动画,前四种动画就是Translate,Alpha,Rotate,Scale,最后一种Rotate3d则是用了一个3D旋转动画工具类Rotate3dAnimation,这个类的构造函数中接收一些3D旋转时所需用

android ListView内数据的动态添加与删除

main.xml 文件: [java] view plaincopy <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height=&q

Android ListView复制、删除的实现

适配器MyAdapter: package com.zihao.adapter; import java.util.List; import com.zihao.popdemo.R; import com.zihao.util.TextManager; import android.content.Context; import android.graphics.drawable.BitmapDrawable; import android.view.Gravity; import androi

Android ListView Animation 布局动画

AnimationSet set = new AnimationSet(false); Animation animation = new AlphaAnimation(0,1); //AlphaAnimation 控制渐变透明的动画效果 animation.setDuration(500); //动画时间毫秒数 set.addAnimation(animation); //加入动画集合 animation = new TranslateAnimation(1, 13, 10, 50); //S

Android ListView Animation 4种动画效果(贴上了GIF图)

Animation是android的动画效果的组件,可以实现绚丽的翻页.ListView和GridView的展示. 这blog简单介绍一下4种动画效果方式: 1.  AlphaAnimation               控制渐变透明的动画效果    如图: 2.  ScaleAnimation               控制尺寸伸缩的动画效果 如图: 3.  TranslateAnimation        控制画面平移的动画效果  如图: 4.  RotateAnimation