首页 > 代码库 > 【转】ListView,GridView之LayoutAnimation特殊动画的实现 ps:需要学习的是在getView中添加动画的思想
【转】ListView,GridView之LayoutAnimation特殊动画的实现 ps:需要学习的是在getView中添加动画的思想
LayoutAnimation干嘛用的?不知道的话网上搜一下。
Android的Animation之LayoutAnimation使用方法
有两种用法,我的通常写在代码中,像下面这样:
1 /** 2 * Layout动画 3 * 4 * @return 5 */ 6 protected LayoutAnimationController getAnimationController() { 7 int duration=300; 8 AnimationSet set = new AnimationSet(true); 9 10 Animation animation = new AlphaAnimation(0.0f, 1.0f); 11 animation.setDuration(duration); 12 set.addAnimation(animation); 13 14 animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, 15 Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 16 -1.0f, Animation.RELATIVE_TO_SELF, 0.0f); 17 animation.setDuration(duration); 18 set.addAnimation(animation); 19 20 LayoutAnimationController controller = new LayoutAnimationController(set, 0.5f); 21 controller.setOrder(LayoutAnimationController.ORDER_NORMAL); 22 return controller; 23 }
应用的时候只需这样:
1 listView = (ListView) findViewById(R.id.listView); 2 listView.setLayoutAnimation(getAnimationController()); 3 adapter = new ListViewAdapter(stores); 4 listView.setAdapter(adapter);
这样一个简单的LayoutAnimation就完成了。
别看到这里就以为文章就完了,以上都是些小玩意。呵呵,还有更厉害的!
你想设置更炫的动画吗?LayoutAnimation通常是Item一个一个的出现,有某种规律的。想让每个Item都有自己的动画吗?那就继续看下去。
1 ....... 2 private int duration=1000; 3 private Animation push_left_in,push_right_in; 4 private Animation slide_top_to_bottom,slide_bottom_to_top; 5 public ListViewAdapter(ArrayList<Store> list) { 6 this.list = list; 7 push_left_in=AnimationUtils.loadAnimation(context, R.anim.push_left_in); 8 push_right_in=AnimationUtils.loadAnimation(context, R.anim.push_right_in); 9 slide_top_to_bottom=AnimationUtils.loadAnimation(context, R.anim.slide_top_to_bottom); 10 slide_bottom_to_top=AnimationUtils.loadAnimation(context, R.anim.slide_bottom_to_top); 11 } 12 ........ 13 14 @Override 15 public View getView(int position, View convertView, ViewGroup parent) { 16 // TODO Auto-generated method stub 17 ViewHodler hodler; 18 if (convertView == null) { 19 hodler = new ViewHodler(); 20 convertView = LayoutInflater.from(context).inflate( 21 R.layout.simple_item_7_for_main, null); 22 ........ 23 24 25 convertView.setTag(hodler); 26 27 if (position % 2 == 0) { 28 push_left_in.setDuration(duration); 29 convertView.setAnimation(push_left_in); 30 } else { 31 push_right_in.setDuration(duration); 32 convertView.setAnimation(push_right_in); 33 } 34 35 /*if(position==0){ 36 slide_bottom_to_top.setDuration(duration); 37 convertView.setAnimation(slide_bottom_to_top); 38 } 39 else{ 40 slide_top_to_bottom.setDuration(duration); 41 convertView.setAnimation(slide_top_to_bottom); 42 }*/ 43 44 }else{ 45 hodler = (ViewHodler) convertView.getTag(); 46 } 47 ........ 48 49 50 return convertView; 51 }
看见上面的动画设置了吗?将动画写在getView()中,这样可以设置很多不同的动画。其实这不属于LayoutAnimation的范畴了。
你可以试一下,如果设计好的话,可以有比LayoutAnimation更酷的效果。
我这里只试了两种效果。
下面是我的动画文件,共四个:
第一种效果:item分别从左右两侧滑入效果。
push_left_in.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <set xmlns:android="http://schemas.android.com/apk/res/android"> 3 <translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="300"/> 4 <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" /> 5 </set>
第2种效果:第一个item从下往上滑入,其他Item从上往下滑入效果,这个效果如果单个Item比较高(height)的话效果非常酷(卡牛的老版本好像用的就是这种效果)。
slide_bottom_to_top.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator"> 3 <translate android:fromYDelta="100%" android:toXDelta="0" android:duration="300" /> 4 <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" /> 5 </set>
slide_top_to_bottom.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator"> 3 <translate android:fromYDelta="-100%" android:toXDelta="0" android:duration="300" /> 4 <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" /> 5 </set>
另外一篇:
这个不是我写的。
GridView的item从上下左右飞入
1 import java.util.Random; 2 import android.app.Activity; 3 import android.content.Context; 4 import android.os.Bundle; 5 import android.view.LayoutInflater; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.view.ViewGroup; 9 import android.view.animation.Animation; 10 import android.view.animation.TranslateAnimation; 11 import android.widget.BaseAdapter; 12 import android.widget.Button; 13 import android.widget.GridView; 14 import android.widget.ImageView; 15 public class ZdemoActivity extends Activity { 16 17 private GridView gv; 18 private Button btn; 19 private TranslateAnimation taLeft, taRight, taTop, taBlow; 20 private int[] imgList = new int[15]; 21 private MyAdapter mAdapter; 22 private LayoutInflater mInflater; 23 @Override 24 public void onCreate(Bundle savedInstanceState) { 25 super.onCreate(savedInstanceState); 26 setContentView(R.layout.main); 27 this.InitView(); 28 this.InitAnima(); 29 this.InitData(); 30 } 31 private void InitAnima() { 32 // TODO Auto-generated method stub 33 taLeft = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 1.0f, 34 Animation.RELATIVE_TO_PARENT, 0.0f, 35 Animation.RELATIVE_TO_PARENT, 0.0f, 36 Animation.RELATIVE_TO_PARENT, 0.0f); 37 taRight = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, -1.0f, 38 Animation.RELATIVE_TO_PARENT, 0.0f, 39 Animation.RELATIVE_TO_PARENT, 0.0f, 40 Animation.RELATIVE_TO_PARENT, 0.0f); 41 taTop = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, 42 Animation.RELATIVE_TO_PARENT, 0.0f, 43 Animation.RELATIVE_TO_PARENT, 1.0f, 44 Animation.RELATIVE_TO_PARENT, 0.0f); 45 taBlow = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, 46 Animation.RELATIVE_TO_PARENT, 0.0f, 47 Animation.RELATIVE_TO_PARENT, -1.0f, 48 Animation.RELATIVE_TO_PARENT, 0.0f); 49 taLeft.setDuration(1000); 50 taRight.setDuration(1000); 51 taTop.setDuration(1000); 52 taBlow.setDuration(1000); 53 } 54 private void InitData() { 55 // TODO Auto-generated method stub 56 for (int i = 0; i < 15; i++) { 57 imgList[i] = R.drawable.ic_launcher; 58 } 59 mAdapter = new MyAdapter(); 60 gv.setAdapter(mAdapter); 61 } 62 private void InitView() { 63 // TODO Auto-generated method stub 64 gv = (GridView) findViewById(R.id.gridView1); 65 btn = (Button) findViewById(R.id.button1); 66 btn.setOnClickListener(new OnClickListener() { 67 @Override 68 public void onClick(View v) { 69 // TODO Auto-generated method stub 70 mAdapter = null; 71 mAdapter = new MyAdapter(); 72 gv.setAdapter(mAdapter); 73 mAdapter.notifyDataSetChanged(); 74 } 75 }); 76 mInflater = (LayoutInflater) this 77 .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 78 } 79 private class MyAdapter extends BaseAdapter { 80 @Override 81 public int getCount() { 82 // TODO Auto-generated method stub 83 return imgList.length; 84 } 85 @Override 86 public Object getItem(int position) { 87 // TODO Auto-generated method stub 88 return imgList[position]; 89 } 90 @Override 91 public long getItemId(int position) { 92 // TODO Auto-generated method stub 93 return position; 94 } 95 @Override 96 public View getView(int position, View convertView, ViewGroup parent) { 97 // TODO Auto-generated method stub 98 ViewHolder holder = null; 99 if (convertView == null) { 100 convertView = mInflater.inflate(R.layout.item, null); 101 holder = new ViewHolder(); 102 holder.image = (ImageView) convertView 103 .findViewById(R.id.imageView1); 104 convertView.setTag(holder); 105 } else { 106 holder = (ViewHolder) convertView.getTag(); 107 } 108 int imgID = imgList[position]; 109 holder.image.setImageResource(imgID); 110 Random ran = new Random(); 111 int rand = ran.nextInt(4); 112 switch (rand) { 113 case 0: 114 convertView.startAnimation(taLeft); 115 break; 116 case 1: 117 convertView.startAnimation(taRight); 118 break; 119 case 2: 120 convertView.startAnimation(taTop); 121 break; 122 case 3: 123 convertView.startAnimation(taBlow); 124 break; 125 } 126 return convertView; 127 } 128 class ViewHolder { 129 public ImageView image; 130 } 131 } 132 }
另外附上android animation学习的博文:
http://blog.csdn.net/tianjf0514/article/details/7566304
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=564