欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现自定义华丽的水波纹效果

程序员文章站 2024-03-06 15:34:08
先来看看效果 实现效果 模拟水波纹的效果:点击屏幕就有圆环出现,半径从小到大,透明度从大到小(0为透明) 实现思路    ...

先来看看效果

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实现自定义水波纹效果的全部内容,怎么样?实现的效果不错吧,感兴趣的小伙伴们快快自己动手实践起来,希望这篇文章对大家的学习和工作能有所帮助。