/**
* Created by zhouyou on 2016/9/27.
* Class desc:
*
* 这是一个自定义圆圈扩散View*/
public classDiffuseView extends View {/** 扩散圆圈颜色*/
private int mColor =getResources().getColor(R.color.colorAccent);/** 圆圈中心颜色*/
private int mCoreColor =getResources().getColor(R.color.colorPrimary);/** 圆圈中心图片*/
privateBitmap mBitmap;/** 中心圆半径*/
private float mCoreRadius = 150;/** 扩散圆宽度*/
private int mDiffuseWidth = 3;/** 最大宽度*/
private Integer mMaxWidth = 255;/** 是否正在扩散中*/
private boolean mIsDiffuse = false;//透明度集合
private List mAlphas = new ArrayList<>();//扩散圆半径集合
private List mWidths = new ArrayList<>();privatePaint mPaint;publicDiffuseView(Context context) {this(context, null);
}publicDiffuseView(Context context, AttributeSet attrs) {this(context, attrs, -1);
}public DiffuseView(Context context, AttributeSet attrs, intdefStyleAttr) {
super(context, attrs, defStyleAttr);
init();
TypedArray a= context.obtainStyledAttributes(attrs, R.styleable.DiffuseView, defStyleAttr, 0);
mColor=a.getColor(R.styleable.DiffuseView_diffuse_color, mColor);
mCoreColor=a.getColor(R.styleable.DiffuseView_diffuse_coreColor, mCoreColor);
mCoreRadius=a.getFloat(R.styleable.DiffuseView_diffuse_coreRadius, mCoreRadius);
mDiffuseWidth=a.getInt(R.styleable.DiffuseView_diffuse_width, mDiffuseWidth);
mMaxWidth=a.getInt(R.styleable.DiffuseView_diffuse_maxWidth, mMaxWidth);int imageId = a.getResourceId(R.styleable.DiffuseView_diffuse_coreImage, -1);if(imageId != -1) mBitmap =BitmapFactory.decodeResource(getResources(), imageId);
a.recycle();
}private voidinit() {
mPaint= newPaint();
mPaint.setAntiAlias(true);
mAlphas.add(255);
mWidths.add(0);
}
@Overridepublic voidinvalidate() {if(hasWindowFocus()){
super.invalidate();
}
}
@Overridepublic voidonDraw(Canvas canvas) {//绘制扩散圆
mPaint.setColor(mColor);for (int i = 0; i < mAlphas.size(); i++) {//设置透明度
Integer alpha = mAlphas.get(i);
mPaint.setAlpha(alpha);//绘制扩散圆
Integer width = mWidths.get(i);
canvas.drawCircle(getWidth()/ 2, getHeight() / 2, mCoreRadius +width, mPaint);if(alpha > 0 && width
mAlphas.set(i, alpha - 1);
mWidths.set(i, width + 1);
}
}//判断当扩散圆扩散到指定宽度时添加新扩散圆
if (mWidths.get(mWidths.size() - 1) == mMaxWidth /mDiffuseWidth) {
mAlphas.add(255);
mWidths.add(0);
}//超过10个扩散圆,删除最外层
if(mWidths.size() >= 10){
mWidths.remove(0);
mAlphas.remove(0);
}//绘制中心圆及图片
mPaint.setAlpha(255);
mPaint.setColor(mCoreColor);
canvas.drawCircle(getWidth()/ 2, getHeight() / 2, mCoreRadius, mPaint);if(mBitmap != null){
canvas.drawBitmap(mBitmap, getWidth()/ 2 - mBitmap.getWidth() / 2, getHeight()/ 2 - mBitmap.getHeight() / 2, mPaint);
}if(mIsDiffuse){
invalidate();
}
}/**
* 开始扩散*/
public voidstart() {
mIsDiffuse= true;
invalidate();
}/**
* 停止扩散*/
public voidstop() {
mIsDiffuse= false;
}/**
* 是否扩散中*/
publicboolean isDiffuse(){returnmIsDiffuse;
}/**
* 设置扩散圆颜色*/
public void setColor(intcolorId){
mColor=colorId;
}/**
* 设置中心圆颜色*/
public void setCoreColor(intcolorId){
mCoreColor=colorId;
}/**
* 设置中心圆图片*/
public void setCoreImage(intimageId){
mBitmap=BitmapFactory.decodeResource(getResources(), imageId);
}/**
* 设置中心圆半径*/
public void setCoreRadius(intradius){
mCoreRadius=radius;
}/**
* 设置扩散圆宽度(值越小宽度越大)*/
public void setDiffuseWidth(intwidth){
mDiffuseWidth=width;
}/**
* 设置最大宽度*/
public void setMaxWidth(intmaxWidth){
mMaxWidth=maxWidth;
}
}