多个彩色水波纹扩散效果

 布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <com.ee.MyWave
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </com.ee.MyWave>

</RelativeLayout>

package com.ee;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * 水波纹效果
 */
public class MyWave extends View {
    /**
     * 定义一个水波浪类(一个圆环包括圆心、半径、画笔(需要绘制))
     */
    private class Wave {
        // 圆心
        int pointX;
        int pointY;
        // 半径
        int radius;
        // 画笔
        Paint paint;
    }

    // 二个相临波浪中心点的最小距离
    private static final int DIS_SOLP = 13;
    // 是否有水波浪
    protected boolean isRunning = false;

    /**
     * 第一步构造器
     */
    // 定义水波纹的集合
    private ArrayList<Wave> wList;

    public MyWave(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 初始化创建水波纹集合
        wList = new ArrayList<MyWave.Wave>();
    }

    /**
     * touch事件
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        switch (event.getAction()) {
        // 按下屏幕、滑动都可以产生水波
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
            // 得到down、move的圆心
            int x = (int) event.getX();
            int y = (int) event.getY();
            // 如果水波纹集合为空,就绘制一个水波纹
            if (wList.size() == 0) {
                // 绘制水波纹
                addPoint2List(x, y);
                // 修改状态,说明水波生成
                isRunning = true;
                // 此刻发送一个消息,说明绘制了一个水波
                handler.sendEmptyMessage(0);
            } else {
                // 如果水波集合不为空,就去最后一个绘制的环形水波
                Wave w = wList.get(wList.size() - 1);

                if (Math.abs(w.pointX - x) > DIS_SOLP
                        || Math.abs(w.pointY - y) > DIS_SOLP) {
                    addPoint2List(x, y);
                }
            }
            ;
            break;

        default:
            break;
        }
        return true;
    }

    /*
     * 定义4种色彩的水波
     */
    private int[] colors = new int[] { Color.BLUE, Color.RED, Color.YELLOW,
            Color.GREEN };

    /**
     * 添加波浪
     */
    private void addPoint2List(int x, int y) {
        // 创建一个水波类
        Wave w = new Wave();
        // 将滑动或者按下时候的坐标赋值给水波类
        w.pointX = x;
        w.pointY = y;
        // 创建画笔
        Paint pa = new Paint();
        // 画出水波(环形)设置颜色,抗锯齿,形状
        pa.setColor(colors[(int) (Math.random() * 4)]);
        pa.setAntiAlias(true);
        pa.setStyle(Style.STROKE);
        // 赋值
        w.paint = pa;
        // 往集合中添加一个环形水波
        wList.add(w);
    }

    /**
     * 绘制水波纹
     */
    @Override
    protected void onDraw(Canvas canvas) {
        for (int i = 0; i < wList.size(); i++) {
            Wave wave = wList.get(i);
            canvas.drawCircle(wave.pointX, wave.pointY, wave.radius, wave.paint);
        }
    }

    /*
     * 运用消息机制
     */
    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            // 接受到发送过来的消息进行相应的操作
            // 刷新数据
            flushData();
            // 刷新页面
            invalidate();
            // 循环动画
            if (isRunning) {
                handler.sendEmptyMessageDelayed(0, 50);
            }

        };
    };

    /**
     * 刷新数据(操作环形水波的透明度以及半径变化)
     */
    private void flushData() {

        for (int i = 0; i < wList.size(); i++) {

            Wave w = wList.get(i);

            // 如果透明度为 0 从集合中删除
            int alpha = w.paint.getAlpha();
            if (alpha == 0) {
                wList.remove(i);
                continue;
            }
            // 每次透明度值减5
            alpha -= 5;
            if (alpha < 5) {
                alpha = 0;
            }
            // 降低透明度
            w.paint.setAlpha(alpha);

            // 扩大半径
            w.radius = w.radius + 3;
            // 设置半径厚度
            w.paint.setStrokeWidth(w.radius / 3);
        }

        /*
         * 如果集合被清空,就停止刷新动画
         */
        if (wList.size() == 0) {
            isRunning = false;
        }
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值