ListView添加加载动画

    我们总喜欢探索一些新功能,有人问:做这个有什么用呢?我们总不愿我们的工作那么枯燥,给自己调剂一下也好。
    不录制效果了(主要电脑不给力…)

    ListView添加子项动画无非是在适配器里面动手脚,那么ListView里面添加数据的过程大家是知道的,但是这里我还是要贴出来,方便大家粘贴,下面给出Activity的代码。

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        List<Drawable> drawables = new ArrayList<>();
        drawables.add(getResources().getDrawable(R.drawable.pic1));
        drawables.add(getResources().getDrawable(R.drawable.pic2));
        drawables.add(getResources().getDrawable(R.drawable.pic3));
        drawables.add(getResources().getDrawable(R.drawable.pic4));
        drawables.add(getResources().getDrawable(R.drawable.pic5));
        drawables.add(getResources().getDrawable(R.drawable.pic6));
        drawables.add(getResources().getDrawable(R.drawable.pic7));
        drawables.add(getResources().getDrawable(R.drawable.pic8));
        drawables.add(getResources().getDrawable(R.drawable.pic9));

        ListView listView = (ListView) findViewById(R.id.list);
        ListAdapter adapter = new ListAdapter(this, listView, drawables, 300);
        listView.setAdapter(adapter);
    }

}

很简单,添加了几张图片,但是我们看见一个300,这是我设置ListView的条目数,大家再看下适配器代码就能知道了,下面给出适配器代码:

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class ListAdapter extends BaseAdapter {
    private List<Drawable> mDrawableList = new ArrayList<>();
    private int mLength = 0;
    private LayoutInflater mInflater;
    private Context mContext;
    private ListView mListView;
    private Animation animation;
    private int mFirstTop, mFirstPosition;
    private boolean isScrollDown;

    public ListAdapter(Context context, ListView listView, List<Drawable> drawables, int length) {
        mDrawableList.addAll(drawables);
        mLength = length;
        mInflater = LayoutInflater.from(context);
        mContext = context;
        mListView = listView;
        animation = AnimationUtils.loadAnimation(mContext, R.anim.translate);
        mListView.setOnScrollListener(mOnScrollListener);
    }

    AbsListView.OnScrollListener mOnScrollListener = new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            View firstChild = view.getChildAt(0);
            if (firstChild == null) return;     //如果listview为空,则结束
            int top = firstChild.getTop();
            /**
             * firstVisibleItem > mFirstPosition表示向下滑动一整个Item
             * mFirstTop > top表示在当前这个item中滑动
             */
            isScrollDown = firstVisibleItem > mFirstPosition || mFirstTop > top;
            mFirstTop = top;
            mFirstPosition = firstVisibleItem;
        }
    };

    @Override
    public int getCount() {
        return mLength;    //设置listview的长度
    }

    @Override
    public Object getItem(int position) {
        return mDrawableList.get(position % mDrawableList.size());     //这里的设置可以让图片循环,直接用mDrawableList.get(position)数组越界
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        if (convertView == null) {

            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.item_layout, null);
            holder.mImageView = (ImageView) convertView.findViewById(R.id.img);
            holder.mTextView = (TextView) convertView.findViewById(R.id.text);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        //清除当前显示区域中所有item的动画
        for (int i = 0; i < mListView.getChildCount(); i++) {
            View view = mListView.getChildAt(i);
            view.clearAnimation();
        }
        //然后给当前item添加上动画
        if (isScrollDown) {
            convertView.startAnimation(animation);
        }
        convertView.setTag(holder);

        holder.mImageView.setImageDrawable(mDrawableList.get(position % mDrawableList.size()));
        holder.mTextView.setText(position + "");

        return convertView;
    }

    public class ViewHolder {
        public ImageView mImageView;
        public TextView mTextView;
    }
}

代码注释也比较详细,需要注意的我们只能让上滑的时候出现动画且只有一个图片出现动画,其他清除动画,大家要留心。
最后就是动画anim的资源了,我们这里用的是一个translate的动画,给出代码:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromXDelta="1000"
    android:fromYDelta="0"
    android:interpolator="@android:anim/bounce_interpolator"
    android:toXDelta="0"
    android:toYDelta="0" />

中间有个interpolator叫插值器,是控制动画的展示方式的,系统有几个属性,下面贴出来

@android:anim/accelerate_decelerate_interpolator
@android:anim/accelerate_interpolator
@android:anim/anticipate_interpolator
@android:anim/anticipate_overshoot_interpolator
@android:anim/bounce_interpolator
@android:anim/cycle_interpolator
@android:anim/decelerate_interpolator
@android:anim/linear_interpolator
@android:anim/overshoot_interpolator

效果解释:

      accelerate_decelerate_interpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
      accelerate_interpolator 在动画开始的地方速率改变比较慢,然后开始加速
      anticipate_interpolator 开始的时候向后然后向前甩
      anticipate_overshoot_interpolator 开始的时候向后然后向前甩一定值后返回最后的值
      bounce_interpolator 动画结束的时候弹起
      cycle_interpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
      decelerate_interpolator 在动画开始的地方快然后慢
      linear_interpolator 以常量速率改变
      overshoot_interpolator 向前甩一定值后再回到原来位置

好了,具体的效果都实现了,现在到了源码时间。
代码:http://download.csdn.net/download/wanxuedong/9949404

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值