此篇小说引用代码为B揽胜VAH的源码,源码地址https://github.com/CymChad/BaseRecyclerViewAdapterHelper

前言

BPRADOVAH一共有二种动画浮现,之前本人从不曾接触动画,总以为很难入门。须求各类精美的统计还有算法等,后天硬着头皮看了看,发现入门照旧相比不难的。至少那篇小说我能担保你看懂。B君越VAH的卡通片用法在这边就不详细表达了,官方已经有详尽的分解博客,有某个就是他的原理分析不是入门级别。

代码

2018正版葡京赌侠诗,从上面能够看出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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图