最近公司项目有一个录音的录制和播放动画需求,然后时间是那么紧,那么赶紧开撸。

先看效果图

嗯,然后大致就是这样,按住录音,然后有一个倒计时,最外层一个进度条,还有一个类似模拟声波的动画效果(其实中间的波浪会根据声音的大小浪起来的~)

2

实现思路

然后,我们适当的来分析一下这个录音动画的实现方式。这个肯定是通过自定义控件,咱们来把这个效果完完全全画出来。

大致包括以下几个点:

1. 最外层的进度条,最坑的就是一开始的一个渐变的效果 
2. 然后进度条最前方是有一个点的(我肯定选择用图片来实现) 
3. 中间的波浪(关键是要随着声音的大小浪起来) 
4. 中间的倒计时

3

实现过程

1.画最外层的圆

2.画提示的文字

3.画倒计时(静止时间)

4.画声波

这边代码就不展开了,画的有点烦,简单说下,还需要自己体会哈。上面分隔线之前的说白了就是让声波动起来,也就是改变volume的值,然后后面有3个for循环。

第一个for循环是为了确定声波水平线的位置,第二个是画声波,第三个是颜色的渐变。

5.画外圈进度的那个点

我们先会个图分析一下,如下图。A点就是起始坐标,一开始我们的小圆点是隐藏的,如果不算padding的话,x=witdh/2,y=0;

 
嗯,然后呢画图片我们用的是

canvas.drawBitmap(......);

那么要知道,drawBitmap()这个方法画的时候是我们图片的左上角去画到A点的,其实我们应该往左上角挪一点,才能让图片的中心真正意义上的和A点重合,对吧对吧,嗯,仔细思考一下。

然后继续看上面那个图,当我们A点随着时间运动到B点之后,我们要算出B点的坐标。

这边用一下三角函数啦,我们设A到B,转过的角度为α,设圆的半径为r,那么A到B其实横向增加的距离应该就是

m = x+r*sin(α);
n = y+r*cos(α);

那么我们该图片的所有代码就是:

6.画外边的带进度和带渐变的大圆

我的实现方式很简单,从我们的UI图看出,外面的大圆在1/4进度的时候是渐变的,然后剩下的3/4圆其实都是一种颜色,对吧,那我就画2个圆来实现这个效果呗。

当progress<90的时候,我们画那个渐变的圆环,当>90的时候,我们同时画出那个渐变的和纯色的圆环(当progress的时候,这个时候其实那个渐变的圆环没变化,只是纯色的圆环一直在变)。

如图:A是那个渐变的圆环,B是纯色不变的圆环 

7.然后最后就剩下一个计时器了,还有那个上面一直出现的progress

8.最后就是提供各种接口,各种绘制和启动机制了,最主要的还是上面的绘制方法。

比如你的自定义属性

以及一切其余自定义View的东西,对自定义View不熟的同学可以先去学习下怎么自定义View(其实很简单,新手不要怕),然后再去实现一些看上去挺棒的效果。

总结

嗯,大致就是这样,对于公司这些动画的需求我只想说其实你想要咋弄,都是没问题的,最重要的就是时间!本身其实最后留给开发人员的时间就不多,然后如果还要加各种动画,那不是天天加班的节奏么~

下载地址:

https://github.com/Blincheng/RecordView

Android 自定义录音、播放动画View,让你的录音浪起来的更多相关文章

  1. Android自定义底部带有动画的Dialog

    Android自定义底部带有动画的Dialog 效果图 先看效果图,是不是你想要的呢 自定义Dialog package --.view; import android.app.Dialog; imp ...

  2. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]

    http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...

  3. [置顶] android 自定义ListView实现动画特效

    通过自定义ListView实现动画特效,被点击元素A向前移,A之前元素往后移动. 重点在于动画的实现: 具体代码如下: package com.open.widget; import java.uti ...

  4. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu

    示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动, ...

  5. android自定义View_3——Optimizing the View

    前言:现在你已经有了一个自定义的view了,并且支持手势和过度动画等属性,现在你要确认这个view 有够快的速度,为了使其在UI上不会显得迟钝或是卡停,你要保证view动画,能每秒最好有60帧. 一: ...

  6. android自定义View_2——Making the View Interactive

    前言:绘制出一个view只是自定义view的一个部分,还需要自定义一些view的行为,来反馈用户的使用操作,反馈的 行为要合理性,就像真是的物理世界一样,不要太玄幻哦. 可以将view的行为封装到in ...

  7. Android 自定义可拖拽View,界面渲染刷新后不会自动回到起始位置

    以自定义ImageView为例: /** * 可拖拽ImageView * Created by admin on 2017/2/21. */ public class FloatingImageVi ...

  8. android采用MVP漫画APP、适配刘海屏、小黄车主界面、录音波浪动画、综合APP等源码

    Android精选源码 一款采用MVP架构的仿完整漫画APP源码 Android适配刘海屏幕 基于Xmpp协议的即时通讯社交软件(客户端+服务端) Android小黄车(ofo)app主页菜单效果 一 ...

  9. Android自定义组件之自动换行及宽度自适应View:WordWrapView

    目的: 自定义一个ViewGroup,里面的子view都是TextView,每个子view  TextView的宽度随内容自适应且每行的子View的个数自适应,并可以自动换行 一:效果图 二:代码 整 ...

随机推荐

  1. 《Scrum实战》第2次课【取得大家的支持】课后作业汇总

    作业:<变革之心>读后感 孟帅: 2017-7-12http://www.cnblogs.com/mengshuai1982/p/7153985.html

  2. 大咖分享 | 一文解锁首届云创大会干货——上篇(文末附演讲ppt文件免费下载)

    日,第一届网易云创大会在杭州国际博览中心举办,本次大会由杭州滨江区政府和网易主办,杭州市两创示范工作领导小组办公室协办,网易云承办,以"商业匠心.技术创新"为主题,致力于打通技术创 ...

  3. 利用委托实现自己的数据缓存仓库(附上Demo)

    Demo源码 写在前面的话 写完这篇博客后,总觉得少了些什么,后来想了下,感觉自己只是把结果给亮了出来,自己为什么想到这么做,这个类库出生的缘由未详述,因此,在本段作下说明,如有不足之处,希望能和大家 ...

  4. 以http server为例简要分析netty3实现

    概要 最近看了点netty3实现.从webbit项目作为口子.webbit项目是一个基于netty3做的http与websocket server.后面还会继续看下netty4,netty4有很多改进 ...

  5. python - work - 2

    #-*- coding:utf-8 -*-# author:jiaxy# datetime:2018/11/3 11:48# software: PyCharm Community Edition d ...

  6. STP

    生成树协议  spanning-tree protocol     网络中额外添加的链路连接着路由器和交换机 会引起流量的环路   当一个交换机的连接丢失时 另一条链路能快速地取代失败的链路  并且不 ...

  7. 聊聊、Java Keytool P12 转 JKS

    最近公司合作机构需要更改服务证书,总共给了 3 个文件过来.openapi-cert.p12.openapi-cert.key.openapi-cert.crt. openapi-cert.crt - ...

  8. javaScript流程控制与函数

    流程控制 1.1 条件语句 分支结构 单向分支 if (条件表达式) { code... } <!DOCTYPE html> <html> <head> <m ...

  9. 【整理】python中re的match、search、findall、finditer区别

    match 从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾. search 若string中包 ...

  10. Key-value数据库:Redis缓存服务

    Redis 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.其提供了多种主流语言的客户端,方便使用:同时Redis支持主 ...