Hello大家好,很高兴又一次与大家见面,今天是农历丁酉鸡年(大年初四),现在跟大家拜年有点晚,算是拜晚年,祝大家晚年幸福。 这么快大伙都到了晚年了,Android贝塞尔曲线我也准备以一个大波浪来结束。所以今天给大家带来的就是android贝塞尔曲线制作波浪效果。

如果大家没有看过Android贝塞尔曲线——曲线初体验、Android贝塞尔曲线——曲线进阶可以点击查看,那两篇对android贝塞尔曲线有一些讲解。

好了说了这么久我们来看一下效果吧。

波浪图动画

怎么样是不是很动感,很哇塞。 那么我们一起来搞定它吧!

我觉得应该先来给大家梳理一下思路,我们首先应该找出曲线的起始点、终止点和控制点坐标。 其次我们应该绘制出来一整条的波纹,也就是要绘制出两条贝塞尔曲线,紧接着我们往屏幕外绘制一条相同长度的一整条波纹,屏幕外的波纹每次加上一个固定的值然后加上动画让他们周期性循环,这样这个波浪也就绘制出来了。

好了,多说无益,还是代码最有感觉,下面我直接贴上我的代码,我觉得通过之前的学习理解这个波浪应该没有那么困难了。有问题的小伙伴可以在下方评论,或者私信我来讨论具体问题。

public class BoLangView extends View implements View.OnClickListener{

private int mWaveLength;

private int mScreenWidth;

private int mScreenHeight;

private int mCenterY;

private int mWaveCount;

private int offset;

private Path mPath;

private Paint mPaint;

private ValueAnimator mValueAnimatior;

public BoLangView(Context context) {

super(context);

}

public BoLangView(Context context, AttributeSet attrs) {

super(context, attrs);

mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mPaint.setStyle(Paint.Style.FILL_AND_STROKE);

mPaint.setStrokeWidth(8);

mPaint.setColor(Color.LTGRAY);

mWaveLength = 800;

}

public BoLangView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

// 需要计算出屏幕能容纳多少个波形

mPath = new Path();

mScreenHeight = h;

mScreenWidth = w;

mCenterY = h / 2;

mWaveCount = (int) Math.round(mScreenWidth / mWaveLength + 1.5); // 计算波形的个数

setOnClickListener(this);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

mPath.reset();

mPath.moveTo(-mWaveLength,mCenterY);

for (int i = 0; i < mWaveCount; i++) {

mPath.quadTo(-mWaveLength * 3 / 4 + i * mWaveLength + offset,mCenterY + 60,-mWaveLength / 2 + i * mWaveLength + offset,mCenterY);

mPath.quadTo(-mWaveLength / 4 + i * mWaveLength + offset,mCenterY - 60,i * mWaveLength + offset,mCenterY);

}

mPath.lineTo(mScreenWidth,mScreenHeight);

mPath.lineTo(0,mScreenHeight);

mPath.close();

canvas.drawPath(mPath,mPaint);

}

@Override

public void onClick(View v) {

mValueAnimatior = ValueAnimator.ofInt(0, mWaveLength);

mValueAnimatior.setDuration(1000);

mValueAnimatior.setInterpolator(new LinearInterpolator());

mValueAnimatior.setRepeatCount(ValueAnimator.INFINITE);

mValueAnimatior.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

offset = (int) animation.getAnimatedValue();

invalidate();

}

});

mValueAnimatior.start();

}

}

我这个代码还和以前一样,省略了布局引用,加载activity等等那些特别基础的东西,好了到现在整个贝塞尔之旅到这里算是结束了,以后如果有什么贝塞尔做出的效果可能会与大家来一同分享。喜欢的话来给我一个赞吧!

