[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;
  }
 }
}
复制代码

 

分类:  Android Pro
本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/3907322.html如需转载请自行联系原作者

demoblog
相关文章
|
3月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
70 2
基于Android P,自定义Android开机动画的方法
|
15天前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
4月前
|
XML Android开发 数据格式
Android 中如何设置activity的启动动画,让它像dialog一样从底部往上出来
在 Android 中实现 Activity 的对话框式过渡动画:从底部滑入与从顶部滑出。需定义两个 XML 动画文件 `activity_slide_in.xml` 和 `activity_slide_out.xml`,分别控制 Activity 的进入与退出动画。使用 `overridePendingTransition` 方法在启动 (`startActivity`) 或结束 (`finish`) Activity 时应用这些动画。为了使前 Activity 保持静止,可定义 `no_animation.xml` 并在启动新 Activity 时仅设置新 Activity 的进入动画。
93 12
|
4月前
|
XML Android开发 UED
Android动画之共享元素动画简单实践
本文介绍Android共享元素动画, 实现两Activity间平滑过渡特定UI元素。通过设置`transitionName`属性和使用`ActivityOptions.makeSceneTransitionAnimation`启动目标Activity实现动画效果。可自定义过渡动画提升体验。
60 0
|
5月前
|
Android开发 UED
Android Item平移动画
【6月更文挑战第18天】
105 8
|
5月前
|
API Android开发 开发者
`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView
【6月更文挑战第26天】`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView。它提供高效的数据视图复用,优化的布局管理,支持多种布局(如线性、网格),并解耦数据、适配器和视图。RecyclerView的灵活性、性能(如局部刷新和动画支持)和扩展性使其成为现代Android开发的首选,特别是在处理大规模数据集时。
62 2
|
4月前
|
Android开发
android 动画 插值器和估值器
android 动画 插值器和估值器
|
5月前
|
前端开发 API Android开发
26. 【Android教程】网格视图 GridView
26. 【Android教程】网格视图 GridView
71 2
|
5月前
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
151 2
下一篇
无影云桌面