Android语音声波控件 Android条形波控件
许久不来,冒个泡,发一个刚做的声音波动的View吧:
代码不多,没什么技术含量,权当给您省时间了,直接复制粘贴就能用,直接上代码:
SoundWavesView
/**
*语音通话的声波控件
*CreatedbyMr.LongFaceon2017/9/16.
*/
publicclassSoundWavesViewextendsView{
privateintmMini;//最短值
privateintmMax;//最大值
privateintmLineWidth;//每条声波的宽度
privateintmSoundNum=5;//声波的数量
privateintmSpac;//每条声波的中点
privateintmWidth,mHeight;//控件宽高
privatebooleanisRun=false;
privatePaintmPaint;
privateRectFmRectF;
privateListmSoundList=newArrayList<>();
privateHandlermHandler=newHandler();
privateRunnablemInvalidateRun=newRunnable(){
@Override
publicvoidrun(){
postInvalidate();
}
};
publicSoundWavesView(Contextcontext,@NullableAttributeSetattrs){
super(context,attrs);
mPaint=newPaint();
mPaint.setAntiAlias(true);
mPaint.setColor(getResources().getColor(R.color.color_red));
mPaint.setStyle(Paint.Style.FILL);
mRectF=newRectF();
}
@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
if(widthMeasureSpec>0&&heightMeasureSpec>0){
initParam();
}
}
privatevoidinitParam(){
mWidth=getWidth();
mHeight=getHeight();
mMini=(int)(mHeight*0.3f);
mMax=mHeight;
initLines();
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
for(inti=0;i0){
for(SoundLinesoundLine:mSoundList){
soundLine.start();
}
}
}else{
if(mSoundList!=null&&mSoundList.size()>0){
for(SoundLinesoundLine:mSoundList){
soundLine.stop();
}
}
}
}
}
publicvoidstart(){
if(!isRun){
isRun=true;
for(SoundLinesound:mSoundList){
sound.start();
}
postInvalidate();
}
}
publicvoidstop(){
if(isRun){
isRun=false;
for(SoundLinesound:mSoundList){
sound.stop();
}
}
}
privatevoidinitLines(){
mLineWidth=(int)(mWidth/mSoundNum*0.7f);
mSpac=mWidth/(mSoundNum-1);
mSoundList.clear();
chaos();
}
/**
*生成凌乱的
*/
privatevoidchaos(){
for(inti=0;i
SoundLine
/**
*语音音频波纹的单个音波属性
*CreatedbyMr.LongFaceon2017/9/16.
*/
publicclassSoundLineimplementsValueAnimator.AnimatorUpdateListener{
//低中高随机4挡
publicstaticfinalintSPEED_LOW=500;
publicstaticfinalintSPEED_MID=200;
publicstaticfinalintSPEED_HEI=0;
publicstaticfinalintSPEED_RAN=0;
privateRandommRandom;
privateValueAnimatormAnim;
publicintleft,right,top,bottom;
privateintmin,max;
publicSoundLine(intleft,intright,inttop,intbottom){
this.left=left;
this.right=right;
this.top=top;
this.bottom=bottom;
mRandom=newRandom();
initAnim();
}
privatevoidinitAnim(){
mAnim=ValueAnimator.ofFloat(0.0f,1.0f);
setMode(SPEED_MID);
mAnim.setRepeatCount(-1);
mAnim.setRepeatMode(ValueAnimator.REVERSE);
mAnim.addUpdateListener(this);
}
publicvoidsetMode(intmode){
if(mode==SPEED_RAN){
mode=mRandom.nextInt(400);
}
mAnim.setDuration(300+mode);
}
publicvoidstart(){
if(mAnim.isRunning()){
mAnim.end();
}
mAnim.start();
}
@Override
publicvoidonAnimationUpdate(ValueAnimatorvalueAnimator){
floatf=(float)valueAnimator.getAnimatedValue();
top=(int)(f*(max-min)/2);
bottom=max-top;
}
publicvoidsetBorder(intmin,intmax){
this.min=min;
this.max=max;
}
publicvoidstop(){
mAnim.end();
mAnim.cancel();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。