热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android语音动画,Android实现音频条形图效果(仿音频动画无监听音频输入)

音频条形图如下图所示就是这次的音频条形图:由于只是自定义View的用法,我们就不去真实地监听音频输入了,随机模拟一些数字即可。如果要实现一

音频条形图

如下图所示就是这次的音频条形图:

由于只是自定义View的用法,我们就不去真实地监听音频输入了,随机模拟一些数字即可。

如果要实现一个如上图的静态音频条形图,相信大家应该可以很快找到思路,也就是绘制一个个的矩形,每个矩形之间稍微偏移一点距离即可。如下代码就展示了一种计算坐标的方法。

for (int i = 0; i

// 矩形的绘制是从左边开始到上、右、下边(左右边距离左边画布边界的距离,上下边距离上边画布边界的距离)

canvas.drawRect(

(float) (mRectWidth * i + offset),

currentHeight,

(float) ( mRectWidth * (i + 1)),

mRectHeight,

mRectPaint

);

}

如上代码中,我们通过循环创建这些小的矩形,其中currentHeight就是每个小矩形的高,通过横坐标的不断偏移,就绘制出了这些静态的小矩形。下面再通过矩形的高度随机变化模拟音频,这里直接利用Math.randoom()方法来随机改变这些高度,并赋值给currentHeight,代码如下所示。

// 由于只是简单的案例就不监听音频输入,随机模拟一些数字即可

mRandom = Math.random();

currentHeight = (float) (mRectHeight * mRandom);

这样就能实现静态效果了,但是如何实现动态效果呢?其实也是非常简单的,只要在onDraw()方法中再去调用invalidate()方法通知View进行重绘就可以了。不过这里不需要每次一绘制完新的矩形就通知View进行重绘,这样会因为刷新速度太快反而影响效果。因此,我们可以使用如下代码来进行View的延迟重绘,代码如下:

posInvalidateDelayed(300);

这样每隔300ms通知View进行重绘,就可以得到一个比较好的视觉效果了。最后添加一个渐变效果可以使View更加逼真,代码如下所示:

@Override

protected void onSizeChanged(int w,int h,int oldW,int oldH) {

super.onSizeChanged(w, h, oldW, oldH);

// 渐变效果

LinearGradient mLinearGradient;

// 画布的宽

int mWidth;

// 获取画布的宽

mWidth = getWidth();

// 获取矩形的最大高度

mRectHeight = getHeight();

// 获取单个矩形的宽度(减去的部分为到右边界的间距)

mRectWidth = (mWidth-offset) / mRectCount;

// 实例化一个线性渐变

mLinearGradient = new LinearGradient(

0,

0,

mRectWidth,

mRectHeight,

topColor,

downColor,

Shader.TileMode.CLAMP

);

// 添加进画笔的着色器

mRectPaint.setShader(mLinearGradient);

}

从这个例子中,我们可以知道,在创建自定义View的时候,需要一步一步来,从一个基本的效果开始,慢慢地添加功能,绘制更复杂的效果。不论是多么复杂的自定义View都一定是慢慢迭代起来的功能,所以不要觉得自定义View有多难。千里之行始于足下,只要开始做,慢慢地就能越来越熟练。

代码

以下是这次的完整代码:

package com.example.customaf;

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Canvas;

import android.graphics.LinearGradient;

import android.graphics.Paint;

import android.graphics.Shader;

import android.support.v4.content.ContextCompat;

import android.util.AttributeSet;

import android.view.View;

import com.example.afanalog.R;

/**

* 自定义的音频模拟条形图

* Created by shize on 2016/9/5.

*/

public class MyAF extends View {

// 音频矩形的数量

private int mRectCount;

// 音频矩形的画笔

private Paint mRectPaint;

// 渐变颜色的两种

private int topColor, downColor;

// 音频矩形的宽和高

private int mRectWidth, mRectHeight;

// 偏移量

private int offset;

// 频率速度

private int mSpeed;

public MyAF(Context context) {

super(context);

}

public MyAF(Context context, AttributeSet attrs) {

super(context, attrs);

setPaint(context, attrs);

}

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

super(context, attrs, defStyleAttr);

setPaint(context, attrs);

}

public void setPaint(Context context, AttributeSet attrs){

// 将属性存储到TypedArray中

TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.MyAF);

mRectPaint = new Paint();

// 添加矩形画笔的基础颜色

mRectPaint.setColor(ta.getColor(R.styleable.MyAF_AFTopColor,

ContextCompat.getColor(context, R.color.top_color)));

// 添加矩形渐变色的上面部分

topColor=ta.getColor(R.styleable.MyAF_AFTopColor,

ContextCompat.getColor(context, R.color.top_color));

// 添加矩形渐变色的下面部分

downColor=ta.getColor(R.styleable.MyAF_AFDownColor,

ContextCompat.getColor(context, R.color.down_color));

// 设置矩形的数量

mRectCount=ta.getInt(R.styleable.MyAF_AFCount, 10);

// 设置重绘的时间间隔,也就是变化速度

mSpeed=ta.getInt(R.styleable.MyAF_AFSpeed, 300);

// 每个矩形的间隔

offset=ta.getInt(R.styleable.MyAF_AFOffset, 5);

// 回收TypeArray

ta.recycle();

}

@Override

protected void onSizeChanged(int w,int h,int oldW,int oldH) {

super.onSizeChanged(w, h, oldW, oldH);

// 渐变效果

LinearGradient mLinearGradient;

// 画布的宽

int mWidth;

// 获取画布的宽

mWidth = getWidth();

// 获取矩形的最大高度

mRectHeight = getHeight();

// 获取单个矩形的宽度(减去的部分为到右边界的间距)

mRectWidth = (mWidth-offset) / mRectCount;

// 实例化一个线性渐变

mLinearGradient = new LinearGradient(

0,

0,

mRectWidth,

mRectHeight,

topColor,

downColor,

Shader.TileMode.CLAMP

);

// 添加进画笔的着色器

mRectPaint.setShader(mLinearGradient);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

double mRandom;

float currentHeight;

for (int i = 0; i

// 由于只是简单的案例就不监听音频输入,随机模拟一些数字即可

mRandom = Math.random();

currentHeight = (float) (mRectHeight * mRandom);

// 矩形的绘制是从左边开始到上、右、下边(左右边距离左边画布边界的距离,上下边距离上边画布边界的距离)

canvas.drawRect(

(float) (mRectWidth * i + offset),

currentHeight,

(float) ( mRectWidth * (i + 1)),

mRectHeight,

mRectPaint

);

}

// 使得view延迟重绘

postInvalidateDelayed(mSpeed);

}

}

布局文件的完整代码:

xmlns:tools="http://schemas.android.com/tools"

xmlns:custom="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.example.afanalog.MainActivity">

android:layout_width="match_parent"

android:layout_height="match_parent"

custom:AFCount="15"

custom:AFDownColor="@color/down_color"

custom:AFSpeed="300"

custom:AFTopColor="@color/top_color"

custom:AFOffset="15"

/>

以上所述是小编给大家介绍的Android实现音频条形图效果(仿音频动画无监听音频输入),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 解决IDEA配置xml文件头报错的方法
    本文介绍了解决IDEA配置xml文件头报错的方法,包括了具体的解决方案和步骤。通过本文的指导,读者可以轻松解决这个问题并正常使用IDEA进行开发工作。 ... [详细]
author-avatar
牛奶姆姆_592
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有