学习自
http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650824778&idx=1&sn=c7116f310e70a2403c5e5d88c724060b
学习总结:
算不上是RecyclerView的进阶使用
1.对recycler view动画的使用比较浅
2.没有重写LayoutManager
3.自动居中问题也通过自带api简单处理了
不过配合card view,让人感觉真的美爆了。
是这样的效果 蛮漂亮的
1.自动居中
LinearSnapHelper mLinearySnapHelper = new LinearSnapHelper();
mLinearySnapHelper.attachToRecyclerView(mGalleryRecyclerView);
自带的api舒服的一匹,不过我们采用手势判断再解决一些事件问题,也可以轻松实现
linear是允许一次滑多个
pager开头的是只允许一次滑一个
2.设置边距
他就是想让分别给第一个item和最后一个item设置不一样的边距,不显得太突兀。
实现起来很简单,可以在adapter里直接写,也可以重写一个item decoration,都很好,没有孰优孰劣,看自己喜欢
3.实现动画
3个点:获取当前是第几个item、获取偏移值、根据偏移值去设置动画
获取第几个item直接onScrollListener里就可以得到,得到的方式有多种;
获取偏移值,不用说也能知道;
设置动画,也很简单;
有个地方讲的不是太清楚,他的动画原理应该是这样的
是从左边顶部开始的,也可以是从底部开始的。我一开始有点太主观了,从中间开始考虑起来,耽误了一会。
4.高斯模糊
直接调用算法即可
效果
5.淡入淡出
高斯图切换的太过突兀,所以需要淡入淡出。用一个比较厉害的drawable::TransitionDrawable
用法你一看就能明白
private void setBlurImage(RelativeLayout bg) { int position = s.getPosition(); Drawable d = array.get(position); if (old == null) { bg.setBackgroundDrawable(d); } else { TransitionDrawable transitionDrawable = new TransitionDrawable(new Drawable[]{ old,d}); bg.setBackgroundDrawable(transitionDrawable); transitionDrawable.startTransition(500); } old = d; }
但是有个巨坑,第一个item和最后一个item不会默认居中,所以会有一个两次的调用。比如0滑到1是ok的,但是1滑到0,会在1滑到0这个原有的基础上再进行一个滑动->0滑到0。所以判重return即可。
private Drawable old; private void setBlurImage(RelativeLayout bg) { int position = s.getPosition(); Drawable d = array.get(position); if (d == old) { return; } if (old == null) { bg.setBackgroundDrawable(d); } else { TransitionDrawable transitionDrawable = new TransitionDrawable(new Drawable[]{ old,d}); bg.setBackgroundDrawable(transitionDrawable); transitionDrawable.startTransition(500); } old = d; }
效果
全部代码,特别清晰,加了注释,原文用了高大上的架构,我看不懂
public class Test { private Context context; private ScrollManager s; private int[] res = {R.drawable.face_register,R.drawable.tmp_permission,R.drawable.village}; private final SparseArray<Drawable> array; public Test(RecyclerView rv, final RelativeLayout bg) { context = rv.getContext(); //常规 rv.setAdapter(new Adapter()); LinearLayoutManager m = new LinearLayoutManager(context); m.setOrientation(LinearLayoutManager.HORIZONTAL); rv.setLayoutManager(m); //自动居中 LinearSnapHelper h = new LinearSnapHelper(); h.attachToRecyclerView(rv); //页边距 rv.addItemDecoration(new GalleryItemDecoration()); //动画 s = new ScrollManager(rv); //高斯模糊 //初始化高斯模糊图 array = init(); setBlurImage(bg); rv.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE) { setBlurImage(bg); } } }); } private SparseArray<Drawable> init() { SparseArray<Drawable> array = new SparseArray<>(); for (int i = 0; i < 3; i ++) { int r = res[i]; Bitmap b = BitmapFactory.decodeResource(context.getResources(), r); Bitmap nb = BlurBitmapUtil.blurBitmap(context, b, 15f); Drawable nd = new BitmapDrawable(nb); array.put(i,nd); } return array; } private Drawable old; private void setBlurImage(RelativeLayout bg) { int position = s.getPosition(); Drawable d = array.get(position); if (d == old) { return; } if (old == null) { bg.setBackgroundDrawable(d); } else { TransitionDrawable transitionDrawable = new TransitionDrawable(new Drawable[]{ old,d}); bg.setBackgroundDrawable(transitionDrawable); transitionDrawable.startTransition(500); } old = d; } class Adapter extends RecyclerView.Adapter<CommonViewHolder> { @Override public CommonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new CommonViewHolder(LayoutInflater.from(context).inflate(R.layout.item,paren