您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Android中語音聲波控件以及條形波控件怎么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Android中語音聲波控件以及條形波控件怎么用”這篇文章吧。
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(); } }
以上是“Android中語音聲波控件以及條形波控件怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。