package com.example.waterview;
import java.util.ArrayList;
import android.annotation.SuppressLint;
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 MyView extends View{
private int[] colors = new int[] { Color.BLUE, Color.RED, Color.YELLOW,
Color.GREEN, Color.BLACK, Color.DKGRAY };
// /控制是否继续执行动画
protected boolean isRunning = false;
/**
* 装圆的集合
*/
private ArrayList<Wave> wList;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
wList = new ArrayList<MyView.Wave>();
}
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
System.out.println(wList.size() + "-----------");
// 刷新数据
flushData();
// 刷新页面
invalidate();
if (isRunning) {
handler.sendEmptyMessageDelayed(1, 50);
}
break;
default:
break;
}
};
};
@SuppressLint({ "ClickableViewAccessibility", "NewApi" })
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
int x = (int) event.getX();
int y = (int) event.getY();
setCircle(x, y);
System.out.println(x + "====" + y);
break;
}
return true;
}
/**
* 更新圆的大小和透明度
*/
protected void flushData() {
for (int i = 0; i < wList.size(); i++) {
Wave wave = wList.get(i);
// 获得画笔透明度
int alpha = wave.p.getAlpha();
// 透明的越来越高
alpha = alpha - 5;
if (alpha < 5) {
alpha = 0;
wList.remove(i);
// isRunning=false;
}
// 设置的透明度越来越高
wave.p.setAlpha(alpha);
// 扩大半径
wave.r = wave.r + 3;
wave.p.setStrokeWidth(wave.r / 3);
}
if (wList.size() == 0) {
isRunning = false;
}
}
/**
* 设置圆
*
* @param x
* @param y
*/
private void setCircle(int x, int y) {
if (wList.size() == 0) {
createAndAddCircle(x, y);
isRunning = true;
handler.sendEmptyMessage(1);
} else {
createAndAddCircle(x, y);
}
}
@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);
}
}
/**
* 创造圆并且添加
*/
private void createAndAddCircle(int x, int y) {
Wave wave = new Wave();
wave.cx = x;
wave.cy = y;
Paint paint = new Paint();
paint.setStyle(Style.STROKE);
paint.setAntiAlias(true);
paint.setColor(colors[(int) (Math.random() * 6)]);
wave.p = paint;
wList.add(wave);
}
// 圆的封装类
private class Wave {
// 圆心
int cx;
int cy;
// 画笔
Paint p;
// 半径
int r;
}
}
Android中自定义水波纹
最新推荐文章于 2023-02-24 21:06:49 发布