软件编程
位置:首页>> 软件编程>> Android编程>> Android实现自定义华丽的水波纹效果

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

作者:daisy  发布时间:2023-10-03 23:12:50 

标签:android,水波纹

先来看看效果

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

总结

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com