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

##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

你可能感兴趣的:(记录我的android学习之路)