最后
写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
*/
private static final float DEFAULT_ALPHA_FROM = 0f;
private final float mFrom;
public AlphaInAnimation() {
this(DEFAULT_ALPHA_FROM);
}
public AlphaInAnimation(float from) {
mFrom = from;
}
@Override
public Animator[] getAnimators(View view) {
//返回一个Animator数组 将动画附加到view上,透明度从mFrom-1f
return new Animator[]{ObjectAnimator.ofFloat(view, “alpha”, mFrom, 1f)};
}
}
其实就是设置一个属性动画在view上,然后将Animator数组返回,外界就可以直接调用
anim.setDuration(mDuration).start();设置动画时长并开启加载动画了.
ScaleInAnimation
/**
-
https://github.com/CymChad/BaseRecyclerViewAdapterHelper
-
缩放
*/
public class ScaleInAnimation implements BaseAnimation {
private static final float DEFAULT_SCALE_FROM = .5f;
private final float mFrom;
public ScaleInAnimation() {
this(DEFAULT_SCALE_FROM);
}
public ScaleInAnimation(float from) {
mFrom = from;
}
@Override
public Animator[] getAnimators(View view) {
//设置scaleX和scaleY都从mFrom-1f
ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, “scaleX”, mFrom, 1f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, “scaleY”, mFrom, 1f);
return new ObjectAnimator[]{scaleX, scaleY};
}
}
SlideInBottomAnimation
/**
-
https://github.com/CymChad/BaseRecyclerViewAdapterHelper
-
从下往上
*/
public class SlideInBottomAnimation implements BaseAnimation {
@Override
public Animator[] getAnimators(View view) {
//这里设置的是view的纵坐标,从view.getMeasuredHeight()-0,相当于从下往上移动自身的高度
return new Animator[]{
ObjectAnimator.ofFloat(view, “translationY”, view.getMeasuredHeight(), 0)
};
}
}
SlideInLeftAnimation
/**
-
https://github.com/CymChad/BaseRecyclerViewAdapterHelper
-
从左往右
*/
public class SlideInLeftAnimation implements BaseAnimation {
@Override
public Animator[] getAnimators(View view) {
//view 的translationX 从 -顶层root view的宽度~0
return new Animator[]{
ObjectAnimator.ofFloat(view, “translationX”, -view.getRootView().getWidth(), 0)
};
}
}
SlideInRightAnimation
/**
-
https://github.com/CymChad/BaseRecyclerViewAdapterHelper
-
从右往左
*/
public class SlideInRightAnimation implements BaseAnimation {
@Override
public Animator[] getAnimators(View view) {
//view 的translationX 从 顶层root view的宽度~0
return new Animator[]{
ObjectAnimator.ofFloat(view, “translationX”, view.getRootView().getWidth(), 0)
};
}
}
SlideInTopAnimation
从上往下,这是我自己加的,感觉这种动画效果很不错嘛
/**
-
author feiyang
-
create at 2017/10/19 10:37
-
description:从上往下
*/
public class SlideInTopAnimation implements BaseAnimation {
@Override
public Animator[] getAnimators(View view) {
return new Animator[]{
ObjectAnimator.ofFloat(view, “translationY”, -view.getMeasuredHeight(), 0)};
}
}
二,再看看BaseQuickAdapter
=====================
//Animation
/**
- Use with {@link #openLoadAnimation}
*/
public static final int ALPHAIN = 0x00000001;
/**
- Use with {@link #openLoadAnimation}
*/
public static final int SCALEIN = 0x00000002;
/**
- Use with {@link #openLoadAnimation}
*/
public static final int SLIDEIN_BOTTOM = 0x00000003;
/**
- Use with {@link #openLoadAnimation}
*/
public static final int SLIDEIN_LEFT = 0x00000004;
/**
- Use with {@link #openLoadAnimation}
*/
public static final int SLIDEIN_RIGHT = 0x00000005;
@IntDef({ALPHAIN, SCALEIN, SLIDEIN_BOTTOM, SLIDEIN_LEFT, SLIDEIN_RIGHT})
@Retention(RetentionPolicy.SOURCE)
public @interface AnimationType {
}
/**
- 动画只执行1次?
*/
private boolean mFirstOnlyEnable = true;
/**
- 开启了动画?
*/
private boolean mOpenAnimationEnable = false;
private Interpolator mInterpolator = new LinearInterpolator();
/**
- 动画播放时长
*/
private int mDuration = 300;
/**
- 上一个在播放动画的item的位置
*/
private int mLastPosition = -1;
/**
- 自定义的动画
*/
private BaseAnimation mCustomAnimation;
/**
- 当前选择使用哪种动画
*/
private BaseAnimation mSelectAnimation = new AlphaInAnimation();
上面就是定义了5种默认的动画
- ALPHAIN 渐显
- SCALEIN 缩放
- SLIDEIN_BOTTOM 从下到上
- SLIDEIN_LEFT 从左到右
- SLIDEIN_RIGHT 从右到左
并且下面还定义了AnimationType,这里是注解类型有点类似于枚举,就是当使用@AnimationType修饰的参数时只能使用上面的5种动画常量中的1种.关于枚举,其实很有必要学习一下,在很多时候可以规范我们的编码,可以看看Airsaid大神写的Android 中注解的使用.
后面是一些其他的属性,已加入详细注释.
设置从哪个item开始执行动画
/**
-
up fetch end
-
设置count个不执行动画
*/
public void setNotDoAnimationCount(int count) {
mLastPosition = count;
}
可以看到,将mLastPosition设置为count,mLastPosition之前的item是不会被加载动画了.
当视图附加到窗口时,开始执行动画
/**
-
Called when a view created by this adapter has been attached to a window.
-
simple to solve item will layout using all
-
{@link #setFullSpan(RecyclerView.ViewHolder)}
-
@param holder
*/
@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) {
//设置为跨区域 比如是StaggeredGridLayoutManager时,header或者footer等应该如何展示
setFullSpan(holder);
} else {
//添加动画到holder的itemView上,并执行动画
addAnimation(holder);
}
}
/**
-
add animation when you want to show time
-
添加动画到item上并执行动画
-
@param holder
*/
private void addAnimation(RecyclerView.ViewHolder holder) {
// 判断是否开启了动画
if (mOpenAnimationEnable) {
// !isFirstOnly 这一次item的位置>上一次加载动画item的位置
写在最后
在技术领域内,没有任何一门课程可以让你学完后一劳永逸,再好的课程也只能是“师傅领进门,修行靠个人”。“学无止境”这句话,在任何技术领域,都不只是良好的习惯,更是程序员和工程师们不被时代淘汰、获得更好机会和发展的必要前提。
如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!
加入我们吧!群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
领进门,修行靠个人”。“学无止境”这句话,在任何技术领域,都不只是良好的习惯,更是程序员和工程师们不被时代淘汰、获得更好机会和发展的必要前提。
如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!
加入我们吧!群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!