在android中listview控件使用的比较多,如果在listview上面有些动画会增色不少,listview上面的动画确实也不少,好多动画基本都是国外的大神写的。
有个github的下载地址里面包含了各种各样的listview动画,地址:https://github.com/nhaarman/ListViewAnimations。
我这个也是看了别人写的,摘抄了下。因为自己也是个菜鸟。
首先定义一个listview中适配器一行的布局:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
- <ImageButton
- android:id="@+id/cell_trash_button"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:src="@drawable/trash_can"
- android:scaleType="fitXY" />
- <TextView
- android:id="@+id/cell_name_textview"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical|left"
- android:layout_marginLeft="16dp"
- android:layout_weight="1"
- android:text="cell name" />
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageButton
android:id="@+id/cell_trash_button"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/trash_can"
android:scaleType="fitXY" />
<TextView
android:id="@+id/cell_name_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|left"
android:layout_marginLeft="16dp"
android:layout_weight="1"
android:text="cell name" />
</LinearLayout>
然后定义一个适配器对象ArrayAdapter:
- public class MyAnimListAdapter extends ArrayAdapter<MyCell> {
- private LayoutInflater mInflater;
- private int resId;
- public MyAnimListAdapter(Context context, int textViewResourceId, List<MyCell> objects) {
- super(context, textViewResourceId, objects);
- this.resId = textViewResourceId;
- this.mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- }
- @Override
- public View getView(final int position, View convertView, ViewGroup parent) {
- final View view;
- ViewHolder vh;
- MyCell cell = (MyCell)getItem(position);
- if (convertView==null) {
- view = mInflater.inflate(R.layout.chain_cell, parent, false);
- setViewHolder(view);
- } //理解:例如总共5个item,我们移除第四个item,当再次走到这里时候,第四条记录是原来的第五条记录,
- //而现在用的是原来第四条记录的convertView
- //但是我们在移除第四条记录做动画效果时,对第四条记录的view(指向convertView)的布局做了破坏
- //所以此时使用第四条记录的convertView是不合适的,所以我们破坏了convertView的同时并记录了neewInflate是true
- //当我们再次遇到此种被破坏的convertView的时候,我们从重新Inflate
- else if (((ViewHolder)convertView.getTag()).needInflate) {
- view = mInflater.inflate(R.layout.chain_cell, parent, false);
- setViewHolder(view);
- }
- else {
- view = convertView;
- }
- vh = (ViewHolder)view.getTag();
- vh.text.setText(cell.name);
- vh.imageButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- deleteCell(view, position);
- }
- });
- return view;
- }
- private void setViewHolder(View view) {
- ViewHolder vh = new ViewHolder();
- vh.text = (TextView)view.findViewById(R.id.cell_name_textview);
- vh.imageButton = (ImageButton) view.findViewById(R.id.cell_trash_button);
- vh.needInflate = false;
- view.setTag(vh);
- }
- }
public class MyAnimListAdapter extends ArrayAdapter<MyCell> {
private LayoutInflater mInflater;
private int resId;
public MyAnimListAdapter(Context context, int textViewResourceId, List<MyCell> objects) {
super(context, textViewResourceId, objects);
this.resId = textViewResourceId;
this.mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final View view;
ViewHolder vh;
MyCell cell = (MyCell)getItem(position);
if (convertView==null) {
view = mInflater.inflate(R.layout.chain_cell, parent, false);
setViewHolder(view);
}
else if (((ViewHolder)convertView.getTag()).needInflate) {
view = mInflater.inflate(R.layout.chain_cell, parent, false);
setViewHolder(view);
}
else {
view = convertView;
}
vh = (ViewHolder)view.getTag();
vh.text.setText(cell.name);
vh.imageButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
deleteCell(view, position);
}
});
return view;
}
private void setViewHolder(View view) {
ViewHolder vh = new ViewHolder();
vh.text = (TextView)view.findViewById(R.id.cell_name_textview);
vh.imageButton = (ImageButton) view.findViewById(R.id.cell_trash_button);
vh.needInflate = false;
view.setTag(vh);
}
}
然后定义个动画监听和动画对象:
- private void deleteCell(final View v, final int index) {
- AnimationListener al = new AnimationListener() {
- @Override
- public void onAnimationEnd(Animation arg0) {
- mAnimList.remove(index);
- ViewHolder vh = (ViewHolder)v.getTag();
- vh.needInflate = true;
- mMyAnimListAdapter.notifyDataSetChanged();
- }
- @Override public void onAnimationRepeat(Animation animation) {}
- @Override public void onAnimationStart(Animation animation) {}
- };
- collapse(v, al);
- }
- private void collapse(final View v, AnimationListener al) {
- final int initialHeight = v.getMeasuredHeight();
- Animation anim = new Animation() {
- @Override
- protected void applyTransformation(float interpolatedTime, Transformation t) {
- if (interpolatedTime == 1) {
- v.setVisibility(View.GONE);
- }
- else {
- v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
- v.requestLayout();
- }
- }
- @Override
- public boolean willChangeBounds() {
- return true;
- }
- };
- if (al!=null) {
- anim.setAnimationListener(al);
- }
- anim.setDuration(ANIMATION_DURATION);
- v.startAnimation(anim);
- }
private void deleteCell(final View v, final int index) {
AnimationListener al = new AnimationListener() {
@Override
public void onAnimationEnd(Animation arg0) {
mAnimList.remove(index);
ViewHolder vh = (ViewHolder)v.getTag();
vh.needInflate = true;
mMyAnimListAdapter.notifyDataSetChanged();
}
@Override public void onAnimationRepeat(Animation animation) {}
@Override public void onAnimationStart(Animation animation) {}
};
collapse(v, al);
}
private void collapse(final View v, AnimationListener al) {
final int initialHeight = v.getMeasuredHeight();
Animation anim = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if (interpolatedTime == 1) {
v.setVisibility(View.GONE);
}
else {
v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
v.requestLayout();
}
}
@Override
public boolean willChangeBounds() {
return true;
}
};
if (al!=null) {
anim.setAnimationListener(al);
}
anim.setDuration(ANIMATION_DURATION);
v.startAnimation(anim);
}
上面主要是getview中调用删除每一个item的动画实现,后面随便定义一个listview对象和数据源把这个listview显示出来就行看到效果了。
代码来自:https://github.com/paraches/ListViewCellDeleteAnimation
http://blog.youkuaiyun.com/lonely_fireworks/article/details/25777497