美文网首页Android技术知识Android开发
RecycleView自定义ItemDecoration

RecycleView自定义ItemDecoration

作者: 卖炭少年炭治郎 | 来源:发表于2019-05-30 09:24 被阅读8次
    package com.example.zyl.learnsql.recycleview;
    
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.support.annotation.NonNull;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    
    /**
     * @author zyl
     * <p>
     * <p>
     * 1.注意的是,getItemOffsets是针对每个Item都会走一次,也就是说每个Item的outRect都可以不同,
     * 但是onDraw和onDrawOver所整个ItemDecoration只执行一次的,并不是针对Item的,
     * 所以我们需要在onDraw和onDrawOver中绘图时,一次性将所有Item的ItemDecoration绘制完成。
     * 从上面也可以看出,这里在onDraw函数中绘图时,通过for循环对每一个item画上一个绿色圆。
     * @date 2019/5/24
     */
    public class LinearItemDecoration extends RecyclerView.ItemDecoration {
    
        private Paint mPaint;
    
        public LinearItemDecoration() {
            mPaint = new Paint();
            mPaint.setColor(Color.BLUE);
        }
    
    
        /**
         * getItemOffsets的主要作用就是给item的四周加上边距,实现的效果类似于margin,将item的四周撑开一些距离,
         * 在撑开这些距离后,我们就可以利用上面的onDraw函数,在这个距离上进行绘图了。
         *
         * @param outRect
         * @param view
         * @param parent
         * @param state
         */
        @Override
        public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
            super.getItemOffsets(outRect, view, parent, state);
            outRect.bottom = 1;
            double random = Math.random();
            if (random > 0) {
                outRect.left = (int) (200 * random);
            } else {
                outRect.left = 200;
            }
        }
    
        /**
         * Canvas c: 是指通过getItemOffsets撑开的空白区域所对应的画布,通过这个canvas对象,可以在getItemOffsets所撑出来的区域任意绘图
         *
         * @param c
         * @param parent
         * @param state
         */
        @Override
        public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
            super.onDraw(c, parent, state);
            int childCount = parent.getChildCount();
    
            RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
    
            for (int i = 0; i < childCount; i++) {
                View child = parent.getChildAt(i);
                //动态获取每个item的左边的宽度
                int left = layoutManager.getLeftDecorationWidth(child);
                float cx = left / 2;
                float cy = child.getTop() + child.getHeight() / 2;
                c.drawCircle(cx, cy, 20, mPaint);
            }
    
    
        }
    
    
        @Override
        public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
            super.onDrawOver(c, parent, state);
        }
    
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    相关文章

      网友评论

        本文标题:RecycleView自定义ItemDecoration

        本文链接:https://www.haomeiwen.com/subject/rtogzqtx.html