因为小马很喜欢在不同的页面之间跳转时加点好玩的动画,今天无意间看到一个动画效果感觉不错,几种效果图如下,既然好玩就写在博客中,直接说就是:该效果类似于iPhone中View的切换动画效果,今天就只介绍上面展示的效果,如果大家要看到更多更好玩的Activity之间切换的效果的话,可以看下小马这篇文章:http://mzh3344258.blog.51cto.com/1823534/807337涉及到插值器与多种动画效果的实现,看完会对Activity之间的动画有个更全的认识,文中不足之处,大家批评指出,共同改进,先谢谢啦,废话不多说,先上效果,再看代码!!!

  1. 效果一:

  2. 效果二:

  3. 效果三:

  4. 效果四:(小马犯错的效果):

  5. 效果五(回旋效果):

  6. 效果六(回旋效果):

     好啦,效果看完了,就来看下上面效果实现的具体代码吧, 中间小马会把我自己试验的、犯的错误都以注释的形式写下来的大家使用的时候别出错就行了!

 


   
   
  1. package com.xiaoma.www; 
  2.  
  3. import android.animation.Animator; 
  4. import android.animation.AnimatorListenerAdapter; 
  5. import android.animation.ObjectAnimator; 
  6. import android.app.Activity; 
  7. import android.os.Bundle; 
  8. import android.view.View; 
  9. import android.view.View.OnClickListener; 
  10. import android.view.animation.AccelerateInterpolator; 
  11. import android.view.animation.CycleInterpolator; 
  12. import android.view.animation.DecelerateInterpolator; 
  13. import android.view.animation.Interpolator; 
  14. import android.view.animation.OvershootInterpolator; 
  15. import android.widget.ArrayAdapter; 
  16. import android.widget.Button; 
  17. import android.widget.ListView; 
  18.  
  19. /**   
  20. * @Title: BetweenAnimationActivity.java 
  21. * @Package com.xiaoma.www 
  22. * @Description: 小马学习模仿iPhone列表分页旋转刷新 
  23. * @author XiaoMa 
  24. */ 
  25.  
  26. public class BetweenAnimationActivity extends Activity implements OnClickListener { 
  27.      
  28.     /**资源声明*/ 
  29.     private Button startNext = null ;  
  30.     private ListView firstPage = null ; 
  31.     private ListView secondPage = null ; 
  32.      
  33.     /**列表项声明*/ 
  34.     private static final String firstItem[] =  
  35.         {"海阔人生","光辉岁月","无尽空虚","真的爱你","岁月无声","灰色轨迹","再见理想"}; 
  36.      
  37.     private static final String secondItem[] =  
  38.         {"洗唰唰","爱啦啦","喜欢你","娃哈哈","小马果","大坏蛋","冷雨夜"}; 
  39.      
  40.     /**列表页面切换动画插值器声明一*/ 
  41.     private Interpolator accelerator = new AccelerateInterpolator(); 
  42.     private Interpolator decelerator = new DecelerateInterpolator(); 
  43.      
  44.     /**动画插值器二:效果五与效果六都为以下插值器*/ 
  45.     private Interpolator  accelerator1= new  CycleInterpolator(45f); 
  46.     private Interpolator  decelerator1= new  OvershootInterpolator(); 
  47.      
  48.     /** Called when the activity is first created. */ 
  49.     @Override 
  50.     public void onCreate(Bundle savedInstanceState) { 
  51.         super.onCreate(savedInstanceState); 
  52.         setContentView(R.layout.main); 
  53.          
  54.         /** 
  55.          * 这个地方写下,大家尽量不要在onCreate方法中写太多的操作, 
  56.          * 如果涉及到很多配置问题时有些属性设置必须在onCreate()方法中 
  57.          * 写,比如:全屏、横竖屏必须在setContentView()前面写, 
  58.          * 如果在onCreate()方法中写太多东西的,一句话:太乱!! 
  59.          * */ 
  60.          
  61.         init(); 
  62.     } 
  63.  
  64.      
  65.     /** 
  66.      * 初始化实现 
  67.      */ 
  68.     private void init(){ 
  69.          
  70.         /**资源定位,添加监听*/ 
  71.         startNext = (Button)findViewById(R.id.startNext); 
  72.         startNext.setOnClickListener(this); 
  73.          
  74.         firstPage = (ListView)findViewById(R.id.firstPage); 
  75.         secondPage = (ListView)findViewById(R.id.secondPage); 
  76.          
  77.         ArrayAdapter<String> firstAdapter = new ArrayAdapter<String> 
  78.             (this, android.R.layout.simple_list_item_1,firstItem); 
  79.         ArrayAdapter<String> secondAdapter = new ArrayAdapter<String> 
  80.             (this, android.R.layout.simple_list_item_1, secondItem); 
  81.          
  82.         firstPage.setAdapter(firstAdapter); 
  83.         secondPage.setAdapter(secondAdapter); 
  84.          
  85.     } 
  86.      
  87.     @Override 
  88.     public void onClick(View v) { 
  89.         changePage(); 
  90.     } 
  91.  
  92.  
  93.     /* 
  94.      * 实现列表页面切换 
  95.      */ 
  96.     private void changePage() { 
  97.          
  98.         final ListView visiable  ; 
  99.         final ListView invisiable ; 
  100.          
  101.         if(firstPage.getVisibility() == View.GONE){ 
  102.             visiable = secondPage ;  
  103.             invisiable = firstPage ;  
  104.         }else
  105.             visiable = firstPage ;  
  106.             invisiable = secondPage ;  
  107.         } 
  108.          
  109.          
  110.         /* 
  111.          * 这个地方大家可能看到了ObjectAnimator这个类,一开始我也不知道是什么东西,很简单,查官方文档, 
  112.          * 官方文档中的解释一堆英文,我一直说的,我英文烂的要死,但不怕,只要你想,就肯定可以查出来的,大家 
  113.          * 只看一句:该类是 ValueAnimator的子类,可以根据给定的属性名称给目标对象设置动画参数 
  114.          */ 
  115.          
  116.          
  117.         //效果一(此处效果顺序与效果图一一对应) 
  118.               /*final ObjectAnimator invisToVis = ObjectAnimator.ofFloat(invisiable, "rotationX",-90f, 0f); 
  119.               ObjectAnimator visToInvis = ObjectAnimator.ofFloat(visiable, "rotationX", 0f, 90f);*/ 
  120.          
  121.         //效果二 
  122.               final ObjectAnimator invisToVis = ObjectAnimator.ofFloat(invisiable, "rotationY",-90f, 0f); 
  123.               ObjectAnimator visToInvis = ObjectAnimator.ofFloat(visiable, "rotationY", 0f, 90f); 
  124.          
  125.         //效果三(这个地方的alpha属性值大家只记一点:值越大越不透明就可以了!!!) 
  126.               /*final ObjectAnimator invisToVis = ObjectAnimator.ofFloat(invisiable, "alpha", 0.0f, 1.0f ); 
  127.               ObjectAnimator visToInvis = ObjectAnimator.ofFloat(visiable, "alpha", 1.0f, 0.0f );*/ 
  128.          
  129.                
  130.         /* 
  131.          *效果四(此于是我犯的一个错误,很天真的以为应该也有rotationZ属性名称,其实是错的, 
  132.          *在ofFloat参数中并无此属性名称,但大家还是可以看到列表正常,其实显示 效果很不正常了 
  133.          *因为后台已经报错,但应用仍然不会停止 ,照常运行,但效果仅仅是两个ListView直接替换, 
  134.          *并无任何动画添加到其中,这个地方大家注意下):  
  135.          *  ObjectAnimator.ofFloat(invisiable, "rotationZ",-90f, 0f); 
  136.          */ 
  137.                
  138.                
  139.             visToInvis.setDuration(500); 
  140.             visToInvis.setInterpolator(accelerator); 
  141.             invisToVis.setDuration(500); 
  142.             invisToVis.setInterpolator(decelerator); 
  143.              
  144.             /* 
  145.              *这个地方记录下,下面这个监听器小马第一次见到,查阅官方文档解释如下: 
  146.              *此监听来监听动画的生命周期如:开始、结束、正在播放、循环播放等 , 
  147.              *此处切记: Animation是不可以监听动画的,它只负责动画的 
  148.              */ 
  149.             visToInvis.addListener(new AnimatorListenerAdapter() { 
  150.                 @Override 
  151.                 public void onAnimationEnd(Animator anim) { 
  152.                      
  153.                     /* 
  154.                      * 列举几个动画的监听: 
  155.                      * 一:anim.isRunning(){//TODO} 
  156.                      * 二:anim.isStarted(){//TODO} 
  157.                      * 三:anim.end(){//TODO} 
  158.                      */ 
  159.                      
  160.                     visiable.setVisibility(View.GONE); 
  161.                     invisToVis.start(); 
  162.                     invisiable.setVisibility(View.VISIBLE); 
  163.                 } 
  164.             }); 
  165.             visToInvis.start(); 
  166.          
  167.     } 
  168.      

         最后,小马在这些说下,文章标题中说是分页动画,其实这些动画并不仅仅局限于分页上面的,如果大家把插值器、动画用灵活一点的话,也可以做出很个性的带有很多动画的应用的,再加上Activity之间的动画与以上这些结合的话就更完美了,Activity之间的动画大家可以参照我之前写的这篇文章:http://mzh3344258.blog.51cto.com/1823534/807337希望对大家有所帮助,加油,努力就有收获 ,如若文章中有错误或不足,诚请大家批评指出,小马一定及时改正!谢谢...O_O