RecycleViewカスタムItemDecoration

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);
    }

}













ます。https://www.jianshu.com/p/9095fffb2a50で再現

おすすめ

転載: blog.csdn.net/weixin_34162401/article/details/91239838