转载请标明出处: blog.csdn.net/airsaid/art…
本文出自:周游的博客
实现效果
使用
XML中:
代码中:
DiffuseView mDiffuseView = (DiffuseView) findViewById(R.id.diffuseView)
mDiffuseView.start()
mDiffuseView.stop()
属性&方法
属性名 | java方法 | 作用 |
---|---|---|
diffuse_color | setColor(int colorId) | 设置扩散圆颜色 |
diffuse_coreColor | setCoreColor(int colorId) | 设置中心圆颜色 |
diffuse_coreImage | setCoreImage(int imageId) | 设置中心圆图片 |
diffuse_coreRadius | setCoreRadius(int radius) | 设置中心圆半径 |
diffuse_maxWidth | setMaxWidth(int maxWidth) | 设置最大扩散宽度 |
diffuse_width | setDiffuseWidth(int width) | 设置扩散圆宽度,值越小越宽 |
代码
/**
* Created by zhouyou on 2016/9/27.
* Class desc:
*
* 这是一个自定义圆圈扩散View
*/
public class DiffuseView extends View {
/** 扩散圆圈颜色 */
private int mColor = getResources().getColor(R.color.colorAccent);
/** 圆圈中心颜色 */
private int mCoreColor = getResources().getColor(R.color.colorPrimary);
/** 圆圈中心图片 */
private Bitmap 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<>();
private Paint mPaint;
public DiffuseView(Context context) {
this(context, null);
}
public DiffuseView(Context context, AttributeSet attrs) {
this(context, attrs, -1);
}
public DiffuseView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DiffuseView, defStyleAttr, 0);
mColor = typedArray.getColor(R.styleable.DiffuseView_diffuse_color, mColor);
mCoreColor = typedArray.getColor(R.styleable.DiffuseView_diffuse_coreColor, mCoreColor);
mCoreRadius = typedArray.getFloat(R.styleable.DiffuseView_diffuse_coreRadius, mCoreRadius);
mDiffuseWidth = typedArray.getInt(R.styleable.DiffuseView_diffuse_width, mDiffuseWidth);
mMaxWidth = typedArray.getInt(R.styleable.DiffuseView_diffuse_maxWidth, mMaxWidth);
int imageId = typedArray.getResourceId(R.styleable.DiffuseView_diffuse_coreImage, -1);
if(imageId != -1) mBitmap = BitmapFactory.decodeResource(getResources(), imageId);
}
private void init() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
mAlphas.add(255);
mWidths.add(0);
}
@Override
public void invalidate() {
if(hasWindowFocus()){
super.invalidate();
}
}
@Override
public void onDraw(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 < mMaxWidth){
mAlphas.set(i, alpha - 1);
mWidths.set(i, width + 1);
}
}
if (mWidths.get(mWidths.size() - 1) == mMaxWidth / mDiffuseWidth) {
mAlphas.add(255);
mWidths.add(0);
}
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 void start() {
mIsDiffuse = true;
invalidate();
}
/**
* 停止扩散
*/
public void stop() {
mIsDiffuse = false;
}
/**
* 是否扩散中
*/
public boolean isDiffuse(){
return mIsDiffuse;
}
/**
* 设置扩散圆颜色
*/
public void setColor(int colorId){
mColor = colorId;
}
/**
* 设置中心圆颜色
*/
public void setCoreColor(int colorId){
mCoreColor = colorId;
}
/**
* 设置中心圆图片
*/
public void setCoreImage(int imageId){
mBitmap = BitmapFactory.decodeResource(getResources(), imageId);
}
/**
* 设置中心圆半径
*/
public void setCoreRadius(int radius){
mCoreRadius = radius;
}
/**
* 设置扩散圆宽度(值越小宽度越大)
*/
public void setDiffuseWidth(int width){
mDiffuseWidth = width;
}
/**
* 设置最大宽度
*/
public void setMaxWidth(int maxWidth){
mMaxWidth = maxWidth;
}
}
源码下载
GitHub:github.com/Airsaid/Dif…