最近有一个需求,在滑动listview的过程中 ,刚进入的item要有动画效果。
接下来写一个简单的demo:
尽量将demo封装好,所以写一个用来出来动画的Adapter。
package com.app.listanim;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationSet;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ListView;
/**
* Created by llb on 2016/1/26.
*/
public abstract class ListAdapter extends BaseAdapter{
private AnimationSet animationSet;
private ListView mListView;
private int mFirstPosition; // 第一个可见item的位置
private int mFirstTop; // 第一个可以item的top值
private boolean isScrollDown;// 是否向下滑动
//绑定listview 设置其滑动监听
public void bindView(ListView listView){
mListView=listView;
mListView.setOnScrollListener(mScrollListener);
}
//设置动画
public void setAnimation(AnimationSet set){
animationSet=set;
}
private AbsListView.OnScrollListener mScrollListener=new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState== AbsListView.OnScrollListener.SCROLL_STATE_IDLE)
isScrollDown=false;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
View firstChild=view.getChildAt(0);
if(firstChild==null)
return;
int top=firstChild.getTop();//获得当前view最高点的坐标
isScrollDown = firstVisibleItem > mFirstPosition || mFirstTop > top;
//每次记录下来 与下次滑动的位置进行比较 判断往上 还是往下滑动
mFirstTop = top;
mFirstPosition = firstVisibleItem;
}
};
@Override
public View getView(int position, View convertView, ViewGroup parent){
View view=buildView(position,convertView,parent);
if(isScrollDown&&animationSet!=null){
cancelAnimation();
view.startAnimation(animationSet);
}
return view;
}
//清除所有的动画
private void cancelAnimation() {
int count = mListView.getChildCount();
for(int i=0;i<count;i++) {
mListView.getChildAt(i).clearAnimation();
}
}
public abstract View buildView(int position, View convertView, ViewGroup parent);
}
写一个Adapter继承ListAdapter 写自己想要的布局:
class MyAdapter extends ListAdapter{
@Override
public int getCount() {
return 40;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View buildView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView=View.inflate(parent.getContext(),R.layout.item,null);
}
return convertView;
}
}
使用:
lv=(ListView)findViewById(R.id.lv);
MyAdapter myAdapter=new MyAdapter();
myAdapter.bindView(lv);
myAdapter.setAnimation((AnimationSet) AnimationUtils.loadAnimation(this, R.anim.anim));
lv.setAdapter(myAdapter);
动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
android:duration="500"
android:fromXScale="0.9"
android:toXScale="1"
android:fromYScale="0.8"
android:pivotX="50%"
android:pivotY="50%"
android:toYScale="1"
/>
</set>
效果图
每次进入的item都会有一个稍微放大的效果。