先说说思路,看图
如图有4个实心圆环,每个实心圆环的透明度不同,从内到外,圆环的透明度从不透明到全透明。
代码实现时,我们不断的去画圆环,并且每画一次就改变圆环的透明度和半径大小。初始时,先画一个圆环,不断减少透明度和增加圆环半径,当圆环半径增加到一个限度时,开始画内层圆环并不断减少透明度和增加圆环半径,每增加一个圆环就保存起来,当增加到4个圆环是就删除掉最外层那个圆环,这样就看起来地震波效果了。
效果图
重写onMeasure方法,计算出最外层圆环的最大半径maxWidth,并且初始化第一个圆环的数据,透明度和半径初始值。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
maxWidth = getMeasuredWidth() / 2;
if (maxWidth > 0 && alphaList.isEmpty() && startWidthList.isEmpty()) {
//圆心的透明度,如此判断是为了防止最外层圆环透明度未减少为0就被移除,从而产生闪屏
alphaList.add(maxWidth > 255 ? 255 : maxWidth);
startWidthList.add(0f);
}
}
重点来了,重写onDraw方法,不断画圆环
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
//依次绘制 同心圆
for (int i = 0; i < alphaList.size(); i++) {//画出所有的圆环
int alpha = alphaList.get(i);
float startWidth = startWidthList.get(i);
paint.setAlpha(alpha);
canvas.drawCircle(getWidth() / 2, getHeight() / 2, startWidth, paint);
//同心圆扩散
if (isStarting && alpha > 0 && startWidth < maxWidth) {//不断改变每个圆环的透明度和半径值
alphaList.set(i, alpha - 1);
startWidthList.set(i, startWidth + 1);
}
}
if (isStarting && (startWidthList.get(startWidthList.size() - 1).intValue()) == maxWidth / CircleNum) {//内层圆环的半径达到规定宽度时,增加一个圆环
alphaList.add(maxWidth > 255 ? 255 : maxWidth);
startWidthList.add(0f);
}
//同心圆数量达到5个,删除最外层圆
if (isStarting && startWidthList.size() == (CircleNum + 1)) {//当圆环数量达到5个个时,删除最外层圆环
startWidthList.remove(0);
alphaList.remove(0);
}
//刷新界面
invalidate();
}
代码地址
http://download.csdn.net/download/gaopin_xianlu/10149065