zoukankan      html  css  js  c++  java
  • [Android Pro] ListView,GridView之LayoutAnimation特殊动画的实现

    转载自:http://gundumw100.iteye.com/blog/1874545

    LayoutAnimation干嘛用的?不知道的话网上搜一下。
    Android的Animation之LayoutAnimation使用方法

    有两种用法,我的通常写在代码中,像下面这样:

        /** 
             * Layout动画 
             *  
             * @return 
             */  
            protected LayoutAnimationController getAnimationController() {  
                int duration=300;  
                AnimationSet set = new AnimationSet(true);  
          
                Animation animation = new AlphaAnimation(0.0f, 1.0f);  
                animation.setDuration(duration);  
                set.addAnimation(animation);  
          
                animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,  
                        Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,  
                        -1.0f, Animation.RELATIVE_TO_SELF, 0.0f);  
                animation.setDuration(duration);  
                set.addAnimation(animation);  
          
                LayoutAnimationController controller = new LayoutAnimationController(set, 0.5f);  
                controller.setOrder(LayoutAnimationController.ORDER_NORMAL);  
                return controller;  
            }  

    应用的时候只需这样:

    listView = (ListView) findViewById(R.id.listView);  
    listView.setLayoutAnimation(getAnimationController());  
    adapter = new ListViewAdapter(stores);  
    listView.setAdapter(adapter); 


    这样一个简单的LayoutAnimation就完成了。

    别看到这里就以为文章就完了,以上都是些小玩意。呵呵,还有更厉害的!

    你想设置更炫的动画吗?LayoutAnimation通常是Item一个一个的出现,有某种规律的。想让每个Item都有自己的动画吗?那就继续看下去。

    .......
    private int duration=1000;
            private Animation push_left_in,push_right_in;
            private Animation slide_top_to_bottom,slide_bottom_to_top;
            public ListViewAdapter(ArrayList<Store> list) {
                this.list = list;
                push_left_in=AnimationUtils.loadAnimation(context, R.anim.push_left_in);
                push_right_in=AnimationUtils.loadAnimation(context, R.anim.push_right_in);
                slide_top_to_bottom=AnimationUtils.loadAnimation(context, R.anim.slide_top_to_bottom);
                slide_bottom_to_top=AnimationUtils.loadAnimation(context, R.anim.slide_bottom_to_top);
            }
    ........
    
    @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                ViewHodler hodler;
                if (convertView == null) {
                    hodler = new ViewHodler();
                    convertView = LayoutInflater.from(context).inflate(
                            R.layout.simple_item_7_for_main, null);
                    ........
                    
                    
                    convertView.setTag(hodler);
                    
                    if (position % 2 == 0) {
                        push_left_in.setDuration(duration);
                        convertView.setAnimation(push_left_in);
                    } else {
                        push_right_in.setDuration(duration);
                        convertView.setAnimation(push_right_in);
                    }
                    
                    /*if(position==0){
                        slide_bottom_to_top.setDuration(duration);
                        convertView.setAnimation(slide_bottom_to_top);
                    }
                    else{
                        slide_top_to_bottom.setDuration(duration);
                        convertView.setAnimation(slide_top_to_bottom);
                    }*/
                    
                }else{
                    hodler = (ViewHodler) convertView.getTag();
                }
    ........
                
                
                return convertView;
            }

    看见上面的动画设置了吗?将动画写在getView()中,这样可以设置很多不同的动画。其实这不属于LayoutAnimation的范畴了。
    你可以试一下,如果设计好的话,可以有比LayoutAnimation更酷的效果。
    我这里只试了两种效果。
    下面是我的动画文件,共四个:
    第一种效果:item分别从左右两侧滑入效果。
    push_left_in.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="300"/>
        <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
    </set>

    push_right_in.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="300"/>
        <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
    </set>

    第2种效果:第一个item从下往上滑入,其他Item从上往下滑入效果,这个效果如果单个Item比较高(height)的话效果非常酷(卡牛的老版本好像用的就是这种效果)。
    slide_bottom_to_top.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
        <translate android:fromYDelta="100%" android:toXDelta="0" android:duration="300" />
        <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
    </set>

    slide_top_to_bottom.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
        <translate android:fromYDelta="-100%" android:toXDelta="0" android:duration="300" />
        <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
    </set>

    另外一篇:
    这个不是我写的。
    GridView的item从上下左右飞入

    import java.util.Random;
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.view.animation.Animation;
    import android.view.animation.TranslateAnimation;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.GridView;
    import android.widget.ImageView;
    public class ZdemoActivity extends Activity {
     
     private GridView gv;
     private Button btn;
     private TranslateAnimation taLeft, taRight, taTop, taBlow;
     private int[] imgList = new int[15];
     private MyAdapter mAdapter;
     private LayoutInflater mInflater;
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      this.InitView();
      this.InitAnima();
      this.InitData();
     }
     private void InitAnima() {
      // TODO Auto-generated method stub
      taLeft = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 1.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f);
      taRight = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, -1.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f);
      taTop = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 1.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f);
      taBlow = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, -1.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f);
      taLeft.setDuration(1000);
      taRight.setDuration(1000);
      taTop.setDuration(1000);
      taBlow.setDuration(1000);
     }
     private void InitData() {
      // TODO Auto-generated method stub
      for (int i = 0; i < 15; i++) {
       imgList[i] = R.drawable.ic_launcher;
      }
      mAdapter = new MyAdapter();
      gv.setAdapter(mAdapter);
     }
     private void InitView() {
      // TODO Auto-generated method stub
      gv = (GridView) findViewById(R.id.gridView1);
      btn = (Button) findViewById(R.id.button1);
      btn.setOnClickListener(new OnClickListener() {
       @Override
       public void onClick(View v) {
        // TODO Auto-generated method stub
        mAdapter = null;
        mAdapter = new MyAdapter();
        gv.setAdapter(mAdapter);
        mAdapter.notifyDataSetChanged();
       }
      });
      mInflater = (LayoutInflater) this
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     }
     private class MyAdapter extends BaseAdapter {
      @Override
      public int getCount() {
       // TODO Auto-generated method stub
       return imgList.length;
      }
      @Override
      public Object getItem(int position) {
       // TODO Auto-generated method stub
       return imgList[position];
      }
      @Override
      public long getItemId(int position) {
       // TODO Auto-generated method stub
       return position;
      }
      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
       // TODO Auto-generated method stub
       ViewHolder holder = null;
       if (convertView == null) {
        convertView = mInflater.inflate(R.layout.item, null);
        holder = new ViewHolder();
        holder.image = (ImageView) convertView
          .findViewById(R.id.imageView1);
        convertView.setTag(holder);
       } else {
        holder = (ViewHolder) convertView.getTag();
       }
       int imgID = imgList[position];
       holder.image.setImageResource(imgID);
       Random ran = new Random();
       int rand = ran.nextInt(4);
       switch (rand) {
       case 0:
        convertView.startAnimation(taLeft);
        break;
       case 1:
        convertView.startAnimation(taRight);
        break;
       case 2:
        convertView.startAnimation(taTop);
        break;
       case 3:
        convertView.startAnimation(taBlow);
        break;
       }
       return convertView;
      }
      class ViewHolder {
       public ImageView image;
      }
     }
    }
  • 相关阅读:
    JAVAEE框架搭建所需的配置文件大全
    JPA之hibernate例子+总结
    NtDuplicateObject小解读
    黑窗口输入确定数字弹MessageBox(VirtualProtect())
    内存理解之简单的内存修改器
    注入理解之挂起线程
    银行家算法
    ReflectiveLoader分析(远程线程注入 PE修正)
    Window10中利用Windbg与虚拟机(window7)中调试驱动建立方法
    了解RabbitMQ
  • 原文地址:https://www.cnblogs.com/0616--ataozhijia/p/3907322.html
Copyright © 2011-2022 走看看