RecycleViewカスタムItemDecoration(2)

package com.example.zyl.learnsql.recycleview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Shader;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;

import com.example.zyl.learnsql.R;

/**
 * @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;

    private Bitmap mBitmap;

    private Bitmap drawOverBitmap;

    public LinearItemDecoration() {
        mPaint = new Paint();
        mPaint.setColor(Color.BLUE);
    }

    public void setLeftDrawable(Context context, int drawableId) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 2;
        mBitmap = BitmapFactory.decodeResource(context.getResources(), drawableId, options);

        drawOverBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.analyze_icon_3,options);

    }

    /**
     * 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;
        outRect.left = 200;
//        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);
            if (mBitmap != null) {
                c.drawBitmap(mBitmap, 0, cy, mPaint);
            }
        }


    }


    /**
     * 可以看到当图片过大时,在超出getItemOffsets函数所设定的outRect范围的部分将是不可见的。
     * 这是因为在整个绘制流程中,是选调用ItemDecoration的onDraw函数,
     * 然后再调用Item的onDraw函数,最后调用ItemDecoration的onDrawOver函数。
     * 所以在ItemDecoration的onDraw函数中绘制的内容,当超出边界时,会被Item所覆盖。
     * 但是因为最后才调用ItemDecoration的OnDrawOver函数,
     * 所以在onDrawOver中绘制的内容就不受outRect边界的限制,可以覆盖Item的区域显示。
     *
     * @param c
     * @param parent
     * @param state
     */
    @Override
    public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);
            int index = parent.getChildAdapterPosition(child);
            int left = layoutManager.getLeftDecorationWidth(child);
            if (index % 5 == 0) {
                c.drawBitmap(drawOverBitmap,left-drawOverBitmap.getWidth()/2,child.getTop()+child.getHeight()/2,mPaint);
            }
        }

        //绘制渐变蒙版
        View child0 = parent.getChildAt(0);
        LinearGradient gradient = new LinearGradient(parent.getWidth()/2,0,
                parent.getWidth()/2,child0.getHeight()*3,0xff0000ff, 0x000000ff, Shader.TileMode.CLAMP);
        mPaint.setShader(gradient);
        c.drawRect(0,0,parent.getWidth(),child0.getHeight()*3,mPaint);
    }

}













ます。https://www.jianshu.com/p/5a70f5cf48cbで再現

おすすめ

転載: blog.csdn.net/weixin_34015566/article/details/91239842
おすすめ