Android实现自定义华丽的水波纹效果
程序员文章站
2024-03-07 14:53:21
先来看看效果
实现效果
模拟水波纹的效果:点击屏幕就有圆环出现,半径从小到大,透明度从大到小(0为透明)
实现思路
...
先来看看效果
实现效果
模拟水波纹的效果:点击屏幕就有圆环出现,半径从小到大,透明度从大到小(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实现自定义水波纹效果的全部内容,怎么样?实现的效果不错吧,感兴趣的小伙伴们快快自己动手实践起来,希望这篇文章对大家的学习和工作能有所帮助。