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;i 0){ 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(); } }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。