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