Android自定义View实现水波纹效果

/*布局代码:*/
<com.dream.ripple.myringwave android:layout_width="match_parent" android:layout_height="match_parent"></com.dream.ripple.myringwave>
/*Activity代码:*/
package com.dream.ripple;

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.util.Log;
import android.view.MotionEvent;
import android.view.View;

/**
* 水波纹效果
*
* @author leo
*
*/
public class MyRingWave extends View {

/**
* 二个相临波浪中心点的最小距离
*/
private static final int DIS_SOLP = 13;

protected boolean isRunning = false;

private ArrayList wList;

public MyRingWave(Context context, AttributeSet attrs) {
super(context, attrs);
wList = new ArrayList();
}

private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {

// 刷新数据
flushData();
// 刷新页面
invalidate();
// 循环动画
if (isRunning) {
handler.sendEmptyMessageDelayed(0, 50);
}

};
};

@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);
		}
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		super.onTouchEvent(event);

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
		case MotionEvent.ACTION_MOVE:

			int x = (int) event.getX();
			int y = (int) event.getY();

			addPoint(x, y);

			break;

		default:
			break;
		}

		return true;

	}

	/**
	 * 添加新的波浪中心点
	 * 
	 * @param x
	 * @param y
	 */
	private void addPoint(int x, int y) {
		if (wList.size() == 0) {
			addPoint2List(x, y);
			/*
			 * 第一次启动动画
			 */
			isRunning = true;
			handler.sendEmptyMessage(0);
		} else {
			Wave w = wList.get(wList.size() - 1);

			if (Math.abs(w.cx - x) > DIS_SOLP || Math.abs(w.cy - y) > DIS_SOLP) {
addPoint2List(x, y);
}

}
;

}

/**
* 添加新的波浪
*
* @param x
* @param y
*/
private void addPoint2List(int x, int y) {
Wave w = new Wave();
w.cx = x;
w.cy = y;
Paint pa = new Paint();
pa.setColor(colors[(int) (Math.random() * 4)]);
pa.setAntiAlias(true);
pa.setStyle(Style.STROKE);

w.p = pa;

wList.add(w);
}

private int[] colors = new int[] { Color.CYAN, Color.RED, Color.YELLOW,
Color.GREEN };

/**
* 刷新数据
*/
private void flushData() {

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

			Wave w = wList.get(i);

			// 如果透明度为 0 从集合中删除
			int alpha = w.p.getAlpha();
			if (alpha == 0) {
				wList.remove(i); // 删除i 以后,i的值应该再减1
									// 否则会漏掉一个对象,不过,在此处影响不大,效果上看不出来。
				continue;
			}

			alpha -= 5;
			if (alpha < 5) {
				alpha = 0;
			}
			// 降低透明度
			w.p.setAlpha(alpha);

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

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

	/**
	 * 定义一个波浪
	 * 
	 * @author leo
	 */
	private class Wave {
		// 圆心
		int cx;
		int cy;

		// 画笔
		Paint p;
		// 半径
		int r;
	}
}
 版权声明:本文为AIDE教程网原创文章,转载请附上原文出处链接和本声明
本文链接: https://www.aidemx.cn/322.html

梦雪

专注于AIDE教程分享

    留下你的评论

    *评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

    相关推荐