地震波

来源:互联网 发布:黑骑士卫星知乎 编辑:程序博客网 时间:2024/05/21 14:45

先说说思路,看图
这里写图片描述
如图有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方法,不断画圆环

@Overridepublic 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

原创粉丝点击