Android实现自定义华丽的水波纹效果
作者:daisy 时间:2023-10-03 23:12:50
先来看看效果
实现效果
模拟水波纹的效果:点击屏幕就有圆环出现,半径从小到大,透明度从大到小(0为透明)
实现思路
1.自定义类继承View。
2.定义每个圆环的实体类 Wave,并初始化绘制圆环的画笔的数据。
3.重写onTouchEvent方法,down时,获得坐标点,做为圆环圆心。
4.发送handler信息,对数据进行修改,刷新页面。
5.重写onDraw方法,绘制一个圆环。
1. 自定义类继承View
新建WaterWaveView2类继承View
public class WaterWaveView2 extends View {
//存放圆环的集合
private ArrayList<Wave> mList;
//界面刷新
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
invalidate();//刷新界面,会执行onDraw方法
}
};
public WaterWaveView2(Context context) {
this(context, null);
}
public WaterWaveView2(Context context, AttributeSet attrs) {
super(context, attrs);
mList = new ArrayList<Wave>();
}
2. 定义实体类 Wave
/**
* Created by HongJay on 2016/8/30.
* 把wave的数据封装成一个对象
*/
public class Wave {
public float x;//圆心x坐标
public float y;//圆心y坐标
public Paint paint; //画圆的画笔
public float width; //线条宽度
public int radius; //圆的半径
public int ranNum;//随机数
public int[] randomColor={Color.BLUE,Color.CYAN,
Color.GREEN,Color.MAGENTA,Color.RED,Color.YELLOW};
public Wave(float x, float y) {
this.x = x;
this.y = y;
initData();
}
/**
* 初始化数据,每次点击一次都要初始化一次
*/
private void initData() {
paint=new Paint();//因为点击一次需要画出不同的圆环
paint.setAntiAlias(true);//打开抗锯齿
ranNum=(int) (Math.random()*6);//[0,5]的随机数
paint.setColor(randomColor[ranNum]);//设置画笔的颜色
paint.setStyle(Paint.Style.STROKE);//描边
paint.setStrokeWidth(width);//设置描边宽度
paint.setAlpha(255);//透明度的设置(0-255),0为完全透明
radius=0;//初始化
width=0;
}
}
3. 重写onTouchEvent方法
获得圆心,并且删除集合中透明度为0的圆环,通知handler调用onDraw()
方法
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
float x = event.getX();
float y = event.getY();
deleteItem();
Wave wave = new Wave(x, y);
mList.add(wave);
//刷新界面
invalidate();
break;
case MotionEvent.ACTION_MOVE:
float x1 = event.getX();
float y1 = event.getY();
deleteItem();
Wave wave1 = new Wave(x1, y1);
mList.add(wave1);
invalidate();
break;
}
//处理事件
return true;
}
//删除透明度已经为0的圆环
private void deleteItem(){
for (int i = 0; i <mList.size() ; i++) {
if(mList.get(i).paint.getAlpha()==0){
mList.remove(i);
}
}
}
}
4. 重写onDraw()方法,循环绘制圆环
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//避免程序一运行就进行绘制
if (mList.size() > 0) {
//对集合中的圆环对象循环绘制
for (Wave wave : mList) {
canvas.drawCircle(wave.x, wave.y, wave.radius, wave.paint);
wave.radius += 3;
//对画笔透明度进行操作
int alpha = wave.paint.getAlpha();
if (alpha < 80) {
alpha = 0;
} else {
alpha -= 3;
}
//设置画笔宽度和透明度
wave.paint.setStrokeWidth(wave.radius / 8);
wave.paint.setAlpha(alpha);
//延迟刷新界面
mHandler.sendEmptyMessageDelayed(1, 100);
}
}
}
总结
标签:android,水波纹
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#获取真实IP地址实现方法
2022-01-05 11:35:49
Mybatis批量插入Oracle数据的方法实例
2021-05-24 23:32:31
JavaWeb使用Session和Cookie实现登录认证
2023-12-11 19:13:29
总结一次C++ 程序优化历程
2023-11-02 22:38:30
详解Spring-Boot中如何使用多线程处理任务
2022-05-14 13:10:40
C# 中用 Sqlparameter 的两种用法
2022-11-19 03:52:52
浅谈C#中的for循环与foreach循环
2021-08-23 03:27:38
Android使用GridView实现横向滚动效果
2022-01-29 13:32:16
![](https://img.aspxhome.com/file/2023/5/138235_0s.jpg)
Android实现倒计时效果
2021-10-13 03:25:29
![](https://img.aspxhome.com/file/2023/3/138643_0s.jpg)
Java实现导出ZIP压缩包的方法
2023-05-06 04:58:57
详解Java高级特性之反射
2021-06-09 14:01:06
c# wpf如何使用Blend工具绘制Control样式
2022-10-26 09:35:25
![](https://img.aspxhome.com/file/2023/5/69235_0s.gif)
如何使用C语言将数字、字符等数据写入、输出到文本文件中
2023-09-07 12:09:07
Java线程安全中的有序性浅析
2023-07-12 03:07:58
![](https://img.aspxhome.com/file/2023/4/96114_0s.png)
Android 正则表达式验证手机号、姓名(包含少数民族)、身份证号
2022-05-26 02:17:11
详解WPF中用户控件和自定义控件的使用
2023-07-25 12:20:26
![](https://img.aspxhome.com/file/2023/3/129693_0s.png)
Mybatis注解实现多数据源读写分离详解
2021-12-15 21:44:16
![](https://img.aspxhome.com/file/2023/1/62211_0s.jpg)
spring boot微服务场景下apollo加载过程解析
2022-05-20 13:55:32
java io读取文件操作代码实例
2023-04-12 08:53:57
浅谈JMeter engine启动原理
2022-02-22 03:06:47
![](https://img.aspxhome.com/file/2023/1/116831_0s.jpg)