android音乐播放器频谱图控件


先上效果图:微笑



先通过测量获取view的宽高,然后将宽分为12份,11份为11个条形柱,剩余一份在分为10份作为条形柱之间的间距

@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);width = MeasureSpec.getSize(widthMeasureSpec);height = MeasureSpec.getSize(heightMeasureSpec);offset = width / 12 / 10;danceWidth = width / 12;}


首先看如何绘制一个条形柱:

传入一个int代表这是第几个条形柱

条形柱是由每个小节拼接起来的,每次随机获取条形柱的高度,然后除以每节的高度和间距来知道要绘制多少节,每一节根据比例来设置不同的颜色达到渐变效果。每次都记录顶点的位置,如果超出则重汇,如果没有则每次都下降一节的高度,达到缓慢落下的效果

private void drawItem(int k){int start=k*(danceWidth+offset);double r= Math.random();int nodeoffset=danceWidth/4;int nodeheight=danceWidth/2;int nodewidth=danceWidth;int topheight=nodeoffset;int max=height/(nodeheight+nodeoffset);int count=(int)(height*r)/(nodeheight+nodeoffset);for (int i = 0; i < count;i++ ) {float percent=(float)i/max;if(percent<0.1){paint.setColor(Color.parseColor(colors[0]));}else if(percent<0.2){paint.setColor(Color.parseColor(colors[1]));}else if(percent<0.3){paint.setColor(Color.parseColor(colors[2]));}else if(percent<0.4){paint.setColor(Color.parseColor(colors[3]));}else if(percent<0.5){paint.setColor(Color.parseColor(colors[4]));}else if(percent<0.6){paint.setColor(Color.parseColor(colors[5]));}else if(percent<0.7){paint.setColor(Color.parseColor(colors[6]));}else if(percent<0.8){paint.setColor(Color.parseColor(colors[7]));}else if(percent<0.9){paint.setColor(Color.parseColor(colors[8]));}else{paint.setColor(Color.parseColor(colors[9]));}canvas.drawRect(start,height-(nodeheight+nodeoffset)*i-nodeheight,start+nodewidth,height-(nodeheight+nodeoffset)*i,paint);}//当前高度超过最大值,则重新绘制顶部if(count>=tops[k]){tops[k]=count;}else{//没有超过,则往下降一格tops[k]--;}paint.setColor(Color.WHITE);canvas.drawRect(start,height-(nodeheight+nodeoffset)*tops[k]-topheight,start+nodewidth,height-(nodeheight+nodeoffset)*tops[k],paint);}



最后循环绘制11次

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);paint=new Paint();this.canvas=canvas;paint.setColor(Color.BLUE);drawRect();postInvalidateDelayed(300);//刷新时间}private void drawRect(){for (int i = 0; i <= 10;i++ ) {drawItem(i);}}


最后贴上整个类的代码,喜欢的给我点个赞吧! 微笑

完整代码:

