Android语音声波控件 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<SoundLine> 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 , 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 , 0 , 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 , right , 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(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。