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