public class MusicDanceView extends View {int width, height, offset, danceWidth;Paint paint;Canvas canvas;public MusicDanceView(Context context) {super(context);}public MusicDanceView(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);width = MeasureSpec.getSize(widthMeasureSpec);height = MeasureSpec.getSize(heightMeasureSpec);offset = width / 12 / 10;danceWidth = width / 12;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);paint=new Paint();this.canvas=canvas;paint.setColor(Color.BLUE);drawRect();postInvalidateDelayed(300);//刷新时间}private void drawRect(){for (int i = 0; i <= 10;i++ ) {drawItem(i);}}int []tops=new int[11];String[]colors={"#03FC6C","#02FD27","#1BFE01","#80FD02","#C5FE01","#FCE903","#FDA502","#FD6602","#FD3A02","#FF1300"};private void drawItem(int k){int start=k*(danceWidth+offset);double r= Math.random();int nodeoffset=danceWidth/4;int nodeheight=danceWidth/2;int nodewidth=danceWidth;int topheight=nodeoffset;int max=height/(nodeheight+nodeoffset);int count=(int)(height*r)/(nodeheight+nodeoffset);for (int i = 0; i < count;i++ ) {float percent=(float)i/max;if(percent<0.1){paint.setColor(Color.parseColor(colors[0]));}else if(percent<0.2){paint.setColor(Color.parseColor(colors[1]));}else if(percent<0.3){paint.setColor(Color.parseColor(colors[2]));}else if(percent<0.4){paint.setColor(Color.parseColor(colors[3]));}else if(percent<0.5){paint.setColor(Color.parseColor(colors[4]));}else if(percent<0.6){paint.setColor(Color.parseColor(colors[5]));}else if(percent<0.7){paint.setColor(Color.parseColor(colors[6]));}else if(percent<0.8){paint.setColor(Color.parseColor(colors[7]));}else if(percent<0.9){paint.setColor(Color.parseColor(colors[8]));}else{paint.setColor(Color.parseColor(colors[9]));}canvas.drawRect(start,height-(nodeheight+nodeoffset)*i-nodeheight,start+nodewidth,height-(nodeheight+nodeoffset)*i,paint);}//当前高度超过最大值,则重新绘制顶部if(count>=tops[k]){tops[k]=count;}else{//没有超过,则往下降一格tops[k]--;}paint.setColor(Color.WHITE);canvas.drawRect(start,height-(nodeheight+nodeoffset)*tops[k]-topheight,start+nodewidth,height-(nodeheight+nodeoffset)*tops[k],paint);}
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58014.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Virtual Piano 自动播放乐谱

钢琴按键分布 钢琴 一共88个键&#xff0c;52个白键&#xff0c;36个黑键。 从左到右按音区分&#xff0c;可分为 低音区&#xff1a;不完整的大二字组、大字一组、大字组&#xff1b; 中音区&#xff1a;小字组、小字一组、小字二组&#xff1b; 高音区&#xff1a;小字三…

Qt开发音乐播放器时,频谱显示控件的详细绘制(好思路)

总第46篇 本文详细梳理了在Qt框架制作音乐播放器的过程中,频谱显示的绘制过程。 在开发音乐播放器的时候,需要将音频数据转换成对应的频谱显示,我们可以采用fmod 第三方库来处理,即通过fomd获取音频数据对应的频谱数据,再在项目中对数据进行绘制即可,这样使工程高度解耦,…

用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐

一、前言 QMediaplayer可以用于解析音频文件和视频文件&#xff0c;继承自QMediaObject&#xff0c;涉及到的对象为QMediaContent。QMediaObject可以提供关于媒体内容的接入&#xff0c;通过URL进行初始化&#xff0c;同时也可以提供可以播放的媒体文件的列表&#xff0c;与QM…

基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条

2020博客之星年度总评选进行中&#xff1a;请为74号的狗子投上宝贵的一票&#xff01; 我的投票地址&#xff1a;点击为我投票 文章目录 1.实现音频文件对话框(QFileDialog类)2.实现音乐播放&#xff08;QMediaPlayer类/QMediaPlaylist类&#xff09;3.实现进度条更新以及文件…

基于QT的音乐播放器频谱实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、官方文档分析二、实现步骤1. 捕获原始音频数字信号2. 读取音频数据3. 计算FFT4. 项目源码目录5. 实际效果 总结 前言 网上的很多音乐播放器频谱实现&#…

A40i使用笔记:使用QT调用aplay播放wav音频/混音

一、前言 在linux当中播放音乐的方式有很多种&#xff0c;我使用的A40i核心板&#xff0c;是 aplay 指令&#xff0c;是 alsa 的一个指令&#xff0c;也就是说需要先安装有 alsa&#xff0c;使用其他arm开发板的小伙伴可以先自行安装alsa之后在进入正文&#xff0c;这里我没实…

音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二)

音频频谱显示-显示音频文件静态频谱图(一) https://blog.csdn.net/xiaolong1126626497/article/details/126971535 音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二) https://blog.csdn.net/xiaolong1126626497/article/details/126973994 一、前言 在做音乐播…

QT音乐播放器2:切歌,暂停继续合一

1、实现切歌&#xff0c;循环播放 mainwindow.h private slots:void on_nextBt_clicked();void on_frontBt_clicked();在mainwindow.cpp中 MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){//切歌存储歌单列表QFileInfoList infolist …

用Qt写一个简单的音乐播放器(四):歌曲浏览、上一曲、下一曲

