地震波

先说说思路,看图
这里写图片描述
如图有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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值