Android RecyclerView实现Gallery、修复LinearSnapHelper首尾item不居中的坑

本文介绍了如何在Android中使用RecyclerView实现Gallery效果,包括自动居中、设置边距、实现动画、高斯模糊和淡入淡出。通过LinearSnapHelper解决了首尾item不居中的问题,同时分享了在滑动过程中遇到的动画重复问题及其解决方案。
摘要由CSDN通过智能技术生成

学习自

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值