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);
     }
   }
 }

总结

标签:android,水波纹
0
投稿

猜你喜欢

  • 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
  • Android实现倒计时效果

    2021-10-13 03:25:29
  • 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
  • 如何使用C语言将数字、字符等数据写入、输出到文本文件中

    2023-09-07 12:09:07
  • Java线程安全中的有序性浅析

    2023-07-12 03:07:58
  • Android 正则表达式验证手机号、姓名(包含少数民族)、身份证号

    2022-05-26 02:17:11
  • 详解WPF中用户控件和自定义控件的使用

    2023-07-25 12:20:26
  • Mybatis注解实现多数据源读写分离详解

    2021-12-15 21:44:16
  • 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
  • asp之家 软件编程 m.aspxhome.com