我们接着上一篇 Android CardView全解析(一)往下讲哈,上一节为了演示一下RoundRectDrawableWithShadow的用法就一股脑写完了,也没有注释,这一节我们将针对RoundRectDrawableWithShadow做一下注释。
上一节最后的效果图:
跟系统的cardview相比,感觉我们设置的阴影有点丑哈~~我们去掉我们设置的shadowstartcolor跟shadowendcolor,然后运行我们的代码:
是不是跟系统一样了呢?? 至于要配置什么颜色的shadow,大家自己去配置哈~~
package com.yasin.round.card;
import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.RadialGradient;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
/**
* Created by leo on 17/4/1.
*/
public class RoundRectDrawableWithShadow extends Drawable {
//下移的偏移量
private static final float SHADOW_MULTIPLIER = 1.5f;
//画圆角矩形帮助类
public static RoundRectHelper mRoundRectHelper;
//背景颜色
private ColorStateList mBgColor;
//四周shadow起始颜色
private int mShadowStartColor;
//四周shadow结束颜色
private int mShadowEndColor;
//圆角半径
private float mCornerRadius;
//阴影的宽度
private float mShadowSize;
//是否需要进行初始化(防止多次调用初始化方法)
private boolean mDirty = true;
//内容部分的矩形范围
private RectF mCardBounds = new RectF();
//画背景用的画笔
private Paint mPaint;
//画边角阴影的画笔
private Paint mCornerShadowPaint;
//画四周shadow的画笔
private Paint mEdgeShadowPaint;
//边角path路径
private Path mCornerShadowPath;
public RoundRectDrawableWithShadow(ColorStateList bgColor, int shadowStartColor, int shadowEndColor, float shadowSize, float radius) {
this.mShadowStartColor = shadowStartColor;
this.mShadowEndColor = shadowEndColor;
this.mShadowSize = shadowSize;
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
//设置view的背景颜色
setBackground(bgColor);
mCornerShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
mCornerShadowPaint.setStyle(Paint.Style.FILL);
//为了能使设置的corner更接近一个整数值
this.mCornerRadius = (int) (radius + .5f);
mCardBounds = new RectF();
mEdgeShadowPaint = new Paint(mCornerShadowPaint);
mEdgeShadowPaint.setAntiAlias(false);
}
private void setBackground(ColorStateList color) {
//如果用户有设置背景色的就用设置的背景色,如果没有就用透明色
mBgColor = (color == null) ? ColorStateList.valueOf(Color.TRANSPARENT) : color;