控件效果图
控件说明
默认水波纹正常波动,手机按下时波纹快速波动
实现思路
继承ImageView控件,ImageView背景图默认为蓝底货车文字图片,重写ImageView的onDraw函数,分为以下几个步骤开始画圈:
1.定义三个常量,一个是每次圆圈增大是半径增加的值widthInc,二是每次圆圈增大时透明度减少的值alphaDec,三是最近添加的圆圈透明度小于addOneCirleApha
,开始画第下一个圆圈
2.定义两个列表:1.alphaList 保存圆圈对应的透明度 2.startWidthList保存圆圈对应的半径
3.先画一个和蓝色圆圈背景半径同样大小的蓝色同心圆圈,把画笔设置成Paint.Style.STROKE,这样圆圈就是空心圆
4.画完之后再次调用ondraw时再画一个半径比上次同心圆大的圆圈,半径增加widthInc,透明度减少alphaDec
5.判断最近的一个圆圈的透明度是否小于addOneCirleApha,如果小于addOneCirleApha,开始绘制下一个圆圈
6.判断最外层的圆圈透明度是是否小于或等于零,如果满足条件,从startWidthList列表中删除这个圆圈
代码实现
for (int i = 0; i < alphaList.size(); i++) {
int alpha = Integer.parseInt(alphaList.get(i));
// 圆半径
int startWidth = Integer.parseInt(startWidthList.get(i));
paint.setAlpha(alpha);
canvas.drawCircle(getWidth() / 2, getHeight() / 2, startWidth,
paint);
if (isStarting && alpha > 0) {
int decAlpha = alpha - alphaDec;
if (decAlpha <= 0) {
decAlpha = 0;
}
alphaList.set(i, decAlpha + ""); // 画完圆圈后把透明度相应的减少alphaDec
startWidthList.set(i, (startWidth + widthInc) + "");
}
}
if (isStarting && Integer
.parseInt(alphaList.get(alphaList.size() - 1)) <= addOneCirleApha) {
alphaList.add(startalpha); //当最新的一个圆圈透明度小于addOneCirleApha时,再增加一个圆圈
startWidthList.add(startWidht);
}
if (isStarting && Integer.valueOf(alphaList.get(0)) == 0) {
startWidthList.remove(0); //当最早的一个圆圈的透明度等于0时,从列表中删除对应的源泉
alphaList.remove(0);
}
// 刷新界面
postInvalidateDelayed(postDelay); //控制圆圈的波纹波动速度,当postDelay数值越小时,波动越快,否则波动越慢,如果需要在手指按下时让波动速度加快,则减小postDelay的值