一、前言 在用Qt写一个简单的音乐播放器&#xff08;一&#xff09;&#xff1a;使用QMediaPlayer播放音乐中&#xff0c;我们已经知道如何去使用QMediaPlayer播放音乐。 在用Qt写一个简单的音乐播放器&#xff08;二&#xff09;&#xff1a;增加界面&#xff08;开始和暂停音…

如何使用Guitar Pro在乐谱播放时切换效果器音色?

如何使用Guitar Pro在乐谱播放时切换效果器音色&#xff1f; 关键词&#xff1a;吉他谱 Guitar Pro是一款专注于多种乐器谱制作和播放的高效电脑系统软件&#xff0c;我们使用它可以完成非常多的乐谱操作&#xff0c;如乐队排练、和弦学习等适用于高手和新手的功能都不在话下…

qt 频谱 音乐播放器

先看效果 录制_2022_08_11_14_37_25_628 在网上找了一圈&#xff0c; 好多人写的资料敝竹自珍&#xff0c;还要收费真是无语。还有些需要用第三方库&#xff0c;真是没有必要。qt可以直接实现这些功能 音乐播放器的实现我就不贴了&#xff0c; 网上好多例子&#xff0c;我主要…

功能扩展——邮件发送、网页注册

邮件收发 转自这位大佬 电子邮件 要在网络上实现邮件功能&#xff0c;必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局&#xff0c;它主要负责接收用户投递过来的邮件&#xff0c;并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址:一般是smtp.xxx…

网站注册邮件发送功能实现

摘抄自狂神笔记 电子邮件 要在网络上实现邮件功能&#xff0c;必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局&#xff0c;它主要负责接收用户投递过来的邮件&#xff0c;并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址&#xff1a;一般是 smtp…

阿里巴巴国际站获得商品详情 API 调用分享(销量、详情图片、宝贝链接)

item_get-获得商品详情 alibaba.item_get 调用代码分享 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import java.nio.charset.Charset; imp…

利用用户搜索词生成商品标题信息——阿里巴巴IDST

今天介绍的论文是阿里IDST在2018年AAAI上发表的paper《A Multi-task Learning Approach for Improving Product Title Compression with User Search Log Data》。 其应用背景是&#xff0c;现在越来越多的用户开始习惯于使用手机、PAD等移动端进行网购行为&#xff0c;而这些移…

【阿里巴巴国际站API接口】商品详情接口,代码封装系列

为了进行电商平台 alibaba 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个alibaba应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载 alibaba API的SDK并掌握基本的API基础知识和调用 4&#xf…

通过 Python 封装关键词搜索阿里巴巴商品api接口

以下是使用 Python 封装关键词搜索阿里巴巴商品列表数据的步骤&#xff1a; 使用 requests 库向阿里巴巴搜索接口发送 HTTP 请求&#xff0c;可以使用 GET 或 POST 方法&#xff0c;请求参数中应包含搜索关键词、每页展示数量、当前页码等信息。 解析返回的 response 中的 HTM…

中英文在线语音转文字的方法

今天小编就来给大家分享一个中英文在线翻译的方法&#xff0c;小编这个来给大家分享一个这样很好用的方法&#xff01; 操作方法&#xff1a; 使用工具&#xff1a;录音转文字助手 第一步&#xff1a;如果将手机录音转成文字的话需要使用一个工具&#xff1a;录音转文字助手&a…

实现语音转文字功能

解决方案 最近要实现语音转文字接口&#xff0c;具体需求是录制语音后再聊天室实时显示文字&#xff1a; 目前腾讯有三种解决方案&#xff1a; 实时语音识别使用场景是一边录语音&#xff0c;一遍转文字&#xff0c;实时性较高&#xff1b;一句话识别是对60s内的语音文…

互联网时代,自媒体宣发的概念、优势、策略及注意事项

自媒体宣发是指通过自己或者委托专业机构&#xff0c;运用自媒体平台传播宣传信息的一种方式。在互联网时代&#xff0c;自媒体已经成为了企业推广的一种重要手段。本文将为大家介绍自媒体宣发的概念、优势、策略及注意事项。#自媒体# 一、什么是自媒体宣发&#xff1f; 自媒体…