布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <com.ee.MyWave android:layout_width="match_parent" android:layout_height="match_parent" > </com.ee.MyWave> </RelativeLayout>
类
package com.ee; 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.view.MotionEvent; import android.view.View; /** * 水波纹效果 */ public class MyWave extends View { /** * 定义一个水波浪类(一个圆环包括圆心、半径、画笔(需要绘制)) */ private class Wave { // 圆心 int pointX; int pointY; // 半径 int radius; // 画笔 Paint paint; } // 二个相临波浪中心点的最小距离 private static final int DIS_SOLP = 13; // 是否有水波浪 protected boolean isRunning = false; /** * 第一步构造器 */ // 定义水波纹的集合 private ArrayList<Wave> wList; public MyWave(Context context, AttributeSet attrs) { super(context, attrs); // 初始化创建水波纹集合 wList = new ArrayList<MyWave.Wave>(); } /** * touch事件 */ @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); switch (event.getAction()) { // 按下屏幕、滑动都可以产生水波 case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: // 得到down、move的圆心 int x = (int) event.getX(); int y = (int) event.getY(); // 如果水波纹集合为空,就绘制一个水波纹 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); } } ; break; default: break; } return true; } /* * 定义4种色彩的水波 */ private int[] colors = new int[] { Color.BLUE, Color.RED, Color.YELLOW, Color.GREEN }; /** * 添加波浪 */ 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); } /** * 绘制水波纹 */ @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); } } /* * 运用消息机制 */ private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { // 接受到发送过来的消息进行相应的操作 // 刷新数据 flushData(); // 刷新页面 invalidate(); // 循环动画 if (isRunning) { handler.sendEmptyMessageDelayed(0, 50); } }; }; /** * 刷新数据(操作环形水波的透明度以及半径变化) */ 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); continue; } // 每次透明度值减5 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; } } }