本文实例为大家分享了android自定义WaveView水波纹控件的使用方法,供大家参考,具体内容如下

Github Repository and libaray

首先看下演示demo

demo中可以看到不同高度,不同速度,不同幅度的水波纹;你可以通过view的参数直接控制view的表现形式。

引入你的工程

在项目的根目录下的build.gradle文件中添加如下代码:

allprojects {

repositories {

...

maven { url 'https://jitpack.io' }

}

}

在你需要引用的module中添加如下依赖:

dependencies {

compile 'com.github.onlynight:WaveView:1.0.0'

}

使用

布局文件中添加view:

android:id="@+id/waveView1"

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_weight="1"

app:isCircle="false"

app:period="4"

app:waveHeightPercent="0.5"

app:waveRange="15dp"

app:waveSpeed="10"

app:waveStrokeWidth="3dp"/>

activity中需要手动启动水波纹

mWaveView1 = (WaveView) findViewById(R.id.waveView1);

// when you want start wave you should call WaveView#start() method.

mWaveView1.start();

// when you want stop wave you should call WaveView#stop() method.

mWaveView1.stop();

View 属性说明

实现原理

我们视觉上看到的是水波纹,实际上只是一个正弦波和余弦波向左位移,然后将三角函数的周期加长,在一个view中不显示整个三角函数的的波形,这样从视觉上来说就是水波纹效果啦。

根据上面的分析,我们知道我们需要计算一个正弦波和一个余弦波,并且根据时间的推移将正弦波或者余弦波向左或者向右平移,最后每次计算完波形图的时候绘制下来就完成啦。下面我们来看下WaveView中的关键代码:

private void drawWave(Canvas canvas, int width, int height) {

setPaint();

double lineX = 0;

double lineY1 = 0;

double lineY2 = 0;

for (int i = 0; i < width; i += mStrokeWidth) {

lineX = i;

if (mIsRunning) {

lineY1 = mWaveRange * Math.sin((mAngle + i) * Math.PI / 180 / mPeriod) +

height * (1 - mWaveHeightPercent);

lineY2 = mWaveRange * Math.cos((mAngle + i) * Math.PI / 180 / mPeriod) +

height * (1 - mWaveHeightPercent);

} else {

lineY1 = 0;

lineY2 = 0;

}

canvas.drawLine((int) lineX, (int) lineY1,

(int) lineX + 1, height, mWavePaint1);

canvas.drawLine((int) lineX, (int) lineY2,

(int) lineX + 1, height, mWavePaint2);

}

}

可以看到,这里没有选择path进行绘制,因为path绘制无法满足需求,这里通过画竖线;计算每个点起始的位置,然后从这个点画一条线到view的底部,然后循环多次直到view的边界处结束绘制,这样就看到正弦波啦;这时候在每次绘制过程中给三角函数添加一个偏移量,这样每次计算的时候波形就会偏移;最后就完成啦。

有个地方有个坑需要注意,这里可以设置view为圆形;常规的思路是画完以后再将其切成一个圆形,我尝试了各种方法证明这种思路有问题;最后发现需要先限定canvas的绘制区域,然后再将图形绘制到view上去,这样才能实现clip的效果。

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

if (mIsRunning) {

int height = getHeight();

int width = getWidth();

// 这里要注意执行的顺序

clipContainer(canvas, width, height);

drawWave(canvas, width, height);

}

}

