许久不来 , 冒个泡 , 发一个刚做的声音波动的View吧 :

代码不多 , 没什么技术含量 , 权当给您省时间了 , 直接复制粘贴就能用 , 直接上代码:
SoundWavesView
/**
* 语音通话的声波控件
* Created by Mr.LongFace on 2017/9/16.
*/
public class SoundWavesView extends View {
private int mMini; // 最短值
private int mMax; // 最大值
private int mLineWidth; // 每条声波的宽度
private int mSoundNum = 5; // 声波的数量
private int mSpac; // 每条声波的中点
private int mWidth , mHeight; // 控件宽高
private boolean isRun = false;
private Paint mPaint;
private RectF mRectF;
private List<SoundLine> mSoundList = new ArrayList<>();
private Handler mHandler = new Handler();
private Runnable mInvalidateRun = new Runnable() {
@Override
public void run() {
postInvalidate();
}
};
public SoundWavesView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(getResources().getColor(R.color.color_red));
mPaint.setStyle(Paint.Style.FILL);
mRectF = new RectF();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (widthMeasureSpec > 0 && heightMeasureSpec > 0) {
initParam();
}
}
private void initParam() {
mWidth = getWidth();
mHeight = getHeight();
mMini = (int) (mHeight * 0.3f);
mMax = mHeight;
initLines();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < mSoundNum; i++) {
SoundLine sound = mSoundList.get(i);
mRectF.left = sound.left;
mRectF.right = sound.right;
mRectF.top = sound.top;
mRectF.bottom = sound.bottom;
canvas.drawRoundRect(mRectF , mLineWidth / 2 , mLineWidth / 2 , mPaint);
}
if (isRun) {
mHandler.postDelayed(mInvalidateRun, 10);
}
}
@Override
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
if (isRun) {
if (visibility == VISIBLE) {
if (mWidth == 0) {
initParam();
}
if (mSoundList != null && mSoundList.size() > 0) {
for (SoundLine soundLine : mSoundList) {
soundLine.start();
}
}
}else{
if (mSoundList != null && mSoundList.size() > 0) {
for (SoundLine soundLine : mSoundList) {
soundLine.stop();
}
}
}
}
}
public void start() {
if (!isRun) {
isRun = true;
for (SoundLine sound : mSoundList) {
sound.start();
}
postInvalidate();
}
}
public void stop(){
if (isRun) {
isRun = false;
for (SoundLine sound : mSoundList) {
sound.stop();
}
}
}
private void initLines() {
mLineWidth = (int) (mWidth / mSoundNum * 0.7f);
mSpac = mWidth / (mSoundNum - 1);
mSoundList.clear();
chaos();
}
/**
* 生成凌乱的
*/
private void chaos() {
for (int i = 0; i < mSoundNum; i++) {
int left = i * mSpac - mLineWidth / 2;
int right = i * mSpac + mLineWidth / 2;
SoundLine s = new SoundLine(left , right , 0 , mHeight);
s.setMode(SoundLine.SPEED_RAN);
s.setBorder(mMini , mMax);
mSoundList.add(s);
}
}
/**
* 生成波浪的
*/
private void wave(){
// TODO 防止UI抽风
}
/**
* 生成有序的
*/
private void order(){
// TODO 防止UI抽风
}
}
SoundLine
/**
* 语音音频波纹的单个音波属性
* Created by Mr.LongFace on 2017/9/16.
*/
public class SoundLine implements ValueAnimator.AnimatorUpdateListener{
// 低 中 高 随机 4挡
public static final int SPEED_LOW = 500;
public static final int SPEED_MID = 200;
public static final int SPEED_HEI = 0;
public static final int SPEED_RAN = 0;
private Random mRandom;
private ValueAnimator mAnim;
public int left , right , top , bottom;
private int min , max;
public SoundLine(int left , int right , int top , int bottom){
this.left = left;
this.right = right;
this.top = top;
this.bottom = bottom;
mRandom = new Random();
initAnim();
}
private void initAnim() {
mAnim = ValueAnimator.ofFloat(0.0f , 1.0f);
setMode(SPEED_MID);
mAnim.setRepeatCount(-1);
mAnim.setRepeatMode(ValueAnimator.REVERSE);
mAnim.addUpdateListener(this);
}
public void setMode(int mode){
if (mode == SPEED_RAN) {
mode = mRandom.nextInt(400);
}
mAnim.setDuration(300 + mode);
}
public void start(){
if (mAnim.isRunning()){
mAnim.end();
}
mAnim.start();
}
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float f = (float) valueAnimator.getAnimatedValue();
top = (int) (f * (max - min) / 2);
bottom = max - top;
}
public void setBorder(int min, int max) {
this.min = min;
this.max = max;
}
public void stop() {
mAnim.end();
mAnim.cancel();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android语音声波控件
# Android条形波控件
# Android声波控件
# Android实现水波纹控件的方法
# android球形水波百分比控件代码
# 每条
# 不多
# 给您
# 不来
# 最短
# 大家多多
# 许久
# 没什么
# Runnable
# Handler
# mHandler
# mInvalidateRun
# run
# postInvalidate
# Override
# void
# List
# lt
# RectF
# mRectF
相关文章:
如何在香港服务器上快速搭建免备案网站?
建站之星安装路径如何正确选择及配置?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
宝塔建站教程:一键部署配置流程与SEO优化实战指南
定制建站是什么?如何实现个性化需求?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
制作表格网站有哪些,线上表格怎么弄?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
上海网站制作开发公司,上海买房比较好的网站有哪些?
建站org新手必看:2024最新搭建流程与模板选择技巧
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
如何用5美元大硬盘VPS安全高效搭建个人网站?
如何在万网ECS上快速搭建专属网站?
XML的“混合内容”是什么 怎么用DTD或XSD定义
如何高效利用亚马逊云主机搭建企业网站?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
,网站推广常用方法?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
学校免费自助建站系统:智能生成+拖拽设计+多端适配
如何在万网主机上快速搭建网站?
建站之星如何助力企业快速打造五合一网站?
实现虚拟支付需哪些建站技术支撑?
如何零基础在云服务器搭建WordPress站点?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
如何快速打造个性化非模板自助建站?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
如何快速生成专业多端适配建站电话?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
如何快速搭建支持数据库操作的智能建站平台?
如何用免费手机建站系统零基础打造专业网站?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
网站好制作吗知乎,网站开发好学吗?有什么技巧?
,南京靠谱的征婚网站?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
如何通过IIS搭建网站并配置访问权限?
建站10G流量真的够用吗?如何应对访问高峰?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
建站之星展会模版如何一键下载生成?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
建站主机选哪种环境更利于SEO优化?
常州企业网站制作公司,全国继续教育网怎么登录?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
大同网页,大同瑞慈医院官网?
建站之星展会模板:智能建站与自助搭建高效解决方案
建站之星客服服务时间及联系方式如何?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
Swift中循环语句中的转移语句 break 和 continue
*请认真填写需求信息,我们会在24小时内与您取得联系。