Android实现简单水波纹效果
作者:wanxiaofan 发布时间:2021-11-09 12:40:45
标签:Android,水波纹
本文为大家分享了Android实现水波纹效果展示的具体代码,供大家参考,具体内容如下
一、效果
二、实现原理
自定义view,使用Path和贝塞尔曲线绘制,然后不断刷新,并且改变X、Y的值
主要知识点rQuadTo的使用
三、实现
WaveView.java
public class WaveView extends View {
private Paint mPaint;
private final Path mPath;
//波长
private int wavelength = 500;
private int originY=800;
private int dx,dy;
public WaveView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
mPath = new Path();
mPaint.setColor(Color.GREEN);
mPaint.setStrokeWidth(5);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
// startanimation();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//重置path
mPath.reset();
// 改变y的起始坐标
if(dy<originY+150){
dy+=10;
}
int halfWaveLength = wavelength / 2;
mPath.moveTo(-wavelength + dx, originY-dy);
//屏幕多宽,画多少
for (int i = -wavelength; i <= getWidth() + wavelength; i += wavelength) {
/**
* 相对绘制二阶贝塞尔曲线(相对于自己的起始点--也即是上一个曲线的终点 )
* float dx1 相对于上一个曲线的终点 的距离
* float dy1
* float dx2
* float dy2
*/
mPath.rQuadTo(halfWaveLength / 2, -150, halfWaveLength, 0);
mPath.rQuadTo(halfWaveLength / 2, 150, halfWaveLength, 0);
}
//颜色填充
//画一个封闭的空间
mPath.lineTo(getWidth(), getHeight());
mPath.lineTo(0, getHeight());
mPath.close();
canvas.drawPath(mPath, mPaint);
// //设置起始点坐标
// path.moveTo(100,400);
// //二阶贝塞尔曲线1
// path.quadTo(250,200,400,400);
// //二阶贝塞尔曲线2
// path.quadTo(550,600,700,400);
// //关闭路径(将起点和终点闭合)
// path.close();
// path.moveTo(100,700);
// path.cubicTo(50,500,550,500,700,700);
}
public void startanimation() {
ValueAnimator animator = ValueAnimator.ofInt(0, wavelength);
animator.setDuration(1000);
animator.setInterpolator(new LinearInterpolator());
//无限循环
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
dx = (int) animation.getAnimatedValue();
postInvalidate();
}
});
animator.start();
}
}
最后把这个当成一个控件使用就可以。
来源:https://blog.csdn.net/wanxiaofan/article/details/77451384


猜你喜欢
- 比如:int (*foo)(int arg),记住要和另一个指针函数区分开来,类似这样:int *foo(int arg).比如我们可以这样
- Java 字符串反转问题:给一个字符串,比如 “I love china”, 把字符反转后变成 “china love I”思路
- 今天我来写一篇关于利用WPF来实现Windows的资源管理器功能,当然只是局部实现这个功能,因为在很多时候我们需要来实现对本机
- 引入字体首先在项目中创建fonts目录,然后将将ttf文件放到该目录下,然后在pubspec文件中添加该字体文件,如:...flutter:
- 本文实例为大家分享了Android自定义ViewGroup多行多列的具体代码,供大家参考,具体内容如下先看下效果图每行两个子孩子每行一个子孩
- 在activity级下使用this表示contextkotlin中取消了xxxActivity.this的用法,所以我们可以在activit
- 此解决方案是针对window的,因为日志默认保存路径在C盘,linux忽略。学习RocketMQ过程中,总是出现com.alibaba.ro
- 性能优化的帮助工具:MAT,Memory Monitor(属于AndroidMonitor中一个模块),HeapTool(查看堆
- 卫星菜单 ArcMenu 相信大家接触安卓,从新手到入门的过渡,就应该会了解到卫星菜单、抽屉、Xutils、Coolmenu、一些大神封装好
- C++虚类相当于java中的抽象类,与接口的不同之处是:1.一个子类只能继承一个抽象类(虚类),但能实现多个接口2.一个抽象类可以有构造方法
- 前端页面功能模块化拆分当一个系统的功能很多时,不可能所有功能模块的页面都写在一个页面里面,这时就需要将不同功能模块的页面拆分出去,就像模板一
- Zookeeper和Eureka哪个更好?1、CAP理论一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求C:数据一致性
- Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建
- Service概念及用途:Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们
- 一、什么是方法的重载?方法的重载是指一个类中可以定义多个方法名相同,但参数不同的方法。调用时,会根据不同的参数自动匹配对应的方法。二、构成方
- 下面的代码将发生死循环:package com.zzj.concurrency;public class VolatileObjectTes
- 本文基于SpringBoot 2.5.0-M2讲解Spring中Lifecycle和SmartLifecycle的作用和区别,以及如何控制S
- 创建SpringBoot项目可以通过两种方式1、通过访问:https://start.spring.io/,SpringBoot的官方网站进
- 前言Elasticsearch是一个非常流行的搜索引擎,已经成为了许多企业的首选解决方案。然而,我们要想成为一个优秀的程序员,就必须掌握各种
- 本文实例讲述了Spring实战之SpEl语法。分享给大家供大家参考,具体如下:一 Beanpackage org.crazyit.app.d