源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-04-28 11:52 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Android实现自定义华丽的水波纹效果
[b]先来看看效果[/b] [img]http://files.jb51.net/file_images/article/201608/2016831162506409.gif?2016731162539[/img] [b]实现效果[/b] 模拟水波纹的效果:点击屏幕就有圆环出现,半径从小到大,透明度从大到小(0为透明) [b]实现思路[/b]       1.自定义类继承View。       2.定义每个圆环的实体类 Wave,并初始化绘制圆环的画笔的数据。       3.重写onTouchEvent方法,down时,获得坐标点,做为圆环圆心。       4.发送handler信息,对数据进行修改,刷新页面。       5.重写onDraw方法,绘制一个圆环。 [b]1. 自定义类继承View[/b] 新建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>();
  }
[b]2. 定义实体类 Wave[/b]
/**
* 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;
  }
}
[b]3. 重写onTouchEvent方法[/b] 获得圆心,并且删除集合中透明度为0的圆环,通知handler调用[code]onDraw()[/code]方法
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);
      }
    }
  }
}
[b]4. 重写onDraw()方法,循环绘制圆环[/b]
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);
      }
    }
  }
[b]总结[/b] 以上就是Android实现自定义水波纹效果的全部内容,怎么样?实现的效果不错吧,感兴趣的小伙伴们快快自己动手实践起来,希望这篇文章对大家的学习和工作能有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部