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