android语音插件,Android语音声波控件 Android条形波控件

许久不来,冒个泡,发一个刚做的声音波动的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 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,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,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,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();

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值