`
liming1022
  • 浏览: 8109 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

水波纹的效果

 
阅读更多

今天要实现的是水波纹效果,很炫的哦,可以拿来做一些特效。

以下是代码:

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

 

1
0
分享到:
评论
1 楼 yingli0318 2014-11-27  

相关推荐

Global site tag (gtag.js) - Google Analytics