Android中自定义水波纹

package com.example.waterview;

import java.util.ArrayList;

import android.annotation.SuppressLint;
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 MyView extends View{
	private int[] colors = new int[] { Color.BLUE, Color.RED, Color.YELLOW,
			Color.GREEN, Color.BLACK, Color.DKGRAY };
	// /控制是否继续执行动画
	protected boolean isRunning = false;

	/**
	 * 装圆的集合
	 */
	private ArrayList<Wave> wList;

	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		wList = new ArrayList<MyView.Wave>();
	}

	Handler handler = new Handler() {

		public void handleMessage(android.os.Message msg) {

			switch (msg.what) {
			case 1:
				System.out.println(wList.size() + "-----------");
				// 刷新数据
				flushData();
				// 刷新页面
				invalidate();

				if (isRunning) {
					handler.sendEmptyMessageDelayed(1, 50);

				}

				break;

			default:
				break;
			}

		};

	};

	@SuppressLint({ "ClickableViewAccessibility", "NewApi" })
	@Override
	public boolean onTouchEvent(MotionEvent event) {

		switch (event.getAction()) {
		case MotionEvent.ACTION_MOVE:
			int x = (int) event.getX();
			int y = (int) event.getY();
			setCircle(x, y);
			System.out.println(x + "====" + y);
			break;
		}

		return true;
	}

	/**
	 * 更新圆的大小和透明度
	 */
	protected void flushData() {
		for (int i = 0; i < wList.size(); i++) {

			Wave wave = wList.get(i);
			// 获得画笔透明度
			int alpha = wave.p.getAlpha();

			// 透明的越来越高
			alpha = alpha - 5;
			if (alpha < 5) {
				alpha = 0;
				wList.remove(i);
				// isRunning=false;
			}
			// 设置的透明度越来越高
			wave.p.setAlpha(alpha);
			// 扩大半径
			wave.r = wave.r + 3;

			wave.p.setStrokeWidth(wave.r / 3);
		}
		if (wList.size() == 0) {
			isRunning = false;
		}
	}

	/**
	 * 设置圆
	 * 
	 * @param x
	 * @param y
	 */
	private void setCircle(int x, int y) {

		if (wList.size() == 0) {
			createAndAddCircle(x, y);
			isRunning = true;
			handler.sendEmptyMessage(1);
		} else {

			createAndAddCircle(x, y);

		}

	}

	@Override
	protected void onDraw(Canvas canvas) {
		for (int i = 0; i < wList.size(); i++) {
			Wave wave = wList.get(i);
			canvas.drawCircle(wave.cx, wave.cy, wave.r, wave.p);

		}
	}

	/**
	 * 创造圆并且添加
	 */
	private void createAndAddCircle(int x, int y) {

		Wave wave = new Wave();
		wave.cx = x;
		wave.cy = y;
		Paint paint = new Paint();
		paint.setStyle(Style.STROKE);
		paint.setAntiAlias(true);
		paint.setColor(colors[(int) (Math.random() * 6)]);
		wave.p = paint;
		wList.add(wave);

	}

	// 圆的封装类
	private class Wave {
		// 圆心
		int cx;
		int cy;

		// 画笔
		Paint p;
		// 半径
		int r;
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值