private void clipContainer(Canvas canvas, int width, int height) {

if (mIsCircle) {

mContainerPath.reset();

canvas.clipPath(mContainerPath);

mContainerPath.addCircle(width / 2, height / 2, width / 2, Path.Direction.CCW);

canvas.clipPath(mContainerPath, Region.Op.REPLACE);

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android下拉水波纹,android自定义WaveView水波纹控件相关推荐

  1. android下拉会谈效果,Android实现下拉展示条目效果

    本文实例为大家分享了Android下拉展示条目的具体代码,供大家参考,具体内容如下 布局文件 xmlns:tools="http://www.easck.com/tools" an ...

  2. android——下拉选择框(自定义spinner)

    相信大家都有遇到下拉选择这个功能,接下来我把我学习的给大家分享一下. 一.导入依赖 implementation 'com.github.arcadefire:nice-spinner:1.4.4' ...

  3. 谷歌的android下拉刷新页面,Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新

     <Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新> 下拉刷新在如今移动开发中应用如此广泛和普遍,以至于谷歌干脆在SDK中给予支持.在android ...

  4. android 下拉刷新 组件,android系统自带下拉刷新控件的实现

    android系统自带的下拉刷新控件SwipeRefreshLayout位于android.support.v4.widget包下,实现步骤如下: 1.在布局文件中添加该控件,该控件一般作为父控件,而 ...

  5. android下拉菜单刷新,android下拉刷新列表实现(pull to refresh)

    android中提供了ListView控件,listview能够为我们展现丰富的内容,有时候我们为了提升用户体检,需要更炫而且更好用户体验的效果,pull to refresh(下拉刷新列表效果)就应 ...

  6. android下拉框代码,Android下拉列表spinner的实例代码

    spinner组件有点类型于HTML中的下拉框的样子,让用户每次从下拉框中选取一个,本文为大家分享了Android下拉列表spinner的具体实现代码,供大家参考,具体内容如下 mian.xml xm ...

  7. android 下拉框大全,Android 下拉列表Spinner

    在UI中经常会使用到下拉列表,在android控件中有两个下拉列表控件: Spinner AppCompatSpinner 兼容低版本,在高版本中才能使用的方法换了V7下的Spinner后可以兼容到2 ...

  8. ElementUI中el-select下拉框选择不同的项控制其他控件(单选控件)的显示和隐藏

    场景 在el-select的下拉框中,下拉选择指定的下拉项时才会显示后面的单选框,否则不显示. 效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizh ...

  9. 安卓 spinner下拉框 做模糊查询_用图表控件做一个简单的员工信息查询系统

    前几天在上课的时候有同学说在做人员的信息查询的时候,经常的要去做查找搜索很麻烦,能不能做一个简单的人员信息查询系统,只需要选择人员的编号就可以查询到这个员工的信息.其实要实现这个同学的需求在EXCEL ...

  10. Android下拉刷新开源库对比(转)

    安卓下拉刷新开源库对比 作者:desmond1121 目前仅比对github上star数>1500的下拉刷新开源库,在比较完成之后可能会加入其它有代表性的库. Repo Repo Owner S ...

最新文章

  1. Python完全学习大师班
  2. C++程序设计之函数对象
  3. 【 Thread】创建线程的2种方法
  4. 5 项大奖,70 项满分!阿里云全方位引领云原生技术升级
  5. Python数据挖掘与机器学习技术入门实战
  6. 服务器高并发下出现大量的time wait的解决办法
  7. html中实现回车或点击进入-----Mr.Zhang
  8. Java-Arrays数组操作
  9. 2022年新版YOLO解读(PP-YOLOE)
  10. 两台服务器ubuntu20.x 直接文件共享,文件挂载 nfs
  11. IDEA插件系列(88):Tab Shifter插件——选项卡移动工具
  12. sqlbulkcopy是覆盖式更新吗_关于5G消息,这五点你知道吗?
  13. LVDS信号与TTL信号
  14. matlab在电磁场方向,基于matlab的电磁场仿真与分析探究.pdf
  15. 虚拟机中试用windows 8(视频)
  16. linux调度不执行,linux crond.d定时调度执行一段时间后不执行
  17. 个人承接微信H5制作设计,需要的联系我
  18. CCD相机与普通相机的区别
  19. android 点击震动,Android 使用Vibrator服务实现点击按钮带有震动效果
  20. Google创新机器

热门文章

  1. 即将奔三的90后,你们有多少存款
  2. java中数组倒叙复制输出
  3. vb计算机二级考试题库,国家计算机二级考试题库 VB上机试题第12套
  4. 栅格布局 xs sm md lg
  5. SSD-Tensorflow 目标检测(自定义数据集(VOC2007格式))
  6. 如何用阿里云云盘快照恢复部分数据
  7. android属性动画作用范围,Android属性动画的使用(上)
  8. 云控系统都支持哪些安卓手机装机步骤
  9. VG vs SS WE vs IM [20160815]
  10. 第4节:alphapose项目运行和参数