Android实现自定义华丽的水波纹效果
作者:daisy 发布时间:2023-10-03 23:12:50
标签:android,水波纹
先来看看效果
实现效果
模拟水波纹的效果:点击屏幕就有圆环出现,半径从小到大,透明度从大到小(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);
}
}
}
总结


猜你喜欢
- 前言今天是2021LOL全球总决赛,一直不被大家看好的EDG冲到了决赛对战韩国队的DK,可以说EDG面对如此强大的对手,想赢是比较难的,为了
- 电话号码输入框需求:三位,七位后有空格删除倒数第四,第八位会将空格也删除使用TextWatcherWhen an object of a t
- 本文实例讲述了java实现清理DNS Cache的方法。分享给大家供大家参考。具体分析如下:一、测试环境OS:Windows7 x64JDK
- 1.发生问题的场景我在用java获取一个接口的大JSON字符串,并赋值给String常量时,遇到了java: 常量字符串过长这个报错2.解决
- 混淆studio 使用Proguard进行混淆,其是一个压缩、优化和混淆java字节码文件的一个工具。功能:Shrinking(压缩)、Op
- 什么是NPOI?NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行
- 导入项目集成环境:IntelliJ IDEA 2020.1.2演示系统:DELL Windows 10Eclipse项目如何导入IDEA并成
- 本教程适合新手小白,Java7之前的版本是没有内置JavaFx的,Java7-10是内置JavaFx的,但是到了Java10以后的版本,Or
- 本文通过一个简单的小例子简述SharpZipLib压缩文件的常规用法,仅供学习分享使用,如有不足之处,还请指正。什么是SharpZipLib
- 目前为止,我遇到使用Tomcat有三种情况:第一,使用Eclipse,在Eclipse中配置Tomcat。第二,直接在Tomcat中部署项目
- maven运行依赖于 JAVA_HOME如果各位还没有配置 JAVA_HOME,可以参考我的另一篇博客 JDK环境变量配置 JDK 环境变量
- Java 8的18个常用日期处理一、简介伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API。J
- JVM内部结构图Java虚拟机主要分为五个区域:方法区、堆、Java栈、PC寄存器、本地方法栈。下面来看一些关于JVM结构的重要问题。1.哪
- 本地仓库是指存在于我们本机的仓库,在我们加入依赖时候,首先会跑到我们的本地仓库去找,如果找不到则会跑到远程仓库中去找。对于依赖的包大家可以从
- LayoutInflater.inflate源码详解LayoutInflater的inflate方法相信大家都不陌生,在Fragment的o
- 1. 树概念及结构1.1树概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看
- 前言我们知道移动应用页面跳转是非常重要的一部分,几乎我们的程序和用户打交道的就是页面,或者叫view,我们Android基本都是Activi
- 同步器简介 学习以来对线程的操作有很大的改观,从c/c++的mute
- java文件的多线程断点续传大致原理,供大家参考,具体内容如下谈到文件断点续传那么就离不开java.io.RandomAcessFile H
- 在进行一些小型APP的开发,或者是对拍照界面没有自定义要求时,我们可以用调起系统相机的方式快速完成拍照需求和不需读写权限进行读写操作的方案一