此篇文章引用代码为BRVAH的源码,源码地址https://github.com/CymChad/BaseRecyclerViewAdapterHelper
前言
BRVAH一共有五种动画展示,以前我从没有接触动画,总以为很难入门。需要各种精密的计算还有算法等,今天硬着头皮看了看,发现入门还是比较简单的。至少这篇文章我能保证你看懂。BRVAH的动画用法在这里就不详细说明了,官方已经有详细的解说博客,有一点就是他的原理解析不是入门级别。
代码
从下面可以看出addAnimation(holder)添加动画的方法,是在onViewAttachedToWindow这个方法中调用的。这个方法是在recyclerview的item显示在屏幕上时调用的。
@Override
public void onViewAttachedToWindow(K holder) {
super.onViewAttachedToWindow(holder);
int type = holder.getItemViewType();
if (type == EMPTY_VIEW || type == HEADER_VIEW || type == FOOTER_VIEW || type == LOADING_VIEW) {
setFullSpan(holder);
} else {
addAnimation(holder);
}
}
接下来看一下这个addAnimation方法,先是判断是否开启动画然后对动画实体类的getAnimators方法进行遍历,因为一个item可能有两个动画,比如横向拉伸动画和纵向拉伸动画。可以先执行横向拉伸在执行纵向拉伸。
private void addAnimation(RecyclerView.ViewHolder holder) {
if (mOpenAnimationEnable) {
if (!mFirstOnlyEnable || holder.getLayoutPosition() > mLastPosition) {
BaseAnimation animation = null;
if (mCustomAnimation != null) {
animation = mCustomAnimation;
} else {
animation = mSelectAnimation;
}
for (Animator anim : animation.getAnimators(holder.itemView)) {
startAnim(anim, holder.getLayoutPosition());
}
mLastPosition = holder.getLayoutPosition();
}
}
}
具体来看getAnimators方法,由于五种动画不同,所以animation的类中的动画方法也不尽一致。这里面都用到了一个ObjectAnimator类,这个类是专门针对控件进行监听的,监听动画过程,在监听中对控件操作。
ofFloat()是改变透明度的方法
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
第一个参数用于指定这个动画要操作的是哪个控件
第二个参数用于指定这个动画要操作这个控件的哪个属性
第三个参数是可变长参数,这个就跟 ValueAnimator 中的可变长参数的意义一样了,就是指这个属性值是从哪变到哪。
理解了这些下面的代码就不难了,注意下面代码中的注释!!!
mFrom为自定义数值
//**AlphaInAnimation类**
/*alpha 渐变透明度动画效果,从0f到1f*/
@Override
public Animator[] getAnimators(View view) {//(改变透明度)
return new Animator[]{ObjectAnimator.ofFloat(view, "alpha", mFrom, 1f)};
}
//
//**ScaleInAnimation类**
/*scale 调节尺寸,1.0 代表自身无变化,0.5 代表起始时缩小一倍,2.0 代表放大一倍,这里从0.5到1*/
@Override
public Animator[] getAnimators(View view) {
ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", mFrom, 1f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", mFrom, 1f);
return new ObjectAnimator[]{scaleX, scaleY};
}
//**SlideInBottomAnimation类**
/*translate 标签 —— 平移,这里是Y轴方向平移。起始的item都是上下都是紧凑的,这个动画就是在Y轴上从远处向最终位置平移一个单位,以item的高为标准作为一个单位*/
@Override
public Animator[] getAnimators(View view) {
return new Animator[]{
ObjectAnimator.ofFloat(view, "translationY", view.getMeasuredHeight(), 0)
};
}
/*这个跟上面区别不是很大,就是在X轴上平移一个单位*/
//**SlideInLeftAnimation类**
@Override
public Animator[] getAnimators(View view) {
return new Animator[]{
ObjectAnimator.ofFloat(view, "translationX", -view.getRootView().getWidth(), 0)
};
}
//**SlideInRightAnimation类**
@Override
public Animator[] getAnimators(View view) {
return new Animator[]{
ObjectAnimator.ofFloat(view, "translationX", view.getRootView().getWidth(), 0)
};
}
startAnim方法是执行动画的方法,首先设定执行的周期,然后设定动画变化的速率,速率有很多种本文采用的是LinearInterpolator,以常量速率改变。
protected void startAnim(Animator anim, int index) {
anim.setDuration(mDuration).start();
anim.setInterpolator(mInterpolator);
}
想要了解动画其他属性的可以看一下这个教程http://wiki.jikexueyuan.com/project/android-animation/2.html
感兴趣的同学可以关注一下我的微信公众号,或者微信搜索 开发 Android的小学生
image.png
网友评论