##android中的颜色渐变动画---可用于导航页的效果

最近在研究android的属性动画,看了很多博客和开源框架,写这边博客也是研究了一个github上的开源框架,个人觉得这个效果不错,可以应用于android app 中的欢迎界面.(ps:从此刻开始,希望自己可以坚持经常来csdn上写写博客,每天坚持一点,慢慢的,也就会的多一点.哈哈,牛逼的人应该都是这么成长起来的).
android中的属性动画有ValueAnimator 和 ObjectAnimator 这两种,前一种可以不指定属性名,例如:rotationX,alpha等等,后一种一般要制定个属性名.总的来说,前一种一般便于自定义控制,当然后一种也可以自定义属性名,然后自己动态控制,添加一个updateAnimatorListener即可.好了,简单的说了一下属性动画,下面开始今天的正题—-导航页渐变动画效果.
为了实现这个动画,我们需要自定义view,在里面封装好动画的渐变效果,接下来只需直接应用就好了.我们定义一个view类叫做ColorAnimationView继承view,必然要实现它的三个构造方法,我们一 一实现.然后我们在view里面定义一个内部类,集成viewpager.ViewPager.OnPageChangeListener,为什么要实现这个监听器的实现类,因为我们需要在里面进行颜色渐变的控制,因为当viewpager进行页面切换的时候,我们就要让它进行颜色的变化,以达到导航页的动画效果.实现类代码如下:

 private class PageChangeListener            implements ViewPager.OnPageChangeListener {

里面我们必然要实现三个方法:

      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);        public void onPageSelected(int position);        public void onPageScrollStateChanged(int state);

viewpager有几个页面,我们在使用的时候是需要给定的,在这个实现类中是根据页面的数量来控制动画播放的开始时间的.我们提供一个set 和 get 方发用来设置和获取页面的数量:

private int viewPagerChildCount;public void setViewPagerChildCount(int viewPagerChildCount) {this.viewPagerChildCount = viewPagerChildCount;}public int getViewPagerChildCount() {return viewPagerChildCount;}

在onPageScrolled中控制颜色的渐变效果,首先得到一个值,用于设置动画开始播放的时间,也就是动画播放的进度,用progress表示,progress可以随意定义,但得到的值必须在duration的范围内,也就是说,得有一个控制,具体的控制代码可以用一个小于1浮点数来*duration时间,这样就控制了progress的大小.具体可由如下实现:

            int count = getViewPagerChildCount() - 1;            if (count != 0) {                float length = (position + positionOffset) / count;                int progress = (int) (length * DURATION);                ColorAnimationView.this.seek(progress);            }
由seek方法来控制颜色的渐变,seek方法如下:
private void seek(long seekTime) {        colorAnim.setCurrentPlayTime(seekTime);    }

setCurrentPlayTime(seekTime)就是用来控制动画从哪一个时间点开始播放,用这个方法就可以达到这样一种效果,根据你滑动的多少就可以判断当前颜色变化的程度,以此来达到viewpager背景颜色渐变的效果.
然后我们需要定义个设置的方法,用来指定一些参数:

  public void setmViewPager(ViewPager mViewPager, int count, int... colors) {        if (mViewPager.getAdapter() == null) {            throw new IllegalStateException(                    "ViewPager does not have adapter instance.");        }        mPageChangeListener.setViewPagerChildCount(count);        mViewPager.setOnPageChangeListener(mPageChangeListener);            createAnimation(colors);    }

假如viewPager为空,抛出异常,然后设置内部实现类的set方法设置页面的数量,mViewPager.setOnPageChangeListener(mPageChangeListener);这行代码非常重要,这样我们设置的内部监听器就可以调用了,最后创建动画即可,createAnimation代码如下:

     if (colorAnim == null) {            colorAnim = ObjectAnimator.ofInt(this,                    "backgroundColor", colors);            colorAnim.setEvaluator(new ArgbEvaluator());            colorAnim.setDuration(DURATION);            colorAnim.addUpdateListener(this);        }

注意第四行用的是ArgbEvaluator,用于控制颜色渐变的动画.这里需要实现动画更新监听器,用于调用invalidate方法,用于view的重绘,因为ObjectAnimator中我们用的是自定义的属性名,必须在onAnimationUpdate方法中显示的调用invalidate,不然不会进行动画的变化.
最后记得在构造方法中实例化内部类PageChangeListener,也就是mViewPager.setOnPageChangeListener(mPageChangeListener);中的mPageChangeListener.
好了调用的时候只需要在布局文件中定义使用,宽高都是matchparent,然后调用setViewPager即可,viewpager的使用这里就不再赘述了.
github链接地址:

https://github.com/TaurusXi/GuideBackgroundColorAnimation

更多相关文章

  1. Android 动画分析之属性动画
  2. LayoutTransition 容器布局动画
  3. Android 弧形列表转盘的实现(三),View跟随RecyclerView做旋转动画;
  4. Android中svg矢量图和动画的使用
  5. android系统启动流程启动画面学习之init和init.rc分析
  6. [Android]Delphi/C++ Builder 开发 Android 程序启动画面简单完
  7. Android 加载SVG动画
  8. Android 动画分析之翻转效果
  9. Android属性动画实战教程中篇

随机推荐

  1. Android基础(14)SurfaceView
  2. Android菜鸟日记6
  3. android IPC 通讯机制
  4. Android支持的资源
  5. 五大布局-----FrameLayout帧布局
  6. 让Python在Android系统上飞一会儿:第一节
  7. ArrayMap是如何提高内存的使用效率的?
  8. Android(安卓)性能分析工具之 TraceView
  9. 浅谈Android五大布局(一)——LinearLayout
  10. .Myeclipse中配置ADT