今天要实现的是水波纹效果,很炫的哦,可以拿来做一些特效。
以下是代码:
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; } }
评论