今天要实现的是水波纹效果,很炫的哦,可以拿来做一些特效。
以下是代码:
public class MyWave extends View{
/**
* 二个相临波浪中心点的最小距离
*/
private static final int DIS_SOLP = 13;
/**
* true表示开始播放动画
* flase表示动画播放结束
*/
protected boolean isRunning = false;
/**
* 装一个一个的水波纹
*/
private ArrayList<Wave> wList;
public MyWave(Context context, AttributeSet attrs) {
super(context, attrs);
wList = new ArrayList<MyWave.Wave>();
}
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.pointX, wave.pointY, wave.radius, wave.paint);
}
}
@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.pointX - x)>DIS_SOLP || Math.abs(w.pointY-y)>DIS_SOLP){
addPoint2List(x,y);
}
};
}
/**
* 添加新的波浪
* @param x
* @param y
*/
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);
}
private int [] colors = new int[]{Color.BLUE,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.paint.getAlpha();
if(alpha == 0){
wList.remove(i); //删除i 以后,i的值应该再减1 否则会漏掉一个对象,不过,在此处影响不大,效果上看不出来。
continue;
}
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;
}
}
/**
* 定义一个水波浪(圆环)
* @author afu
*/
private class Wave {
//圆心
int pointX;
int pointY;
//画笔
Paint paint;
//半径
int radius;
}
}