android 动态圆形控件,Android 自定义控件之圆形扩散View(DiffuseView)

/**

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值