android波浪动画简书,Android贝塞尔曲线————波浪效果(大波浪)相关推荐

  1. android波浪动画简书,Android Path绘制贝塞尔曲线波浪动画

    本文主讲一种动画的实现方式:在自定义View的onDraw()方法的最后调用invalidate()来实现持续绘制更新画面,在onDraw()中根据流逝的时间来计算图像当前的位置.形状,即实现了动画. ...

  2. android自动登录简书,Android开发之简单登录界面

    用户界面基础 Android系统的四大组件分别是活动(Activity).服务(Service).广播接收器(Broadcast Receiver).内容提供器(Content Provider). ...

  3. android 读写文件 简书,Android 中的文件操作

    Android 文件操作 概述 Android 中的文件操作主要涉及到两个部分,一个是内部存储的读写,一个是外部存储的读写两者的主要区别如下表: 内部存储 外部存储 始终可用 它并非始终可用,因为用户 ...

  4. android运行过程简书,Android系统的启动流程

    Android系统有哪些进程 在Linux系统启动时,会读取init.rc,里面配置了一些需要启动的进程.注意:SystemServer进程不在init.rc里,因为SystemServer进程是由z ...

  5. android 开发环境简书,Android Studio 开发环境快速搭建

    目录 - 1.下载JDK.AS - 1.1 JDK下载 - 1.2 AS下载 - 1.3 百度云资源统一下载 - 2.安装JDK - 3.配置JDK及JAVA的环境 - 3.1 打开系统环境 - 3. ...

  6. android 辅助服务 简书,Android AccessibilityService使用

    测试demo主要使用了Android 的无障碍辅助服务(AccessibilityService),主要注意是 1. 开启服务,绑定目标app的监听(demo中根据包命绑定了体积计算的app),需要在 ...

  7. android四大组件 简书,android四大组件

    android有四大组件,分别是Activity, Service(服务),Content Provider(内容提供者),BoadcastReceiver广播接收器. Activity 一个Acti ...

  8. android 存储方式简书,Android的多种数据存储方式

    1. 简介 作为一个完整的应用程序,数据存储操作是必不可少的.现在Android的离线缓存就是通过网络良好状态时将从服务器收到的数据保存到本地.Android系统中主要提供了3种方式进行数据存储,分别 ...

  9. android权限适配 简书,Android动态权限适配

    最近APP里面要添加动态权限,网上找了不少例子并经过一定的测试,基本流程有了一定的认识,需要注意的地方记录下来以备以后查阅. 一 各大手机厂商的适配 依据各大手机Rom的不同表现,可以分为三种不同的模 ...

最新文章

  1. ie-css3.htc参数无效,ie-css3.htc怎么用?
  2. SpringMVC简介-SpringMVC概述
  3. 英语口语Week 15 Wednesday
  4. Spring4.x(7)---对象的生命周期方法
  5. java实现三级联动查询_jeefast和Mybatis实现三级联动的示例代码
  6. mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...
  7. 用 Python3 + Selenium 实现模拟QQ空间登录及自动点赞功能
  8. MATLAB的非线性变换
  9. java工资高还是web前端工资高_java工资高还是php,java工资高还是web前端工资高,php和java学费...
  10. 如何找回被删除的文件
  11. 谈胶印机供水装置调节的技巧
  12. 干货!怎么写满意度调查报告?
  13. MAC删除开机自启动程序
  14. 【python柱状图】图例大小、位置,X轴刻度大小,旋转角度
  15. VC++图像加密软件设计与实现
  16. 2411681-89-3,Thalidomide-O-amido-PEG4-azide是一种PROTAC连接剂,通过点击化学与炔烃或DBCO、BCN连接的分子反应
  17. [ 渗透测试面试篇 ] 大厂面试经验分享
  18. SVG文档:使用SVG 编程(转自IBM文档库)
  19. sshxcute_Java 使用SSH连接Linux 使用passwd命令修改密码
  20. 计算机密码阈值,帐户锁定阈值 (Windows 10) - Windows security | Microsoft Docs

热门文章

  1. 达梦数据库启动失败ARCH_DEST[/dmarch] will be out of space.
  2. guava异步线程使用
  3. 计算机无法删除用户,怎么彻底删除一个用户
  4. 操作系统之短作业优先实现代码
  5. vue3 接入网易易盾(webpack,vite)
  6. 互联网海量视频数据的存储
  7. Writing a Cause and Effect Essay
  8. css解决谷歌,360浏览器默认最小字体为12px问题
  9. 软件工程实训有必要吗_软件工程专业实训心得体会
  10. Hive实现:1、获取每个人最高分对应的学科和分数(学生最高分);2、获取每门课程都高于平均分的人、课程和分数(三好学生:每科高于平均分);3、获取每个学科都及格(即不低于60分)的学生